我正在使用与某些硬件通信的外部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()方法返回与控制台应用程序相同的值。 不幸的是,我的回调函数没有像在控制台应用程序中那样被调用。
有什么建议吗?