首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >IIS托管->非托管->托管-> StackOverflowException

IIS托管->非托管->托管-> StackOverflowException
EN

Stack Overflow用户
提问于 2012-07-24 10:11:06
回答 1查看 852关注 0票数 4

我会尽量详细地描述我的问题,但是如果需要更详细的解释,请告诉我。

为了简化,假设我有3个DLL(实际上我有更多的DLL,但这不是很重要,我想):

  1. managed-1.dll -托管DLL (在C# .NET 4.0中写)-处理请求,在某些请求中调用第二个DLL中的非托管代码。
  2. unmanaged.dll --非托管DLL (在旧式VC++ 6.0中写)--执行几个操作,有时调用第三个DLL
  3. managed-2.dll -托管DLL (在CLI/C++ .NET 3.5中写)--我问题的根源

我在三个不同的场景中运行我的代码:

  1. 我从控制台应用程序调用managed-1.dll -一切正常。
  2. 我从ASP.NET Development Server打电话给ASP.NET Development Server-一切都很好
  3. 我从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:

代码语言:javascript
复制
var result = unchecked ((int)0x800000FF);
var thread = new Thread(() => { result = pinvoke_func(); }, 1024 * 1024); // 1MB
thread.Start();
thread.Join();
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11628627

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档