我的类库项目(8 年前开发)需要程序集 A
。尽管Assembly A
具有强名称,但开发人员随后将它们保存在本地文件夹中并从那里引用,以便程序集始终位于应用程序的bin
文件夹中。我想,这样做是为了消除一些部署问题。
我的类库项目被我们的一位客户使用。
新版本的Assembly A
已发布,我们客户的应用程序希望使用该版本。他们没有引用 GAC 的新版本;他们有自己的副本!现在,当他们使用最新版本时,他们会收到错误,因为他们引用的我的类库项目程序集需要旧版本的程序集 A。
- 如何解决这个特定问题?
- 如果我将项目更改为开始引用 GAC 中的
程序集 A
(当他们仍使用本地副本时),客户是否会面临同样的问题? - 新版本的
Assembly A
有一些重大更改。如果客户和我都开始使用 GAC 提供的程序集所需版本,我们的问题会得到解决吗? - 如果出现较新版本的
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/