【问题标题】:ASP.NET unloading assemblies in the binASP.NET 卸载 bin 中的程序集
【发布时间】:2010-11-07 21:30:26
【问题描述】:

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

但是,最近它在无法找到类型时抛出异常 - 但只是偶尔。我无法随意复制,但它通常发生在对非 bin 相关的东西(如母版页或 ASCX 标记)进行简单更改之后。在我重建站点或重新启动 IIS 之前,它不会自行排序。对 web.config 进行更改并不能修复它。

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

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

[A]xxx.Modules.CustomCaseStudy 不能 被投到 [B]xxx.Modules.CustomCaseStudy。 A型 源自'xxx.Modules, 版本=1.0.0.0,文化=中性, PublicKeyToken=null' 在上下文中 'LoadNeither' 在位置 'C:\Development\xxx\xxx.Web\bin\xxx.Modules.dll'。 B型源自'xxx.Modules, 版本=1.0.0.0,文化=中性, PublicKeyToken=null' 在上下文中 位置的“默认” 'C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\root\fff474e0\8c6aec7e\assembly\dl3\325b4335\009dbd67_b2fbc901\xxx.Modules.DLL'。

一直以来,所需的 DLL 都在 bin 文件夹中,等待 - 不,乞求使用,更不用说 web.config 中的显式引用了。

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

【问题讨论】:

    标签: asp.net assemblies


    【解决方案1】:

    添加行后:

    <add assembly="*"/>

    到 web.config 并使用该网站两个多星期,我没有再次遇到这个问题。无论如何,我希望它把所有东西都加载到垃圾箱中,所以它不像看起来那么肮脏的暴力解决方案!

    【讨论】:

    • 这在 .NET 4.5 中对我不起作用。 This 很有帮助。
    【解决方案2】:
    1. Thread.GetDomain().GetAssemblies() 不会返回“bin”文件夹中的所有程序集。它只返回到目前为止已使用的程序集。这不是你想要的。您总是需要调用 Assembly.LoadAssembly()。

    2. 如果您想动态加载您的类,那么您不应该在其他代码中使用对它们的强类型引用。这就是为什么您会遇到“无法强制转换”异常的原因。解决这个问题的一种方法是定义一个所有模块都实现的接口。然后,每当您动态加载其中一个“模块”类时,将其作为此接口的实例返回。类似...

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

    【讨论】:

    • 谢谢大卫,但我的问题不是加载程序集;该站点可以正常运行很长时间,然后某些程序集将被卸载并且不会恢复。
    猜你喜欢
    • 1970-01-01
    • 2012-11-06
    • 2018-06-28
    • 1970-01-01
    • 2015-09-20
    • 1970-01-01
    • 1970-01-01
    • 2014-07-08
    • 1970-01-01
    相关资源
    最近更新 更多