C# 코드에서 C로 작성된 DLL (FlyCapture API, Point Gray Research Inc)을 사용하려고하는데 런타임 오류가 발생합니다. 여기에 DLL을 사용하는 두 개의 코드 샘플이 있습니다. 하나는 C++로 작성되었고 다른 하나는 C#에서 안전하지 않은 컨텍스트를 사용하여 똑같은 작업을 시도했습니다.C에서 C로 작성된 DLL을 호출하는 동안 vshost32-clr2.exe에서 오류가 발생했습니다.
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 초 동안 대기하고 레지스터에서 콜백을 제거합니다. 5 초 동안 컴퓨터에서 카메라를 제거하면 C++ 응용 프로그램이 제대로 작동하므로 콘솔에 메시지가 나타납니다. 반면에 C# 응용 프로그램은 이벤트가 발생하지 않을 때만 제대로 작동하므로 콜백 함수가 호출되지 않습니다. 컴퓨터에서 카메라를 제거하려고하면 콜백 기능이 성공적으로 호출되고 올바른 번호가 화면에 표시되지만 flycaptureDestroyContext 함수가 실행되는 동안 Windows에서 "vshost32-clr2.exe가 작동을 멈췄다"는 메시지가 표시됩니다.
아이디어가 있으십니까? 감사!
정확한 런타임 오류는 무엇입니까? –
FlyCapture 샘플 페이지로 이동하여 샘플을보십시오. http://www.ptgrey.com/products/pgrflycapture/samples.asp –
Point Gray에 C# SDK가있는 것 같습니다. 당신이 그것을 사용하지 않는 특별한 이유가 있습니까? 그럼에도 불구하고 네이티브 코드에서 콜백과 관련하여 이상한 행동이 나타나는 경우 호출 규칙이 올바른지 확인하십시오. http://blogs.microsoft.co.il/blogs/sasha/archive/2012/01/18/p-invoke -stack-imbalance-mda.aspx – lnmx