【问题标题】:How to prevent a .NET application from loading/referencing an assembly from the GAC?如何防止 .NET 应用程序从 GAC 加载/引用程序集?
【发布时间】:2010-12-09 01:50:30
【问题描述】:

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

【问题讨论】:

标签: c# .net assemblies gac


【解决方案1】:

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

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

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

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

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

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

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

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

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

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

This blog entry from Scott Hanselman 还提供了一个很好的绑定过程概览。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      您可以使用ilmerge 并将程序集合并到一个库中以绕过它。

      【讨论】:

        【解决方案4】:

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

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

        s

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-10-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多