如果构建和修订号发生变化,我对 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 引用才能引用新版本。
关于c# - 如果仅更改内部版本号或修订版号,则定位 GAC 程序集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27254704/