更新GAC中的DLL

时间:2010-08-23 12:21:51

标签: .net api dll gac

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

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

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

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

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

感谢。

4 个答案:

答案 0 :(得分:3)

  

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

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

解决这个问题的方法是:

  1. 为您的GAC DLL安装版本编号方案。这可以像在执行构建时一直增加版本号一样简单。
  2. 在您的app.config中,添加<bindingRedirect>元素
  3. 实际上,绑定重定向表示,“如果您正在寻找版本号在1.x到1.y范围内的DLL,请查看版本1.z”。

    编辑:ways round the .NET strong name integrity check,但我建议您在尝试绕过它之前围绕标准强名称机制设计应用程序。

答案 1 :(得分:2)

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

答案 2 :(得分:2)

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

[的AssemblyVersion]

[的AssemblyFileVersion]

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

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

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

答案 3 :(得分:1)

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