如果两个程序集都具有强名称(已签名),则CLR将始终从GAC加载。 以下是运行库用于解析程序集引用(从How the Runtime Locates Assemblies)的步骤: 1.通过检查适用的配置文件(包括应用程序配置文件、发行者策略文件和计算机配置文件)来确定正确的程序集版本。如果配置文件位于远程计算机上,则运行库必须首先找到并下载应用程序配置文件。 1.检查以前是否绑定过程序集名称,如果是,则使用以前加载的程序集。如果以前加载程序集的请求失败,则请求将立即失败,而不尝试加载程序集。 1.检查全局程序集缓存。如果在其中找到程序集,则运行库使用此程序集。 1.组件用探针(......省略了一些材料......) 如该条后面所述: 不对没有强名称的程序集进行版本检查,运行库也不在全局程序集缓存中检查没有强名称的程序集。 因此,如果您可以从本地程序集中删除签名,则应用程序将使用它而不是GAC中的签名。 有关运行时绑定机制的更多详细信息,请参见Suzanne Cook's blog。 This blog entry from Scott Hanselman还提供了绑定过程的一个很好的概述。
4条答案
按热度按时间svdrlsy41#
如果两个程序集都具有强名称(已签名),则CLR将始终从GAC加载。
以下是运行库用于解析程序集引用(从How the Runtime Locates Assemblies)的步骤:
1.通过检查适用的配置文件(包括应用程序配置文件、发行者策略文件和计算机配置文件)来确定正确的程序集版本。如果配置文件位于远程计算机上,则运行库必须首先找到并下载应用程序配置文件。
1.检查以前是否绑定过程序集名称,如果是,则使用以前加载的程序集。如果以前加载程序集的请求失败,则请求将立即失败,而不尝试加载程序集。
1.检查全局程序集缓存。如果在其中找到程序集,则运行库使用此程序集。
1.组件用探针(......省略了一些材料......)
如该条后面所述:
不对没有强名称的程序集进行版本检查,运行库也不在全局程序集缓存中检查没有强名称的程序集。
因此,如果您可以从本地程序集中删除签名,则应用程序将使用它而不是GAC中的签名。
有关运行时绑定机制的更多详细信息,请参见Suzanne Cook's blog。
This blog entry from Scott Hanselman还提供了绑定过程的一个很好的概述。
1hdlvixo2#
如果可以更改本地dll的版本号,则可以使用oldVersion属性进行dll版本重定向。可以为本地程序集使用强名称:请查看此页面:http://msdn.microsoft.com/en-us/library/7wd6ex19.aspx
此外,您还应该考虑到可以修改编译程序集的版本号,如下所述:Change Assembly Version in a compiled .NET assembly
flseospp3#
您可以使用ilmerge并将程序集合并到单个库中来解决这个问题。
sulc1iza4#
若要成功部署.NET Framework应用程序,您必须了解公共语言运行库如何查找并绑定到组成应用程序的程序集。默认情况下,运行库尝试与生成应用程序时使用的程序集的确切版本绑定。配置文件设置可以重写此默认行为。
可以使用程序集绑定日志查看器(Fuslogvw.exe)查看日志文件中的绑定信息,该查看器包含在Windows软件开发工具包(SDK)中。