如何防止.NET应用程序从GAC加载/引用程序集?

时间:2009-10-22 12:28:28

标签: c# .net assemblies gac

我是否可以某种方式配置.NET应用程序(Visual Studio中的设置),它引用“本地”程序集(不在GAC中)而不是GAC中的程序集,尽管两个程序集都具有相同的名称和版本相同?

4 个答案:

答案 0 :(得分:24)

如果两个程序集都是强名称(签名),则CLR将始终从GAC加载。

以下是运行时用于解析程序集引用的步骤(来自How the Runtime Locates Assemblies):

  
      
  1. 通过检查适用的方法确定正确的装配版本   配置文件,包括   应用配置文件,   发布者策略文件和计算机   配置文件。如果   配置文件位于   远程机器,运行时必须   找到并下载该应用程序   配置文件首先。

  2.   
  3. 检查程序集名称是否已绑定到之前,如果是,   使用以前加载的程序集。   如果先前的请求加载了   程序集失败,请求失败   立即不试图加载   集会。

  4.   
  5. 检查全局程序集缓存。如果在那里找到组件,那么   运行时使用此程序集。

  6.   
  7. 装配探测器(...省略了一些材料......)

  8.   

正如同一篇文章后面所述:

  

没有强名称的程序集没有版本检查,运行时也没有   检查全局程序集缓存中没有强名称的程序集。

因此,如果您能够从本地程序集中删除签名,则应用程序将使用它而不是GAC中的签名。

有关运行时绑定机制的详细信息,请参阅Suzanne Cook's blog

This blog entry from Scott Hanselman还提供了对绑定过程的精彩概述。

答案 1 :(得分:1)

如果您可以更改本地dll的版本号,则可以使用oldVersion属性使用dll版本重定向。您可以为本地程序集使用强名称: 请看这个页面: http://msdn.microsoft.com/en-us/library/7wd6ex19.aspx

此外,您应该考虑可以修改已编译程序集的版本号,如下所述: Change Assembly Version in a compiled .NET assembly

答案 2 :(得分:1)

您可以使用ilmerge并将程序集合并到一个库中来解决它。

答案 3 :(得分:-2)

要成功部署.NET Framework应用程序,您必须了解公共语言运行库如何定位和绑定到组成应用程序的程序集。默认情况下,运行时尝试使用构建应用程序的程序集的确切版本进行绑定。配置文件设置可以覆盖此默认行为。

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

取值