代码之家  ›  专栏  ›  技术社区  ›  tags2k

ASP.NET正在粮箱中卸载程序集

  •  1
  • tags2k  · 技术社区  · 16 年前

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

    然而,最近它一直在抛出异常,因为找不到类型-但只是偶尔。我还不能随意复制,但它通常是在对一些与bin无关的内容(如母版页或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=空 位置处的“loadnone” 'C:\development\xxx\xxx.web\bin\xxx.modules.dll'。 B型源于'xxx.modules, 版本=1.0.0.0,文化=中性, 上下文中的publicKeyToken=空 位置处的“默认” 'C:\windows\microsoft.net\framework\v2.0.50727\临时 ASP.NET 文件\root\fff474e0\8c6aec7e\assembly\dl3\325b4335\009dbd67_b2fbc901\xxx.modules.dll'。

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

    在追查罪犯,甚至作为最后手段,如何将该程序集加载到“默认”上下文中的任何信息都将非常感谢!

    2 回复  |  直到 16 年前
        1
  •  2
  •   tags2k    16 年前

    添加行后:

    <add assembly="*"/>

    在web.config上使用了两个多星期,我再也没有遇到这个问题。不管怎样,我希望它能把所有东西都装进垃圾箱,这样它就不会像看上去那样脏了!

        2
  •  0
  •   David    16 年前
    1. thread.getdomain().getassembles()不会返回“bin”文件夹中的所有程序集。它只返回到目前为止使用的程序集。这不是你想要的。您始终需要调用assembly.loadambly()。

    2. 如果要动态加载类,则不应在其他代码中使用对它们的强类型引用。这就是为什么您要获得“不能强制转换”异常的原因。解决这个问题的一种方法是定义一个所有模块实现的接口。然后,无论何时动态加载一个“模块”类,都将其作为该接口的实例返回。有点像…

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