IIS管理 - >不受管理 - >管理 - > StackOverflowException

时间:2012-07-24 10:11:06

标签: .net iis pinvoke stack-overflow unmanaged

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

为了简化,假设我有3个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中编写) - 问题的根源

  4. 我在3种不同的场景中运行我的代码:

    1. 我从控制台应用程序调用{​​{1}} - 一切正常

    2. 我从managed-1.dll致电managed-1.dll - 一切运作良好

    3. 我从ASP.NET Development Server致电managed-1.dll - 一切正常,直到涉及整个序列IIS

    4. 在方案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

1 个答案:

答案 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