gpt4 book ai didi

c# - 将 C 编写的 DLL 调用到 C# 时,vshost32-clr2.exe 出错

转载 作者:太空宇宙 更新时间:2023-11-03 13:37:37 25 4
gpt4 key购买 nike

我尝试在 C# 代码中使用 C 编写的 DLL(FlyCapture API,来自 Point Grey Research Inc),但我总是遇到运行时错误。这里我有两个使用 DLL 的代码示例:一个是用 C++ 编写的,另一个是我尝试使用不安全的上下文在 C# 中做完全相同的事情。

C++代码:

void Callback(void* Param, int Message, unsigned long lParam)
{
cout << Message << "\t" << lParam << endl;
}

int main(int argc, char *argv[])
{
void *context;
FlyCaptureCallback *callback = Callback;

flycaptureCreateContext(&context);
flycaptureModifyCallback(context, callback, NULL, true);

_sleep(5000);

flycaptureModifyCallback(context, callback, NULL, false);
flycaptureDestroyContext(context);

return 0;
}

C#代码:

[DllImport("pgrflycapture.dll")]
static extern int flycaptureCreateContext(void** pContext);

[DllImport("pgrflycapture.dll")]
static extern int flycaptureDestroyContext(void* context);

[DllImport("pgrflycapture.dll")]
static extern int flycaptureModifyCallback(void* context, IntPtr pfnCallback, void* pParam, bool bAdd);

delegate void FlyCaptureCallback(void* Param, int Message, uint lParam);

static void Callback(void* Param, int Message, uint lParam)
{
Console.WriteLine(Message.ToString() + "\t" + lParam.ToString());
}

static void Main(string[] args)
{
void *context;
IntPtr callback = Marshal.GetFunctionPointerForDelegate((FlyCaptureCallback) Callback);

flycaptureCreateContext(&context);
flycaptureModifyCallback(context, callback, null, true);

Thread.Sleep(5000);

flycaptureModifyCallback(context, callback, null, false);
flycaptureDestroyContext(context);
}

该程序的目的是注册一个回调函数,以便当相机总线中发生事件时,调用该函数。然后程序等待 5 秒并从寄存器中删除回调。 C++ 应用程序工作正常,如果我在这 5 秒内从计算机上取下相机,控制台中会出现一条消息。另一方面,C# 应用程序只有在没有事件发生时才能正常工作,因此不会调用回调函数。如果我尝试从计算机上移除摄像头,回调函数会成功调用并且屏幕上会出现正确的数字,但 Windows 会在 flycaptureDestroyContext 函数期间显示一条消息,提示“vshost32-clr2.exe 已停止工作”。

有什么想法吗?谢谢!

最佳答案

我知道了!问题是 API 的函数(flycaptureCreateContext、flycaptureModifyCallback 和 flycaptureDestroyContext)在 C 头文件中声明为 __cdecl,但我没有在 DllImport 语句中考虑它。下面是更正后的 C# 代码:

[DllImport("pgrflycapture.dll", CallingConvention = CallingConvention.Cdecl)]
static extern int flycaptureCreateContext(void** pContext);

[DllImport("pgrflycapture.dll", CallingConvention = CallingConvention.Cdecl)]
static extern int flycaptureDestroyContext(void* context);

[DllImport("pgrflycapture.dll", CallingConvention = CallingConvention.Cdecl)]
static extern int flycaptureModifyCallback(void* context, FlyCaptureCallback pfnCallback, void* pParam, bool bAdd);

[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
delegate void FlyCaptureCallback(void* Param, int Message, uint lParam);

static void Callback(void* Param, int Message, uint lParam)
{
Console.WriteLine(Message.ToString() + "\t" + lParam.ToString());
}

static void Main(string[] args)
{
void *context;
FlyCaptureCallback callback = (FlyCaptureCallback) Callback;

flycaptureCreateContext(&context);
flycaptureModifyCallback(context, callback, null, true);

Thread.Sleep(5000);

flycaptureModifyCallback(context, callback, null, false);
flycaptureDestroyContext(context);
}

感谢 lnmx 和 Jim Mischel 提供的宝贵帮助!

关于c# - 将 C 编写的 DLL 调用到 C# 时,vshost32-clr2.exe 出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18216760/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com