【问题标题】:Dll in both the bin and the gac, which one gets used?bin 和 gac 中的 dll,使用哪个?
【发布时间】:2010-11-02 03:23:52
【问题描述】:

我们有一个 Web 应用程序部署到许多网站,只需要更改前端,共享的后端部分在 GAC 中有它的 DLL,因此我们只需更新一个 dll,所有网站都会获得更新。

有没有办法用 /bin 文件夹中的 DLL 覆盖 GAC,以便在新功能发布之前对其进行测试?

【问题讨论】:

    标签: asp.net deployment gac bin


    【解决方案1】:

    如果它与引用的 DLL 具有相同的版本号,则使用 GAC。

    如果您增加版本号,请参考新版本号重建网站,将新版本放在 /bin 目录中,然后将使用该 DLL。

    如果您不想更改版本号,那就太不走运了。

    当 .NET 加载强命名程序集时,首先它会尝试确定要使用的版本号。它首先通过引用执行此操作,然后查找publisher policies,然后在配置文件中查找binding redirects

    完成此操作后,它会在 GAC 中查找程序集,然后在任何 codebase specified 中查找,然后它会为 DLL 探测各种文件系统文件夹。如果在其中任何一个步骤中找到正确的版本程序集,它就会停止。

    如果您不更改强命名程序集的版本号,.NET 将在 GAC 中找到原始程序集并停止查找。请注意,因为它会在找到一个时停止,并且因为首先在 GAC 中查找,所以为您的程序集指定一个代码库将没有用,除非您还指定一个新的版本号。

    【讨论】:

    • 我理解正确吗?如果版本 1.0.0.0 在 GAC 中,但我使用版本 1.0.0.1 编译并将 1.0.0.1 放在我的 BIN 中,则 GAC 将被忽略并使用 BIN。如果我从我的 BIN 中删除 .dll,那么即使我使用 1.0.0.1 编译,也会使用 GAC 中的 1.0.0.0?
    • 没有。如果您针对强名称程序集进行编译,它将需要确切的版本号,除非有发布者策略或绑定重定向可用。
    • 发布者策略和绑定重定向允许版本 # 重定向,因此如果您的程序是针对 1.0.0.0 编译的并且有一个绑定重定向或发布者策略指定 1.0.0.1,那么它将成为它的版本寻找。
    • 一旦版本重定向完成,程序集加载器(融合)会探测程序集的各个位置。如果找不到正确的版本,则会出现异常。
    • 所以在你的情况下,你是针对 1.0.0.1 编译的。如果它找不到那个版本(不管它在哪里),你就会得到一个异常。
    【解决方案2】:

    我已经能够使用<codebase>Element 使用\bin 文件夹中的程序集覆盖GAC。

    通过在我的 web.config 文件中指定 <codebase version="1.2.3.4" href="/bin/MyAssembly.dll" />,我可以告诉我的应用程序使用此版本,而不是 GAC 中指定的版本。

    您可能还想查看<probing>Element 以指定装配位置?

    【讨论】:

    • 您应该仔细检查您的 dll 是否已签名。 GAC 优先于代码库和探测。一旦它在 GAC 中找到签名版本,它就会停止。我用 4.0 对此进行了测试,MSDN 文档是准确的,首先是 BindingRedirect,然后是 GAC,然后是 CodeBase,然后是 Probe for StrongName 程序集
    • 这仅在使用的程序集版本高于 GAC 中的程序集版本时才有效。正如前面的评论所说,如果版本号与 GAC 中的程序集相同,则您不能“​​覆盖” GAC 决议。 GAC 优先考虑。见”How the Runtime Locates Assemblies”
    【解决方案3】:

    我想我可能会说与 Adam Sills 相同的想法,但为了我的理解重新措辞。通过我自己的测试,看起来是这样的:

    • 如果您的应用是使用 1.0.0.0 版本编译的,并且 GAC 中包含 1.0.0.1,那么您可以省略 /bin 中的 .dll。
    • 如果您的应用是使用 1.0.0.1 版本编译的,并且 1.0.0.0 在 GAC 中,那么您必须将 .dll 放在您的 /bin 中以忽略 GAC。如果 GAC 版本比您的应用所需的版本旧,则会发生错误,除非您在 /bin 中包含较新的版本。

    我希望这是正确的......

    【讨论】:

    • .NET Framework 将不会自动执行强命名程序集的版本重定向,至少从 .NET 3.5(.NET 2.0 运行时)开始。理论上 .NET 4 可以改变规则,但我对此表示怀疑。
    • 谢谢!我现在明白了为什么我的测试适用于不同的版本。我认为强名称只是您注册它的关键。但我实际上在 GAC 1.0.0.0 和 1.0.0.1 中注册了两个程序集,它们都使用相同的公钥令牌。我以为如果我使用相同的密钥,1.0.0.1 将取代 1.0.0.0。但情况似乎并非如此。
      感谢@Adam 的帮助!
    【解决方案4】:

    您可以使用 Windows 软件开发工具包 (SDK) 中包含的程序集绑定日志查看器 (Fuslogvw.exe) 查看日志文件中的绑定信息。

    s

    【讨论】:

      猜你喜欢
      • 2010-10-05
      • 2013-10-25
      • 2010-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-04
      相关资源
      最近更新 更多