我會盡量詳細描述我的問題,但如果需要更詳細的解釋,請告訴我。IIS託管 - >非託管 - >託管 - > StackOverflowException
爲了簡化讓的說我有3倍的DLL(其實我有更多的,但它是不是很重要,我猜):
managed-1.dll
- 託管DLL(writen在C#.NET 4.0) - 手柄請求,並在某些請求調用在第二DLL非託管代碼unmanaged.dll
- 未管理的DLL(在舊學校writen VC 6.0) - 執行的若干操作,有時調用第三DLLmanaged-2.dll
- 管理DLL(在CLI/C++ .NET 3.5 writen) - 根我的問題
的我我的代碼運行在3周不同的方案:
我打電話
managed-1.dll
從控制檯應用程序 - 一切正常我打電話
managed-1.dll
從ASP.NET Development Server
- 一切正常過我從
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();
鏈接到有效複製(但較舊)的問題:http://stackoverflow.com/questions/2319711/increase-stack-size-iis-asp-net-3-5 - 還涵蓋了微軟文章和顯式線程創建解決方法。 – Tao 2014-01-27 10:23:50