74

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

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

4

4 回答 4

85

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

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

如果您不想更改版本号,那么您很不走运。

当 .NET 加载强命名程序集时,首先它会尝试确定要使用的版本号。它首先通过引用执行此操作,然后查找发布者策略,然后在配置文件中查找绑定重定向。

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

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

于 2009-06-11T14:16:19.890 回答
11

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

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

您可能还想查看<probing>用于指定装配位置的元素?

于 2011-04-05T04:05:39.780 回答
2

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

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

我希望这是正确的...

于 2010-02-03T22:06:02.537 回答
0

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

s

于 2010-04-29T19:34:00.063 回答