一点背景:我们有一个使用3个核心DLL的应用程序,这些DLL由应用程序的不同部分引用。这三个DLL都在GAC中。在我们的测试环境中,我们有3个测试网站(相同的网站,不同的版本),它们都使用GAC中的DLL,以及bin \中的产品特定DLL。
我们遇到其中一个产品需要更新这些核心DLL的情况,但我们不想将程序集放在GAC中,因为我们的特定测试网站是唯一引用这些DLL的网站。我们知道我们可以在GAC中放置多个版本的程序集,但这与此特定问题无关,因为我们选择不这样做。
我自己的研究显示,一群人对他们的答案看起来非常有信心,但大多数人都不同:运行时定位组件。大多数人认为GAC优先,根据我自己的经验,情况就是这样。其他人说,只要程序集没有强烈命名,它就会更喜欢bin \而不是GAC,根据我的经验,这是不正确的。
我发现了这篇MS文章:
How the Runtime Locates Assemblies
描述了CLR用于确定要绑定到哪些程序集的步骤。事实证明这并不像预期的那样。所有这些都可能是一个环境问题(我实际上会倾向于这样)。
我还发现this这个问题与我读过的其他问题类似,但不一定是我需要的答案
我终于找到了一个更喜欢bin \ over GAC的解决方法。我在web.config中使用了标记。我曾经在SO和其他网站上看到过这种建议并且间歇性的成功,并且很高兴它在我的案例中起作用。
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="dll1" publicKeyToken="ourToken"
culture="neutral" />
<bindingRedirect oldVersion="5.0.0.0" newVersion="5.0.1.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
版本5.0.1.0位于我的bin \文件夹中。 5.0.0.0在GAC中。最后,对于我的问题,CLR如何知道,即使5.0.1.0不是GAC中的程序集,它需要查看bin \以找到要绑定的正确程序集?在.config中添加标记之前,无论项目是使用什么程序集版本构建的(5.0.1.0),应用程序仍然更喜欢GAC(5.0.0.0)中的旧版本DLL。
我无法找到任何关于此的文档,很可能是因为我不知道如何将这5段解释分解为搜索查询。任何参考资料都会受到赞赏,或者甚至可能对上面引用的文章进行澄清,这样我就可以理解为什么CLR正在做它正在做的事情。
答案 0 :(得分:2)
首先总是查看GAC,搜索程序集的特定名称+版本。如果没有找到,那么它会在探测路径中寻找组件。并且仅查看程序集的特定名称。当它找到一个时,它会检查版本是否匹配。 Kaboom如果没有。
所以最初它总是寻找“dll1”+ 5.0.0.0并在GAC中找到它。无需去其他地方寻找。
更改.config文件后,它现在在GAC中查找“dll1”+ 5.0.1.0。并没有找到它。所以现在寻找“dll1”并在你的bin目录中找到它。版本匹配,所以很高兴。