繁体   English   中英

更新GAC中的DLL

[英]Updating a DLL in the GAC

我有一个API DLL,几个第三方应用程序引用。

其中一些应用程序在更新方面需要两种方式。 1)我想要最新的东西2)不要经常更新我的直接二进制文件

曾经有想过将DLL移动到GAC中并编写另一个DLL,它只是GAC中DLL的包装器(第三方应用程序随后会引用它)。 这允许在GAC中更新业务逻辑(经常更改的部分),并且只有在新功能可用时才需要更新包装DLL。

GAC旨在保留版本化的DLL。 因此,包装器DLL将引用API DLL的特定版本。 更新GAC DLL以使其对它的引用不会中断但二进制内容不同有多困难?

这更简单到更新时不更改GAC DLL版本吗?

谢谢。

更新GAC DLL以使其对它的引用不会中断但二进制内容不同有多困难?

你不能直接这样做。 您只能将已签名的DLL放入GAC。 当您针对已签名的DLL构建应用程序时,编译器会获取DLL内容的哈希并将其放入应用程序中。 当.NET运行时加载应用程序时,它会根据DLL的真实副本检查此哈希。 如果此DLL与您构建的DLL不匹配,则.NET会引发异常。

解决这个问题的方法是:

  1. 为您的GAC DLL安装版本编号方案。 这可以像在执行构建时一直增加版本号一样简单。
  2. 在app.config中,添加<bindingRedirect>元素

实际上,绑定重定向表示,“如果您正在寻找版本号在1.x到1.y范围内的DLL,请查看版本1.z”。

编辑:有很多方法围绕.NET强名称完整性检查 ,但我建议您在尝试绕过它之前围绕标准强名称机制设计应用程序。

您可以创建更新的程序集,对其进行签名并将其推送到GAC,以便引用此程序集的应用程序不会注意到差异。 您需要指定版本号的所有部分(即版本号为1.2.3.4而不是AasemblyInfo.cs文件中的1.2.3。*)并使用相同的sn键。 然后,特定于版本的引用将不会被破坏。 并且您将能够根据需要更新DLL。

我使用Windows Installer将我的程序集部署到GAC。 从服务的角度来看,了解以下两者之间的区别非常重要:

[的AssemblyVersion]

[的AssemblyFileVersion]

前者被认为是强名称合同/绑定的一部分,而后者则不是。 此外,Windows Installer在决定是否在升级期间覆盖文件时考虑后者。

Botton line:如果对程序集的更改不会破坏接口或导致任何行为回归,则可以保持AssemblyVersion相同并增加AssemblyFileVersion并重新部署。

这就是.NET Framework Service Pack的工作方式,因为Microsoft必须能够在不破坏具有现有SN引用的应用程序的情况下为基类库提供服务。

引用可以包括版本信息或引用任何可用的版本。 这由引用您的DLL的应用程序的作者确定。 当然,您可以将更新的DLL发布为与GAC中的版本相同,但版本控制的全部内容是让所有各方正确处理更新。 所以你可能需要优化你的任务。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM