C# 通过IIS运行32位托管程序集时出现问题

C# 通过IIS运行32位托管程序集时出现问题,c#,c++,.net,iis,C#,C++,.net,Iis,我使用的是与硬件相关的外部32位C++库,该库在我的代码中被用作托管程序集。 当我将它与控制台应用程序一起使用时,它不会出现任何问题。当代码托管在IIS上时,我有几个问题 首先,我不断收到stackoverflow异常,直到我在IIS上设置应用程序池以启用32位应用程序,并更改代码以增加堆栈大小。 我用了这里的例子 以下是更改后的示例代码: public class SomeExternalLibraryClient { [DllImport("SomeExternal

我使用的是与硬件相关的外部32位C++库,该库在我的代码中被用作托管程序集。 当我将它与控制台应用程序一起使用时,它不会出现任何问题。当代码托管在IIS上时,我有几个问题

首先,我不断收到stackoverflow异常,直到我在IIS上设置应用程序池以启用32位应用程序,并更改代码以增加堆栈大小。 我用了这里的例子

以下是更改后的示例代码:

   public class SomeExternalLibraryClient
   {
       [DllImport("SomeExternalLibrary.dll")]
       internal static extern int open();

       public delegate void OnEventCallback(int reserved1, int eventType, int eventData1, int eventData2, string dataStr, int reserved2);

       [DllImport("SomeExternalLibrary.dll", CallingConvention = CallingConvention.Cdecl)]
       static extern double subscribeToEvents([MarshalAs(UnmanagedType.FunctionPtr)]OnEventCallback func);

       static OnEventCallback callback = new OnEventCallback(OnEvent);

       static void OnEvent(int reserved1, int eventType, int eventData1, int eventData2, string dataStr, int reserved2)
       {
           callback(reserved1, eventType, eventData1, eventData2, dataStr, reserved2);
       }

       public int Open()
       {
           int openValue = -1;

           var t = new Thread(() =>
           {
               openValue = OpenCommunication();
           }, 4194304);
           t.Start();
           t.Join();

           return openValue;
       }

       private static int OpenCommunication()
       {        
           return open();            
       }      

       public void SubscribeToEvents(OnEventCallback func)
       {
           callback = func;
           subscribeToEvents(OnEvent);
       }
   }
我用控制台应用程序再次测试了它,它工作了,回调按预期工作

在IIS托管的应用程序中,我停止获取stackoverflow异常,并从OpenCommunication()方法返回与console application中相同的值。 不幸的是,我的回调函数并不像在控制台应用程序中那样被调用


有什么建议吗?

您可能在IIS中托管的某些网站上尝试这样做,回调方法未被调用的原因可能是由于web方法的执行已完成。web方法类对象不能用于回调方法调用。@Adil您的意思是Milan应该启动一个新线程?您是否在调试模式下编译控制台应用程序,但在发布模式下编译IIS?您的IIS必须是64位的,就像您的.dll一样。@GôTô,我的意思是,他会在返回响应之前等待回调,例如使用async-wait或AutoResetEvent。Waitone我发现了一个与硬件组件的实际实现有关的潜在问题,基本上作为一种解决方法,我每100毫秒轮询一次硬件事件。但是,在执行此操作时,我注意到t.Join()(它应该阻止线程)在从IIS运行时实际上会立即执行,但在从控制台应用程序(使用完全相同的库和设置)运行时,它实际上会在那里阻止10-12秒,直到它正确启动硬件。这可能是这里的核心问题。IIS加载外部DLL是否与使用控制台应用程序加载不同?