【问题标题】:CLR Binds to the Correct Assembly with bindingRedirect, But How?CLR 使用 bindingRedirect 绑定到正确的程序集,但是如何?
【发布时间】:2013-04-01 16:41:14
【问题描述】:

一点背景知识:我们有一个应用程序使用 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 SO 问题与我读过的其他问题相似,但不一定是我需要的答案

我终于找到了一个比 GAC 更喜欢 bin\ 的解决方法。我在我们的 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 中。最后我的问题是,即使 5.0.1.0 不是 GAC 中的程序集,CLR 怎么知道它需要在 bin\ 中查找要绑定的正确程序集?在 .config 中添加标记之前,无论项目是使用什么程序集版本 (5.0.1.0) 构建的,应用程序仍然更喜欢 GAC (5.0.0.0) 中的旧版本 DLL。

我无法找到任何关于此的文档,很可能是因为我不知道如何将这 5 段解释分解为搜索查询。任何参考材料都将不胜感激,或者甚至可以澄清上面引用的文章,这样我就可以了解 CLR 为何会做它正在做的事情。

【问题讨论】:

    标签: .net web-config clr gac


    【解决方案1】:

    它只是总是首先在 GAC 中查找,搜索程序集的特定名称 + 版本。如果没有找到,那么它会在探测路径中寻找程序集。并且只查找程序集的特定 name。当它找到一个时,它会检查版本是否匹配。 Kaboom 如果没有。

    所以最初它总是寻找“dll1”+ 5.0.0.0 并在 GAC 中找到它。无需去别处寻找。

    更改 .config 文件后,它现在会在 GAC 中查找“dll1”+ 5.0.1.0。并没有在那里找到它。所以现在去寻找“dll1”并在你的bin目录中找到它。版本匹配所以很开心。

    【讨论】:

    • 有道理。我越来越觉得没有人真正对正在发生的事情有一个明确的答案。甚至 MS 的文档也与我所经历的不同。
    猜你喜欢
    • 2012-11-09
    • 1970-01-01
    • 1970-01-01
    • 2010-10-23
    • 1970-01-01
    • 1970-01-01
    • 2012-07-03
    • 1970-01-01
    相关资源
    最近更新 更多