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