2012-07-24 159 views
3

我會盡量詳細描述我的問題,但如果需要更詳細的解釋,請告訴我。IIS託管 - >非託管 - >託管 - > StackOverflowException

爲了簡化讓的說我有3倍的DLL(其實我有更多的,但它是不是很重要,我猜):

  1. managed-1.dll - 託管DLL(writen在C#.NET 4.0) - 手柄請求,並在某些請求調用在第二DLL非託管代碼

  2. unmanaged.dll - 未管理的DLL(在舊學校writen VC 6.0) - 執行的若干操作,有時調用第三DLL

  3. managed-2.dll - 管理DLL(在CLI/C++ .NET 3.5 writen) - 根我的問題

的我我的代碼運行在3周不同的方案:

  1. 我打電話managed-1.dll從控制檯應用程序 - 一切正常

  2. 我打電話managed-1.dllASP.NET Development Server - 一切正常過

  3. 我從IIS撥打電話managed-1.dll - 一切正常,直到涉及整個序列managed-1.dll -> unmanaged.dll -> managed-2.dll

在場景3中引發了StackOverflowException。調試器顯示不涉及遞歸。還有一點很明顯,異常在以下類型調用堆棧的發生:

  • managed-1.dll::CallUnmanagedCode()
  • unmanaged.dll::SomeMethod1()
  • unmanaged.dll::SomeMethod2()
  • unmanaged.dll::CallManagedCode()
  • managed-2.dll::CallUnmanagedCode()!標記爲__declspec(dllexport)並且不使用任何託管類型!
  • managed-2.dll::FailingMethod()!!使用託管類型;在一開始(即使第一行代碼沒有執行)出現異常!

的一個更有趣的事:相比在方法調用點的值的調試器顯示不相同的參數值在FailingMethod

如果有人有任何線索,請諮詢。

解決方案:該問題與管理非託管的東西無關,但與IIS stack size。對我來說,使用editbin工具是不可接受的解決方案。所以,我的解決方案 - 創建unmanaged.dll的調用和設置疊前新線程1 MB:

var result = unchecked ((int)0x800000FF); 
var thread = new Thread(() => { result = pinvoke_func(); }, 1024 * 1024); // 1MB 
thread.Start(); 
thread.Join(); 
+0

鏈接到有效複製(但較舊)的問題:http://stackoverflow.com/questions/2319711/increase-stack-size-iis-asp-net-3-5 - 還涵蓋了微軟文章和顯式線程創建解決方法。 – Tao 2014-01-27 10:23:50

回答

3

堆棧大小在正常的Windows應用程序顯然是1MB,但IIS是256KB(見http://support.microsoft.com/kb/932909)。這也許可以解釋爲什麼應用程序在控制檯應用程序中運行,但不在IIS中運行。

我並不確切地知道堆棧大小是什麼ASP.NET開發服務器,但它可能是1MB,請參閱本SO問題的更多信息:stackoverflowexception-in-iis7-but-not-in-cassini

顯然有可能加大對IIS堆棧大小使用editbin。
請參閱此文章的指示:Stack sizes in IIS - affects ASP.NET

+0

thanx的提示!我想這可能是我的問題的根源。我會嘗試增加堆棧大小並讓你知道結果 – 2012-07-25 17:46:13