如何将自动生成的程序集版本同步至BepInEx插件版本属性?
解决BepInEx插件版本与程序集自动版本同步的问题
你遇到的核心问题是:[BepInPlugin]属性要求版本是常量字符串,直接写"2.1.*"会被当成字面量,而BepInEx不识别带通配符的版本号。下面给你两个靠谱的实现方案:
方案一:用MSBuild编译前生成版本常量文件
这是最稳定的做法,让编译过程自动把程序集的实际版本号写入一个常量类,供插件属性调用:
- 修改你的项目文件(
.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 = "$(PluginVersion)"; }" Overwrite="true" /> </Target>
注意把YourPluginNamespace替换成你插件实际的命名空间
- 在插件类里引用这个自动生成的常量:
[BepInPlugin("com.my.plugin", "My Plugin", PluginVersionInfo.Version)] public class MyPlugin : BaseUnityPlugin { // 插件逻辑 }
编译时MSBuild会先完成程序集版本的自动生成,再把实际版本号写入GeneratedPluginVersion.cs,最终插件属性拿到的是类似"2.1.20240520.1234"的合法版本号,BepInEx就能正常加载了。
方案二:直接在项目文件中统一管理版本号
如果不想生成额外文件,也可以把版本号定义在项目文件里,同时同步给AssemblyInfo和插件属性:
- 在
.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>
删掉AssemblyInfo里的
[assembly: AssemblyVersion],让项目文件控制版本。用预编译宏把
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
相关产品推荐
相关产品推荐

