通过IIS

时间:2017-02-21 10:05:45

标签: c# c++ .net iis

我正在使用与某些硬件通信的外部32位c ++库,该库在我的代码中用作托管程序集。

当我在控制台应用程序中使用它时,它没有任何问题。当代码托管在IIS上时,我有几个问题。

首先,我不断获得stackoverflow异常,直到我在IIS上设置应用程序池以启用32位应用程序并更改我的代码以增加堆栈大小。 我在这里使用了例子How to change stack size for a .NET program?

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

   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()方法返回与控制台应用程序相同的值。 不幸的是,我的回调函数没有像在控制台应用程序中那样被调用。

有什么建议吗?

0 个答案:

没有答案