.net IIS管理->;非托管->;管理->;栈溢出异常

.net IIS管理->;非托管->;管理->;栈溢出异常,.net,iis,pinvoke,stack-overflow,unmanaged,.net,Iis,Pinvoke,Stack Overflow,Unmanaged,我会尽可能详细地描述我的问题,但如果需要更详细的解释,请让我知道 为了简化,假设我有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种不同的情况下运行代码:

我会尽可能详细地描述我的问题,但如果需要更详细的解释,请让我知道

为了简化,假设我有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种不同的情况下运行代码:

  • 我从控制台应用程序调用
    managed-1.dll
    ,一切正常

  • 我从ASP.NET开发服务器调用
    managed-1.dll
    ——一切都很好

  • 我从
    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()
      !!标记为
      \uu declspec(dllexport)
      ,不使用任何托管类型
    • managed-2.dll::FailingMethod()
      !!使用托管类型;在一开始(甚至第一行代码都没有执行)发生异常
    还有一件有趣的事:调试器在
    FailingMethod
    中显示的参数值与方法调用点中的值不同

    如果有人有任何线索,请提供建议

    解决方案:该问题与托管的非托管内容无关,而是与。对我来说,使用该工具是不可接受的解决方案。所以我的解决方案是:在调用
    unmanaged.dll
    之前创建新线程,并将堆栈设置为1MB:

    var result = unchecked ((int)0x800000FF);
    var thread = new Thread(() => { result = pinvoke_func(); }, 1024 * 1024); // 1MB
    thread.Start();
    thread.Join();
    

    普通windows应用程序的堆栈大小显然是1MB,但IIS的堆栈大小是256KB(请参阅)。这也许可以解释为什么应用程序在控制台应用程序中运行,而不是在IIS中运行

    我不知道ASP.NET开发服务器的堆栈大小,但可能是1MB,有关更多信息,请参阅此问题:

    显然,可以使用editbin增加IIS的堆栈大小。

    有关说明,请参阅本文:

    thanx获取提示!我想这可能是我问题的根源。我将尝试增加stacksize,并让您知道resultsLink以有效复制(但更老)问题:-还包括microsoft文章和显式线程创建解决方案。