我会尽量详细地描述我的问题,但是如果需要更详细的解释,请告诉我。
为了简化,假设我有3个DLL(实际上我有更多的DLL,但这不是很重要,我想):
managed-1.dll -托管DLL (在C# .NET 4.0中写)-处理请求,在某些请求中调用第二个DLL中的非托管代码。unmanaged.dll --非托管DLL (在旧式VC++ 6.0中写)--执行几个操作,有时调用第三个DLLmanaged-2.dll -托管DLL (在CLI/C++ .NET 3.5中写)--我问题的根源我在三个不同的场景中运行我的代码:
managed-1.dll -一切正常。ASP.NET Development Server打电话给ASP.NET Development Server-一切都很好managed-1.dll调用IIS --在涉及到整个序列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() !!标记为,不使用任何托管类型!!managed-2.dll::FailingMethod() !!使用托管类型;在一开始(甚至不执行第一行代码)出现异常!!更有趣的是:调试器在FailingMethod中显示的参数值与方法调用点中的值不同。
如果有人有任何线索,请指点。
解决方案:问题不是与托管-非托管相关,而是与IIS堆栈大小有关。对我来说,编者工具的使用是不可接受的解决方案。因此,我的解决方案-在调用unmanaged.dll之前创建新线程,并将堆栈设置为1MB:
var result = unchecked ((int)0x800000FF);
var thread = new Thread(() => { result = pinvoke_func(); }, 1024 * 1024); // 1MB
thread.Start();
thread.Join();发布于 2012-07-25 15:42:54
正常windows应用程序的堆栈大小显然是1MB,但对于IIS则是256 it (参见http://support.microsoft.com/kb/932909)。这也许可以解释为什么应用程序在控制台应用程序中行为,而不是在IIS中。
我不知道ASP.NET开发服务器的堆栈大小是多少,但它可能是1MB,请参阅下面的问题,以获得更多信息:stackoverflowexception-in-iis7-but-not-in-cassini
显然,可以使用editbin来增加IIS的堆栈大小。
有关说明,请参阅本文:IIS中的堆栈大小-影响ASP.NET
https://stackoverflow.com/questions/11628627
复制相似问题