IIS托管 - >非托管 - >托管 - > *Exception

问题描述:

我会尽量详细描述我的问题,但如果需要更详细的解释,请告诉我。IIS托管 - >非托管 - >托管 - > *Exception

为了简化让的说我有3倍的DLL(其实我有更多的,但它是不是很重要,我猜):

  1. managed-1.dll - 托管DLL(writen在C#.NET 4.0) - 手柄请求,并在某些请求调用在第二DLL非托管代码

  2. unmanaged.dll - 未管理的DLL(在旧学校writen VC 6.0) - 执行的若干操作,有时调用第三DLL

  3. managed-2.dll - 管理DLL(在CLI/C++ .NET 3.5 writen) - 根我的问题

的我我的代码运行在3周不同的方案:

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

  2. 我打电话managed-1.dllASP.NET Development Server - 一切正常过

  3. 我从IIS拨打电话managed-1.dll - 一切正常,直到涉及整个序列managed-1.dll -> unmanaged.dll -> managed-2.dll

在场景3中引发了*Exception。调试器显示不涉及递归。还有一点很明显,异常在以下类型调用堆栈的发生:

  • managed-1.dll::CallUnmanagedCode()
  • unmanaged.dll::SomeMethod1()
  • unmanaged.dll::SomeMethod2()
  • unmanaged.dll::CallManagedCode()
  • managed-2.dll::CallUnmanagedCode()!标记为__declspec(dllexport)并且不使用任何托管类型!
  • managed-2.dll::FailingMethod()!!使用托管类型;在一开始(即使第一行代码没有执行)出现异常!

的一个更有趣的事:相比在方法调用点的值的调试器显示不相同的参数值在FailingMethod

如果有人有任何线索,请咨询。

解决方案:该问题与管理非托管的东西无关,但与IIS stack size。对我来说,使用editbin工具是不可接受的解决方案。所以,我的解决方案 - 创建unmanaged.dll的调用和设置叠前新线程1 MB:

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

链接到有效复制(但较旧)的问题:http://*.com/questions/2319711/increase-stack-size-iis-asp-net-3-5 - 还涵盖了微软文章和显式线程创建解决方法。 – Tao 2014-01-27 10:23:50

堆栈大小在正常的Windows应用程序显然是1MB,但IIS是256KB(见http://support.microsoft.com/kb/932909)。这也许可以解释为什么应用程序在控制台应用程序中运行,但不在IIS中运行。

我并不确切地知道堆栈大小是什么ASP.NET开发服务器,但它可能是1MB,请参阅本SO问题的更多信息:*exception-in-iis7-but-not-in-cassini

显然有可能加大对IIS堆栈大小使用editbin。
请参阅此文章的指示:Stack sizes in IIS - affects ASP.NET

+0

thanx的提示!我想这可能是我的问题的根源。我会尝试增加堆栈大小并让你知道结果 – 2012-07-25 17:46:13