c# - 如果仅更改内部版本号或修订版号,则定位 GAC 程序集

标签 c# .net versioning .net-assembly gac

如果构建和修订号发生变化,我对 CLR 如何处理程序集绑定(bind)和从 GAC 加载有疑问。程序集有四个部分 [Major].[Minor].[Build].[Revision]。我知道如果 Major 和 Minor 发生变化,您需要发布者政策才能从 GAC 找到更新版本的程序集。如果仅更改内部版本号或修订号怎么办?在我的以下场景中,它不适用于构建和修订更新。

在我的应用程序中,我的程序集信息为 [1.0.*],因此 TFS 在每次构建时以增量方式构建具有 [1.0.5414.23455] 编号的程序集。每天 TFS 都会构建项目并生成带有递增构建和修订号的程序集。这是预期的行为,因为我在 AssemblyInfo 文件中指出了通配符 [1.0.*]。

现在,我有针对我的应用程序版本 [1.0.5414.23455] 构建的客户端应用程序。我正在使用安装程序将我的应用程序部署到 GAC。现在,如果 GAC 具有应用程序程序集版本 [1.0.5414.23455],则客户端应用程序可以正常工作,但如果我在 GAC 中安装更新版本(技术上没有任何改变,只是新的夜间构建)[1.0.5414.23456],客户端应用程序将不会加载此新版本.

我引用了一些 Microsoft 博客/文档,发现只要 Major 和 Minor 编号相同,客户端应用程序就应该能够从 GAC 加载程序集。从 GAC 定位程序集时,构建和修订号不是强制性检查。

内部版本号和修订版号的更改对从 GAC 定位程序集没有任何影响是否正确?

提前致谢。

最佳答案

为避免部署在 GAC 上的较新组件版本的编译复杂性,您可以在 web.config 或 app.config 中使用 bindingRedirect,例如:

 <runtime>
    <generatePublisherEvidence enabled="false" />
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
    <dependentAssembly>
        <assemblyIdentity name="MyComponent.Web.UI" publicKeyToken="121fae78165ba3d4" />
        <bindingRedirect oldVersion="1.0.5414.23455" newVersion="1.0.5414.23455" />
      </dependentAssembly> ...

请注意,oldVersion 属性也代表 range 版本以替换 oldVersion="1.0.0.35-1.0.1016.35" 和属性 newVersion 表示替换版本 newVersion="2.0.1205.35"

根据您的问题,为什么我们需要 bindingRedirect

程序集的依赖项是程序集元数据的一部分,您可以使用名为 gacutil 的东西(它是 .NET SDK 工具的一个工具部分)或像我在下面使用 .NET Reflector 所做的那样看到这一点.由于引用及其版本是程序集的一部分,因此需要编译或更改 app.config 引用才能引用新版本。

enter image description here

关于c# - 如果仅更改内部版本号或修订版号,则定位 GAC 程序集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27254704/

相关文章:

versioning - CouchDB 版本控制策略

java - Maven 和 GitHub 的版本编号/发布机制

mysql - 获取mysql行版本号?

c# - 使用聚合从 mongodb 中的 order by 和 group by 联合选择

c# - ASP.NET MVC UpdateModel 意外失败

c++ - C 是.NET 框架的一部分吗?

c# - 打印 RichTextBox

c# - Swashbuckle - 在 swagger 文档中将字符串视为枚举

c# - Unity - 如何使用 c++ dll?

c# - 为什么编译器不能推断此选择调用的类型?