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

Flo*_*Flo 35 .net c# assemblies gac

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

Jef*_*nal 24

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

以下是运行时用于解析程序集引用的步骤(来自运行时如何定位程序集):

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

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

  3. 检查全局程序集缓存.如果在那里找到程序集,则运行时使用此程序集.

  4. 装配探头(...省略了一些材料......)

如同一篇文章后面所述:

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

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

有关运行时绑定机制的详细信息,请参阅Suzanne Cook的博客.

Scott Hanselman的博客文章也提供了绑定过程的精彩概述.