【问题标题】:Changing web.config unloads ASP.NET application, but doesn't unload "enough"更改 web.config 会卸载 ASP.NET 应用程序,但不会卸载“足够”
【发布时间】:2010-06-30 07:47:54
【问题描述】:

我们有一个 ASP.NET Web 应用程序,它是一个 C# DLL,它引用一个 C++/CLI DLL,链接到一些本机静态库。

当我们编辑 web.config 文件时,appdomain 会按预期自行卸载,但是在下一次 Web 请求时,应用程序崩溃,并出现来自我们的本机代码的一些访问冲突异常。

进一步调查表明,当应用程序域“卸载”时,w3wp.exe 进程实际上仍然存在,它只会卸载我们的 C# DLL(并且不会 我们的 C++/CLI DLL)。这可能就是我们遇到这些异常的原因。

我们怎样才能阻止这种疯狂?我们能否让 ASP.NET 在 web.config 更新时完全回收 w3wp 进程?如果 w3wp 继续存在,我们能否让 ASP.NET 真正卸载我们所有的 DLL?

【问题讨论】:

  • 与此同时,在我们能够解决这些异常和/或不完整卸载之前,我们的解决方法是使用 VEH 捕获这些异常,无​​论如何我们都有用于小型转储。处理程序产生一个转储,然后退出进程,这导致 IIS 打开一个新进程(这样就没有 Web 请求失败!)。

标签: c# asp.net iis interop c++-cli


【解决方案1】:

创建一个包装程序集,并在程序集/appDomain 被回收时手动GetModuleHandle + FreeLibrary。

但是,如果您手动创建应用程序域或在 IIS 中为多个应用程序使用一个应用程序池,则会导致问题。

【讨论】:

  • 包装器组件围绕什么?
  • 一个“FreeDll”包装器(在 C# 中)围绕任何未释放的 DLL(为方便起见)。
【解决方案2】:

找不到比在Application_End 末尾调用Environment.Exit(0) 更好的解决方案。

【讨论】:

    猜你喜欢
    • 2020-12-15
    • 1970-01-01
    • 2020-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多