首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >更新GAC中的DLL

更新GAC中的DLL
EN

Stack Overflow用户
提问于 2010-08-23 20:21:51
回答 4查看 10.6K关注 0票数 2

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

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

有一种想法是将DLL移动到GAC中,并编写另一个DLL,它只是GAC中DLL的包装器(然后第三方应用程序会引用它)。这允许在GAC中更新业务逻辑(频繁更改的部分),并且只需要在新函数可用时更新包装器DLL。

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

这就像在更新时不更改GAC DLL版本一样简单吗?

谢谢。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-08-23 21:26:30

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

票数 2
EN

Stack Overflow用户

发布于 2010-08-23 20:31:57

更新GAC,使得对它的引用不会中断,但二进制内容不同,这有多难?

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

解决此问题的方法是:

  1. 为您的GAC设置了一个版本编号方案。这可以像在进行构建时总是递增版本号一样简单。
  2. 在app.config中,add a element

实际上,绑定重定向是这样说的:“如果您正在寻找版本号在1.x到1.y之间的DLL,请改为查看版本1.z”。

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

票数 3
EN

Stack Overflow用户

发布于 2010-08-23 21:35:32

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

AssemblyVersion

AssemblyFileVersion

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

底线:如果您对程序集所做的更改没有破坏接口或导致任何行为回归,那么您可以保持AssemblyVersion不变,并增加AssemblyFileVersion并重新部署。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3547457

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档