.net - IIS 托管 -> 非托管 -> 托管 -> StackOverflowException

标签 .net iis pinvoke stack-overflow unmanaged

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

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

  1. managed-1.dll - 托管 DLL(用 C# .NET 4.0 编写) - 处理请求,并在某些请求期间调用第二个 DLL 中的非托管代码

  2. unmanagement.dll - 非托管 DLL(用老式 VC++ 6.0 编写) - 执行多个操作,有时调用第三个 DLL

  3. managed-2.dll - 托管 DLL(用 CLI/C++ .NET 3.5 编写) - 我的问题的根源

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

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

  2. 我从 ASP.NET Development Server 调用 managed-1.dll - 一切都运行良好

  3. 我从 IIS 调用 managed-1.dll - 一切正常,直到整个序列 managed-1.dll -> unmanaged.dll -> 涉及 Managed-2.dll

在场景 3 中,抛出 StackOverflowException。调试器显示不涉及递归。另外很明显,该异常发生在以下类型的调用堆栈中:

  • managed-1.dll::CallUnmanagementCode()
  • unmanagement.dll::SomeMethod1()
  • unmanagement.dll::SomeMethod2()
  • unmanagement.dll::CallManagedCode()
  • managed-2.dll::CallUnmanagementCode() !!用 __declspec(dllexport) 标记,并且不使用任何托管类型!!
  • managed-2.dll::FailingMethod() !!使用托管类型;一开始(连第一行代码都没有执行)就发生了异常!!

更有趣的事情是:调试器在 FailingMethod 中显示的参数值与方法调用点中的值不同。

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

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

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

最佳答案

普通 Windows 应用程序的堆栈大小显然为 1MB,但对于 IIS,堆栈大小为 256KB(请参阅 http://support.microsoft.com/kb/932909 )。这或许可以解释为什么应用程序在控制台应用程序中运行,但在 IIS 中却不然。

我不知道 ASP.NET 开发服务器的堆栈大小到底是多少,但可能是 1MB,请参阅此问题以获取更多信息:stackoverflowexception-in-iis7-but-not-in-cassini

显然可以使用 editbin 增加 IIS 的堆栈大小。
有关说明,请参阅本文:Stack sizes in IIS - affects ASP.NET

关于.net - IIS 托管 -> 非托管 -> 托管 -> StackOverflowException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11628627/

相关文章:

c# - 用于处理字节的无编码字符串类? (或替代方法)

asp.net - 如何使用 localDB 将 ASP.NET MVC 4 应用程序部署到 Windows 7 上的本地 IIS?

.net - 将焦点切换到另一个应用程序的正确方法(在 .NET 中)

c# - 如何在 C# 中编码 NDISUIO_QUERY_OID 结构以执行以下任务

.htaccess - IIS 和 Yii2 漂亮的 URL

c# - 获取事件窗口文本(并向其发送更多文本)

.net - DynamoDB 新手。有没有更方便的方法来添加/放置项目?

asp.net - 将 Node.JS 与 ASP.NET WebForm 和 Socket.IO 结合使用

c# - GroupBy 并计算列表中的唯一元素

asp.net - 在 Windows Azure 中的自定义端口号上发布网站?