bin和gac中的dll,哪一个被使用?

时间:2009-06-11 13:40:18

标签: asp.net deployment gac bin

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

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

4 个答案:

答案 0 :(得分:79)

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

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

如果您不想更改版本号,那么您将非常幸运。

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

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

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

答案 1 :(得分:11)

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

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

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

答案 2 :(得分:2)

我想我可能会像亚当·西尔斯那样说出来,但为了我的理解而重新措辞。通过我自己的测试,看起来就是这样:

  • 如果您的应用程序是使用版本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中包含较新版本。

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

答案 3 :(得分:0)

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

取值