IIS托管 - >非托管 - >托管 - > StackOverflowException
我会尽量详细描述我的问题,但如果需要更详细的解释,请告诉我。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();
堆栈大小在正常的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
thanx的提示!我想这可能是我的问题的根源。我会尝试增加堆栈大小并让你知道结果 – 2012-07-25 17:46:13
链接到有效复制(但较旧)的问题:http://stackoverflow.com/questions/2319711/increase-stack-size-iis-asp-net-3-5 - 还涵盖了微软文章和显式线程创建解决方法。 – Tao 2014-01-27 10:23:50