.net - 2 个项目是否可以引用同一程序集的 2 个不同版本,一个来自 GAC,另一个来自 aap\bin 文件夹?

标签 .net .net-assembly gac

我的类库项目(8 年前开发)需要程序集 A。尽管Assembly A 具有强名称,但开发人员随后将它们保存在本地文件夹中并从那里引用,以便程序集始终位于应用程序的bin 文件夹中。我想,这样做是为了消除一些部署问题。

我的类库项目被我们的一位客户使用。

新版本的Assembly A 已发布,我们客户的应用程序希望使用该版本。他们没有引用 GAC 的新版本;他们有自己的副本!现在,当他们使用最新版本时,他们会收到错误,因为他们引用的我的类库项目程序集需要旧版本的程序集 A。

  1. 如何解决这个特定问题?
  2. 如果我将项目更改为开始引用 GAC 中的程序集 A(当他们仍使用本地副本时),客户是否会面临同样的问题?
  3. 新版本的Assembly A 有一些重大更改。如果客户和我都开始使用 GAC 提供的程序集所需版本,我们的问题会得到解决吗?
  4. 如果出现较新版本的 Assembly A,并且该版本转到 GAC,那么无论我们在两个项目中引用哪个版本,.NET 都会从 GAC 加载该版本吗?

最佳答案

GAC 是一个部署细节,在您构建项目时涉及。每当 CLR 需要加载程序集并且它具有强名称时,它就会首先在 GAC 中查找。接下来是应用程序的探测路径。当它存储在 GAC 中时,CLR 就可以匹配所需的版本。如果不是,则 CLR 一旦发现与程序集名称匹配,就会停止搜索探测路径中的目录。如果发现程序集不是正确的版本,则 Kaboom。

由于您的客户端更喜欢将新版本存储在探测路径中,因此他们永远无法加载旧版本。因此,他们必须将旧版本的程序集放入 GAC 中。这并不是唯一可能出错的事情,如果您在库的公共(public)方法中公开程序集中的任何类型,它们就无法正确调用您的代码。

显然,通过更新您的库以使用新版本,您将不会给他们带来那么大的麻烦。

关于.net - 2 个项目是否可以引用同一程序集的 2 个不同版本,一个来自 GAC,另一个来自 aap\bin 文件夹?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25306896/

相关文章:

.net - 我在哪里可以找到 GACUtil?

.net - JSON 和 SOAP WCF 服务?

c# - DataGridView 单元格编辑

c# - 在网站之间共享 cookie

.net-assembly - 如何将 DNU WRAP 用于不在 ASP.Net 项目解决方案中的项目

c# - 使用 AppDomain.AssemblyResolve 事件

javascript - 如何将 .js 文件添加到 ASP.NET 项目中的程序集

visual-studio-2010 - 在visual studio 2010中将带有资源文件的dll部署到sharepoint 2010

c# - gRPC 间歇性地具有高延迟

c# - ViewResult同时存在于 "System.Web.Mvc.dll"和 "System.Web.Mvc.dll"中