2013-08-13 1 views
2

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가 작동을 멈췄다"는 메시지가 표시됩니다.

아이디어가 있으십니까? 감사!

+0

정확한 런타임 오류는 무엇입니까? –

+1

FlyCapture 샘플 페이지로 이동하여 샘플을보십시오. http://www.ptgrey.com/products/pgrflycapture/samples.asp –

+1

Point Gray에 C# SDK가있는 것 같습니다. 당신이 그것을 사용하지 않는 특별한 이유가 있습니까? 그럼에도 불구하고 네이티브 코드에서 콜백과 관련하여 이상한 행동이 나타나는 경우 호출 규칙이 올바른지 확인하십시오. http://blogs.microsoft.co.il/blogs/sasha/archive/2012/01/18/p-invoke -stack-imbalance-mda.aspx – lnmx

답변

1

나는 그것을 얻었습니다! 문제는 API의 함수 (flycaptureCreateContext, flycaptureModifyCallback 및 flycaptureDestroyContext)가 C 헤더에서 __cdecl로 선언되었지만 DllImport 문에서 API 함수를 고려하지 않았기 때문입니다. 다음은 수정 된 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에게 도움을 요청합니다.

관련 문제