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

使用带通配符的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 17:45:12