繁体   English   中英

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

[英]How to prevent a .NET application from loading/referencing an assembly from the GAC?

我可以配置.NET应用程序(在Visual Studio中进行设置),使其引用“本地”程序集(不在GAC中 )而不是GAC内的程序集,尽管这两个程序集具有相同的名称和相同的版本?

如果两个程序集都是全名(带符号),则CLR将始终从GAC加载。

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

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

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

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

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

如该文章稍后所述:

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

因此,如果您有能力从本地程序集中删除签名,则应用程序将使用它代替GAC中的签名。

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

Scott Hanselman的这篇博客文章还对绑定过程进行了很好的概述。

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

您还应该考虑可以像在此描述的那样修改已编译程序集的版本号: 更改已编译.NET程序集中的程序集版本

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

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

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

小号

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM