2010-02-17 9 views
3

C 코드에서 관리되지 않는 함수를 호출하도록했습니다. pCallback은 함수 포인터이므로 관리 측면에서 대리자입니다. 이제콜백 함수를 호출 할 때 C# 예외가 발생했습니다.

[DllImport("MyDLL.dll")] 

public static extern Result SetCallback(
      IntPtr handle, 
      Delegate pCallback, 
      CallbackType Type); 

디버깅, 내가 한 번 cback 기능을 수행 한 후, 난 그냥 처리되지 않은 win32에서 예외가 발생했습니다 "라는, 데이터가없는 예외를 얻을 것을 볼 때 나는

private delegate void pfnCallback(uint PromptID, ttsEventType evt, IntPtr lData); 
private pfnCallback cb = new pfnCallback(cback); 

public Form1() 
{ 

    (...) 
    Wrapper.SetCallback(handle, cb, IntPtr.Zero, CallBackType.DEFAULT); 
    (...) 
    public static void cback(uint PromptID, ttsEventType evt, IntPtr lData) 
    { } 
    } 

을 설정하고 WindowsApp2.vshost.exe [4372]는. 내가 잘못 이해하지 않습니다. 누군가가 나를 도울 수 있습니까?

답변

1

그것은 일

[UnmanagedFunctionPointer(CallingConvention.xxx, CharSet = CharSet.xxx)] 
public delegate ... 
+0

을 사용해보십시오! 대단히 감사합니다! – jose

2

시도 Win32 오류 코드를 얻을 수 Marshal.GetLastWin32Error()를 호출. 완 그런

이 목록에 대한 오류 코드는 다음과 같습니다. http://msdn.microsoft.com/en-us/library/ms681381(VS.85).aspx

여전히 좋은 예외 개체만큼 많은 정보가 아니지만 올바른 방향으로 사용자를 안내 할 수 있습니다.

1

가비지 수집기가 콜백 참조를 수집하지 않았는지 확인해야합니다. 콜백에 대한 참조는 콜백이 호출 될 것으로 예상되는 동안 관리되는 메모리에서 살아 있어야합니다. 이 문제를 해결 갈

한 가지 방법은 많은 세부 여기에 없다 중간

2

에서 관리되는 C++ 계층을 생성하는 것입니다,하지만 내 생각 엔 이것은 호출 규칙의 문제가 될 수있다. DllImport를 사용할 때 항상 호출 규칙을 명시 적으로 설정하려고합니다.

[DllImport("msvcrt.dll", CharSet=CharSet.Unicode, CallingConvention=CallingConvention.Cdecl)] 
public static extern int printf(String format, int i, double d); 

호출 규칙은 호출 스택에 매개 변수를 넣는 방법과 이후 호출을 정리하는 방법에 영향을 줄 수 있습니다.

here

당신은 관리되지 않는 라이브러리와 함께 제공되는 헤더 또는 문서에서 올바른 규칙을 찾아야 할 것입니다 참조하십시오.

관련 문제