You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将自动生成的程序集版本同步至BepInEx插件版本属性?

解决BepInEx插件版本与程序集自动版本同步的问题

你遇到的核心问题是:[BepInPlugin]属性要求版本是常量字符串,直接写"2.1.*"会被当成字面量,而BepInEx不识别带通配符的版本号。下面给你两个靠谱的实现方案:

方案一:用MSBuild编译前生成版本常量文件

这是最稳定的做法,让编译过程自动把程序集的实际版本号写入一个常量类,供插件属性调用:

  1. 修改你的项目文件(.csproj),添加以下MSBuild任务:
<Target Name="GeneratePluginVersion" BeforeTargets="CoreCompile">
  <!-- 获取编译中生成的程序集版本 -->
  <GetAssemblyIdentity AssemblyFiles="$(IntermediateOutputPath)$(TargetFileName)">
    <Output TaskParameter="Assemblies" ItemName="AssemblyIdentities" />
  </GetAssemblyIdentity>
  <!-- 解析版本号为标准格式 -->
  <PropertyGroup>
    <PluginVersion>$([System.Version]::Parse(%(AssemblyIdentities.Version)))</PluginVersion>
  </PropertyGroup>
  <!-- 生成包含版本常量的代码文件 -->
  <WriteLinesToFile File="$(IntermediateOutputPath)GeneratedPluginVersion.cs" Lines="namespace YourPluginNamespace;
public static class PluginVersionInfo
{
    public const string Version = &quot;$(PluginVersion)&quot;;
}" Overwrite="true" />
</Target>

注意把YourPluginNamespace替换成你插件实际的命名空间

  1. 在插件类里引用这个自动生成的常量:
[BepInPlugin("com.my.plugin", "My Plugin", PluginVersionInfo.Version)]
public class MyPlugin : BaseUnityPlugin
{
    // 插件逻辑
}

编译时MSBuild会先完成程序集版本的自动生成,再把实际版本号写入GeneratedPluginVersion.cs,最终插件属性拿到的是类似"2.1.20240520.1234"的合法版本号,BepInEx就能正常加载了。

方案二:直接在项目文件中统一管理版本号

如果不想生成额外文件,也可以把版本号定义在项目文件里,同时同步给AssemblyInfo和插件属性:

  1. 在.csproj里定义版本变量:
<PropertyGroup>
  <AssemblyVersion>2.1.*</AssemblyVersion>
  <FileVersion>$(AssemblyVersion)</FileVersion>
  <!-- 模拟VS自动生成*版本的逻辑:Build是2000年1月1日到今天的天数,Revision是当天秒数除以2取整 -->
  <PluginVersion>$([System.String]::Format("{0}.{1}.{2}.{3}", $([System.Version]::Parse($(AssemblyVersion)).Major), $([System.Version]::Parse($(AssemblyVersion)).Minor), $([System.DateTime]::Now.Subtract($([System.DateTime]::Parse("2000-01-01"))).TotalDays), $([System.Math]::Floor($([System.DateTime]::Now.TimeOfDay.TotalSeconds)/2))))</PluginVersion>
</PropertyGroup>
  1. 删掉AssemblyInfo里的[assembly: AssemblyVersion],让项目文件控制版本。

  2. 用预编译宏把PluginVersion传入代码:
    在.csproj里添加:

<PropertyGroup>
  <DefineConstants>PLUGIN_VERSION=$(PluginVersion)</DefineConstants>
</PropertyGroup>

然后在插件类里用:

[BepInPlugin("com.my.plugin", "My Plugin", PLUGIN_VERSION)]
public class MyPlugin : BaseUnityPlugin
{
    // ...
}

这个方案不需要生成额外文件,但版本解析逻辑需要手动对齐VS的自动生成规则,适合喜欢精简配置的场景。

为什么之前的模板方案失效?

你参照模板用MyPluginInfo读取值的方式,本质是把"2.1.*"直接作为字符串传递给了[BepInPlugin]——VS只会在处理AssemblyVersion属性时替换通配符,普通字符串里的*不会被解析,所以插件加载时BepInEx会判定版本格式非法。

内容的提问来源于stack exchange,提问作者Lacyway

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 19:32:33