[英]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.