装满垃圾箱和装卸箱中的DLL都被使用了?


73

我们有一个Web应用程序,仅进行前端更改即可部署到许多网站,共享的后端部分在GAC中具有DLL,因此我们只需要更新一个DLL,所有站点都可以获得更新。

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

Answers:


84

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

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

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

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

完成此操作后,它将在GAC中查找组装,然后在指定的任何代码库中寻找,然后为DLL探索各种文件系统文件夹。如果在上述任何一个步骤中找到正确的版本程序集,它将停止。

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


2
我理解这个正确吗?如果GAC中包含版本1.0.0.0,但我使用版本1.0.0.1进行了编译,并将1.0.0.1放在我的BIN中,则GAC将被忽略,并使用BIN。如果我从我的BIN中删除了.dll,那么即使我使用1.0.0.1进行了编译,仍将使用GAC中的1.0.0.0?
J.Hendrix

2
否。如果您使用强名称程序集进行编译,则将需要确切的版本号,除非有发布者策略或绑定重定向可用。
亚当·希尔斯

2
发布者策略和绑定重定向允许版本号重定向,因此,如果您的程序是针对1.0.0.0编译的,并且有一个绑定重定向或发布者策略指定1.0.0.1,则该版本将成为其查找的版本。
亚当·希尔斯

2
版本重定向完成后,程序集加载器(融合)将探查程序集的各个位置。如果找不到正确的版本,则会出现异常。
亚当·希尔斯

1
因此,就您而言,您是针对1.0.0.1进行编译的。如果找不到该版本(无论它在何处),都会出现异常。
亚当·希尔斯

11

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

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

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


7
您应该仔细检查您的dll是否已签名。GAC优先于代码库和探针。一旦在GAC中找到签名版本,它就会停止。我使用4.0进行了测试,MSDN文档是准确的,首先是BindingRedirect,然后是GAC,然后是CodeBase,然后是StrongName程序集的探针
CodeCowboyOrg 2015年

仅当使用的程序集版本高于GAC中的程序集版本时,此方法才有效。如前一条评论所述,如果版本号与GAC中的程序集相同,则不能“替代” GAC分辨率。GAC具有优先权。参见“运行时如何定位程序集”
Kissaki,

2

我想我可能会说出与亚当·西尔斯(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中包括了较新的版本。

我希望这是正确的...


1
至少从.NET 3.5(.NET 2.0运行时)开始,.NET Framework不会自动对强命名程序集进行版本重定向。从理论上讲,.NET 4可以更改规则,但我对此表示怀疑。
亚当·希尔斯

1
谢谢!现在,我明白了为什么我的测试可以使用不同的版本。我以为这个强名只是您注册时所用的钥匙。但是我实际上在GAC 1.0.0.0和1.0.0.1中注册了两个具有相同公钥令牌的程序集。我以为如果使用相同的密钥,则1.0.0.1将替换1.0.0.0。但事实并非如此。<br>感谢@Adam为您提供帮助!
J.Hendrix

0

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

s

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.