ASP.NET中的ASP.NET卸载程序集

时间:2009-07-03 09:43:13

标签: asp.net assemblies

我的ASP.NET应用程序使用“模块”系统,在完全限定的字符串引用上使用Type.GetType(),并像实例一样实例化该类型的对象。

然而,最近它一直在寻找不能找到类型的例外 - 但只是偶尔。我无法随意复制,但它通常发生在简单更改非主相关的内容之后,如Master Page或ASCX标记。在重建站点或重新启动IIS之前,它不会自行排序。对web.config进行更改无法修复它。

在web.config中添加对程序集的显式引用而不是希望找到它位于bin目录中可以减少问题的发生,但不会阻止它完全发生。不知何故,某处某处认为移除我的装配是个好主意。

我已经调试到找不到类型的地方并且足够正确,尽管在前一页加载时,程序集似乎从Thread.GetDomain().GetAssemblies()中消失。很明显,当应用程序处于活动状态时,我不能冒这个风险,所以我手动调用了Assembly.LoadAssembly()我知道它需要的DLL只是为了看看是否值得创建一个尝试定位程序集的方法。这也不起作用,因为当我尝试使用该类时,它会抛出以下错误:

  

[A] xxx.Modules.CustomCaseStudy不能   被投射到   [B] xxx.Modules.CustomCaseStudy。 A型   来自'xxx.Modules,   版本= 1.0.0.0,文化=中立,   上下文中的PublicKeyToken = null'   'LoadNeither'在位置   'C:\开发\ XXX \ xxx.Web \ BIN \ xxx.Modules.dll'。   B型来自'xxx.Modules,   版本= 1.0.0.0,文化=中立,   上下文中的PublicKeyToken = null'   位置处的“默认”   “C:\ WINDOWS \ Microsoft.NET \框架\ V2.0.50727 \临时   ASP.NET   文件\根\ fff474e0 \ 8c6aec7e \组件\ DL3 \ 325b4335 \ 009dbd67_b2fbc901 \ xxx.Modules.DLL”。

所有的时间,所需的DLL都位于bin文件夹中,等待 - 不,请求使用,更不用说web.config中的显式引用。

跟踪罪魁祸首的任何信息,甚至作为最后的手段如何将该程序集加载到“默认”上下文中都将非常感激!

2 个答案:

答案 0 :(得分:2)

添加以下行:

<add assembly="*"/>

到web.config并使用该网站超过两周,我没有再遇到这个问题。无论如何,我希望它能够装入垃圾箱中的所有东西,所以它不像它看起来那么脏兮兮的解决方案!

答案 1 :(得分:0)

  1. Thread.GetDomain()。GetAssemblies()不会返回“bin”文件夹中的所有程序集。它只返回到目前为止使用的程序集。这不是你想要的。您始终需要调用Assembly.LoadAssembly()。

  2. 如果要动态加载类,则不应在其他代码中对它们使用强类型引用。这就是为什么你得到“无法施放”的例外。解决此问题的一种方法是定义所有模块实现的接口。然后,无论何时动态加载其中一个“模块”类,都将其作为此接口的实例返回。像...这样的东西。

  3. public IModule GetModule( string className )
    {
         // Load the assembly
         // Find the type
         // Call CreateInstance
         // Cast the return value as "IModule" and return it
    }