我在GAC中安装了一些第三方程序集。我正在开发一个使用其中一些程序集的ASP.NET。在开发机器中,如果组件不在bin文件夹中,则从GAC加载。如果bin文件夹中缺少程序集,则会出现这种情况,因为没有报告错误。但是,当应用程序部署在共享主机上时,如果bin文件夹中缺少程序集,则应用程序错误。
有没有办法强制应用程序不从GAC加载某些程序集,如果它在开发机器的bin文件夹中丢失则报告错误?
答案 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)
Fusion引擎(在.Net中加载程序集的责任方)总是走它的步骤(临时/下载/ gac /基本路径/探测路径),你无法阻止/改变它。
如果你在两个地方有一个程序集,那么就会加载一个位于上面列表中的第一个程序集(对于不同的版本可能会非常混乱)。
答案 3 :(得分:0)
不,你不能。 Locating assembly是一种复杂的后备算法。
<codebase>
或<probing>
元素所在的位置?如果是,请使用它。(这是启动路径的所在。)正如我们所见,运行时继续搜索程序集,直到找到它(达到一定程度)。 GAC排在第三位,它将在第1步和第2步失败时执行。没有办法说不要考虑GAC。
作为一种解决方法:您可以手动检查应用程序启动路径,如果缺少必需的程序集,则抛出&#34;异常&#34;并终止该过程。我不熟悉Asp.Net所以不确定这是否适合你。
注意:上面的子弹是我的粗略重点,它比我上面说的更复杂。有关详细信息,请参阅How the Runtime Locates Assemblies