如何阻止某些程序集从GAC加载?

时间:2014-08-21 07:13:58

标签: .net assemblies gac

我在GAC中安装了一些第三方程序集。我正在开发一个使用其中一些程序集的ASP.NET。在开发机器中,如果组件不在bin文件夹中,则从GAC加载。如果bin文件夹中缺少程序集,则会出现这种情况,因为没有报告错误。但是,当应用程序部署在共享主机上时,如果bin文件夹中缺少程序集,则应用程序错误。

有没有办法强制应用程序不从GAC加载某些程序集,如果它在开发机器的bin文件夹中丢失则报告错误?

4 个答案:

答案 0 :(得分:0)

有理由,我想你已经知道解决方案是什么了。您只需将这些程序集放在Web应用程序的bin文件夹中,然后在web.config文件的必需部分中指定程序集名称即可。例如,如果它是您要在所有页面中注册的服务器控件,则将其添加到pages部分...

<pages styleSheetTheme="DefaultTheme" controlRenderingCompatibilityVersion="3.5" clientIDMode="AutoID">
      <controls>
        <add tagPrefix="telerik" namespace="Telerik.Web.UI" assembly="Telerik.Web.UI" />
      </controls>
</pages>

如果是自定义模块,则应在modules部分中指定...

<httpModules>
      <add name="PerRequestLifestyle" type="Castle.MicroKernel.Lifestyle.PerWebRequestLifestyleModule, Castle.Windsor" />
    </httpModules>

您应该始终努力将开发环境设置为尽可能接近生产环境,这意味着随.NET Framework一起分发的第三方程序集应该放在bin中...我的意思是bin文件夹,不是垃圾桶;)

答案 1 :(得分:0)

据我所知,你不能。

那种问题的答案&#34;医生,当我这样做时会疼!&#34;通常是&#34;然后不要这样做&#34;。

换句话说:不要在开发计算机上的GAC中安装第三方程序集。

答案 2 :(得分:0)

不,你不能!这是CLR的Fusion引擎的固定行为。

Fusion引擎(在.Net中加载程序集的责任方)总是走它的步骤(临时/下载/ gac /基本路径/探测路径),你无法阻止/改变它。

如果你在两个地方有一个程序集,那么就会加载一个位于上面列表中的第一个程序集(对于不同的版本可能会非常混乱)。

答案 3 :(得分:0)

不,你不能。 Locating assembly是一种复杂的后备算法。

  • 确定所需的程序集名称,版本
  • IIf已加载所需的组件?如果是,请使用它。
  • 如果没有,是否在GAC中?如果是,请使用它。
  • 如果没有,是否位于<codebase><probing>元素所在的位置?如果是,请使用它。(这是启动路径的所在。)

正如我们所见,运行时继续搜索程序集,直到找到它(达到一定程度)。 GAC排在第三位,它将在第1步和第2步失败时执行。没有办法说不要考虑GAC。

作为一种解决方法:您可以手动检查应用程序启动路径,如果缺少必需的程序集,则抛出&#34;异常&#34;并终止该过程。我不熟悉Asp.Net所以不确定这是否适合你。

注意:上面的子弹是我的粗略重点,它比我上面说的更复杂。有关详细信息,请参阅How the Runtime Locates Assemblies