我会尝试尽可能详细地描述我的问题,但如果需要更详细的解释,请告诉我。
为了简化,假设我有3个DLL(实际上我有更多,但我认为它不是很重要):
managed-1.dll
- 托管DLL(在C#.NET 4.0中编写) - 处理请求,并在某些请求期间调用第二个DLL中的非托管代码
unmanaged.dll
- 非托管DLL(在旧式VC ++ 6.0中编写) - 执行多个操作,有时会调用第三个DLL
managed-2.dll
- 托管DLL(在CLI / C ++ .NET 3.5中编写) - 问题的根源
我在3种不同的场景中运行我的代码:
我从控制台应用程序调用{{1}} - 一切正常
我从managed-1.dll
致电managed-1.dll
- 一切运作良好
我从ASP.NET Development Server
致电managed-1.dll
- 一切正常,直到涉及整个序列IIS
。
在方案3中,抛出了StackOverflowException。调试器显示不涉及递归。很明显,在以下类型的调用堆栈中发生了异常:
managed-1.dll -> unmanaged.dll -> managed-2.dll
managed-1.dll::CallUnmanagedCode()
unmanaged.dll::SomeMethod1()
unmanaged.dll::SomeMethod2()
unmanaged.dll::CallManagedCode()
!!标有managed-2.dll::CallUnmanagedCode()
并且不使用任何托管类型!! __declspec(dllexport)
!!使用托管类型;在一开始(即使没有执行第一行代码)也会发生异常!! 另一个有趣的事情是:与方法调用点中的值相比,调试器在managed-2.dll::FailingMethod()
中显示的参数值不同。
如果有人有任何线索,请提供建议。
解决方案:问题与托管非托管内容有关,但与IIS stack size无关。对我来说,使用editbin工具是不可接受的解决方案。所以我的解决方案 - 在调用FailingMethod
之前创建新线程并将堆栈设置为1 MB:
unmanaged.dll
答案 0 :(得分:3)
普通Windows应用程序的堆栈大小显然是1MB,但对于IIS,它是256KB(参见http://support.microsoft.com/kb/932909)。这或许可以解释为什么应用程序在控制台应用程序中运行但在IIS中不运行。
我不确切知道ASP.NET开发服务器的堆栈大小是多少,但它可能是1MB,请参阅此SO问题以获取更多信息:stackoverflowexception-in-iis7-but-not-in-cassini
显然可以使用editbin增加IIS的堆栈大小 有关说明,请参阅此文章:Stack sizes in IIS - affects ASP.NET