簡體   English   中英

IIS應用程序池回收和本機程序集

[英]IIS application pool recycling and native assemblies

我有一個在IIS下運行的應用程序,該應用程序具有三個程序集:托管程序集,混合程序集和本機dll。 托管程序集公開了一個單例對象MaS ,該對象通過混合的單例MiS (C ++ / CLI)包裝了本地單例NaS

問題

當IIS回收應用程序池,托管單MaS似乎消失,其裝配在AppDomain中卸載也是如此混合一個MiS 但是,本機單例NaS粘住並且不會被破壞。 在我的情況下,這是有問題的,因為當應用程序被回收並再次加載時,托管單例,現在MaS1感到困惑,因為它在內存中找到了已經存在的本地單例NaS

如何在應用程序池回收中處理本機dll? 他們會卸載嗎?

應用程序域回收不會卸載應用程序域,它會加載新的域,並且后續請求由新的應用程序域處理。

僅當完成處理已接受的請求時,舊的appdomain才會卸載。

如果舊的應用程序域在非托管代碼中執行阻止操作,也有可能無法卸載。

解決方法是,您可以禁用apppool回收並配置封閉的工作進程。 單獨的工作進程將確保隔離非托管dll狀態。

您可以使用以下代碼輕松檢查非托管dll的狀態是否在appdomain之間共享:

托管代碼:

[DllImport("Win32Library.dll")]
public static extern Int16 inc();

private readonly static DateTime AppDomainStarted = DateTime.UtcNow;

public ActionResult Counter()
{
    return new JsonResult { Data = new { counter = inc(), appDomainId = AppDomain.CurrentDomain.Id, started = AppDomainStarted.ToString() }, JsonRequestBehavior = JsonRequestBehavior.AllowGet };
}

非托管代碼:

extern "C" __declspec(dllexport) short inc();

short inc()
{
    static int counter = 0;
    return counter++;
}

只需重新編譯您的aspnet代碼並刷新瀏覽器,即可查看計數器的遞增結果以及工作過程中的appdomain id。 確保使用IISExpress進行調試。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM