我有一个第三方应用程序引用的API DLL。
其中一些应用程序在更新方面想要两种方式。1)我想要最新的东西2)不要经常更新我的直接二进制文件
有一种想法是将DLL移动到GAC中,并编写另一个DLL,它只是GAC中DLL的包装器(然后第三方应用程序会引用它)。这允许在GAC中更新业务逻辑(频繁更改的部分),并且只需要在新函数可用时更新包装器DLL。
GAC旨在保留版本化的DLL。因此包装器DLL将具有对API DLL的特定版本的引用。更新GAC DLL,使得对它的引用不会中断,但二进制内容不同,这有多难?
这就像在更新时不更改GAC DLL版本一样简单吗?
谢谢。
发布于 2010-08-23 21:26:30
您可以创建更新的程序集,对其进行签名并将其推送到GAC,以便引用此程序集的应用程序不会注意到差异。您需要指定版本号的所有部分(即AasemblyInfo.cs文件中的版本号为1.2.3.4,而不是1.2.3.* ),并使用相同的sn密钥。那么特定于版本的引用就不会被破坏。您将能够根据需要更新您的DLL。
发布于 2010-08-23 20:31:57
更新GAC,使得对它的引用不会中断,但二进制内容不同,这有多难?
你不能直接这么做。您只能将已签名的DLL放入GAC。当您根据已签名的DLL构建应用程序时,编译器会获取DLL内容的哈希并将其放入应用程序中。当.NET运行时加载应用程序时,它会根据DLL的真实副本检查此哈希。如果此DLL与您用来构建的DLL不匹配,.NET将抛出异常。
解决此问题的方法是:
实际上,绑定重定向是这样说的:“如果您正在寻找版本号在1.x到1.y之间的DLL,请改为查看版本1.z”。
编辑:有ways round the .NET strong name integrity check,但我建议在尝试绕过它之前,先围绕标准的强名称机制来设计应用程序。
发布于 2010-08-23 21:35:32
我使用Windows Installer将程序集部署到GAC。从服务的角度来看,重要的是要了解以下各项之间的区别:
AssemblyVersion
和
AssemblyFileVersion
前者被认为是强名称契约/绑定的一部分,而后者不是。此外,Windows Installer在升级期间决定是否覆盖文件时会考虑后者。
底线:如果您对程序集所做的更改没有破坏接口或导致任何行为回归,那么您可以保持AssemblyVersion不变,并增加AssemblyFileVersion并重新部署。
这就是.NET框架服务包的工作方式,因为微软必须能够在不破坏具有现有SN引用的应用程序的情况下为基类库提供服务。
https://stackoverflow.com/questions/3547457
复制相似问题