我的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中的显式引用。
跟踪罪魁祸首的任何信息,甚至作为最后的手段如何将该程序集加载到“默认”上下文中都将非常感激!
答案 0 :(得分:2)
添加以下行:
<add assembly="*"/>
到web.config并使用该网站超过两周,我没有再遇到这个问题。无论如何,我希望它能够装入垃圾箱中的所有东西,所以它不像它看起来那么脏兮兮的解决方案!
答案 1 :(得分:0)
Thread.GetDomain()。GetAssemblies()不会返回“bin”文件夹中的所有程序集。它只返回到目前为止使用的程序集。这不是你想要的。您始终需要调用Assembly.LoadAssembly()。
如果要动态加载类,则不应在其他代码中对它们使用强类型引用。这就是为什么你得到“无法施放”的例外。解决此问题的一种方法是定义所有模块实现的接口。然后,无论何时动态加载其中一个“模块”类,都将其作为此接口的实例返回。像...这样的东西。
public IModule GetModule( string className ) { // Load the assembly // Find the type // Call CreateInstance // Cast the return value as "IModule" and return it }