使用带通配符的AssemblyVersion加载签名WPF程序集时出现FileLoadException
问题原因与解决方案
这不是环境Bug,是签名程序集使用版本通配符时的预期行为,根源在于.NET的强名称程序集绑定机制:
核心原因
- 签名程序集的强名称由名称、版本、公钥令牌、区域性组成,版本是强名称的关键判定部分。
- 使用
[assembly: AssemblyVersion("1.5.*")]时,编译器会自动生成版本号后两位(格式为[主版本].[次版本].[编译日期].[编译时间]),每次编译都会生成全新版本号。 - WPF编译XAML时,会将引用的签名程序集精确版本号嵌入到生成的程序集中。运行时加载的程序集版本(新编译的自动版本)与XAML中记录的版本不一致时,CLR会判定强名称不匹配,抛出
FileLoadException(错误码0x80131040)。 - 使用固定版本
[assembly: AssemblyVersion("1.5")]时,编译和运行时的程序集版本完全一致,因此不会触发版本不匹配问题。
可行解决方案
1. 固定AssemblyVersion版本号
直接放弃版本通配符,使用固定版本号,确保编译和运行时版本一致:
[assembly: AssemblyVersion("1.5.0.0")]
适合需要严格版本控制、避免版本绑定问题的场景。
2. 分离AssemblyVersion与AssemblyFileVersion
保留自动更新的文件版本,同时固定强名称版本:
[assembly: AssemblyVersion("1.5.0.0")] // 强名称版本固定 [assembly: AssemblyFileVersion("1.5.*")] // 文件版本自动生成
既可以让文件版本随编译自动更新,又不会破坏强名称的版本一致性,避免加载异常。
3. 添加程序集绑定重定向
在应用程序的配置文件(App.config)中添加绑定重定向,让CLR忽略版本差异,加载指定版本的程序集:
<configuration> <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="Projectname" publicKeyToken="f619059777d70c90" culture="neutral"/> <!-- 匹配所有旧版本,重定向到最新版本 --> <bindingRedirect oldVersion="0.0.0.0-99.9.9.9" newVersion="1.5.8615.20370"/> </dependentAssembly> </assemblyBinding> </runtime> </configuration>
注意:每次编译生成新的版本号后,需要同步更新newVersion的值;部分环境支持在newVersion中使用通配符,但兼容性有限。
内容的提问来源于stack exchange,提问作者cb9980
相关产品推荐
相关产品推荐

