2013-04-09 5 views
4

다음 코드는 네이티브 C DLL에 있습니다.C#에서 함수 포인터를 매개 변수로 사용하여 C++ 함수 호출

typedef void CallbackType(INT32 param1, INT32 param2); 

NATIVE_API void RegisterEventCallBack(CallbackType *callBackFunction); 


//INT32 is defined as below: 

typedef signed int   INT32, *PINT32; 

이 메서드는 내 C# 코드에서 호출해야합니다. 위임의

선언 :

[UnmanagedFunctionPointer(CallingConvention.Cdecl)] 
public delegate void CallbackType(Int32 param1, Int32 param2); 

방법 수입 신고 :

[DllImport("EtIPAdapter.dll")] 
public static extern void RegisterEventCallBack([MarshalAs(UnmanagedType.FunctionPtr)]CallbackType callbackFunc); 

콜링 :

RegisterEventCallBack(ReceivedData); 

private static void ReceivedData(Int32 param1, Int32 param2) 
{ 
    //Do something 
} 
stackflow에서 사용 가능한 몇 가지 솔루션을 따른 후,이 시도,451,515,

하지만이 작동하지 않습니다와 나는 다음과 같은 오류가 발생합니다 : 나는 또한 시도

A call to PInvoke function 'RegisterEventCallBack' has unbalanced the stack. This is likely because the managed PInvoke signature does not match the unmanaged target signature. Check that the calling convention and parameters of the PInvoke signature match the target unmanaged signature.

내가 GetFunctionPointerFromDelegate(ReceivedDataDelegate)를 사용하여 얻은 함수 포인터를 전달하여. 그러나 그 또한 같은 오류가 발생합니다.

오류가 서명 불일치를 지적하지만 명백한 서명 불일치가 표시되지 않습니다. 도와주세요.

+0

링크에서 다음 선언을 시도해 볼 수 있습니다. http://stackoverflow.com/a/9855516/2253250 또한 함수 프로토 타입이 맞는지 확인해야합니다. http://www.nirsoft.net/utils/dll_export_viewer.html은 DllExport Viewer를 사용할 수 있습니다. – Gencebay

+1

'NATIVE_API' 매크로는 어떻게 정의됩니까? 문제는 콜백 대리자가 아니라 'RegisterEventCallBack' 함수의 관리 선언에 있다고 생각합니다. 올바른 통화 규칙을 사용하고 있습니까? 콜백 매개 변수가'cdecl'을 사용할 때'RegisterEventCallBack'가'stdcall' ('DllImport'에 대한 기본값)을 사용하는 것이 이상하게 보입니다. – shambulator

답변

1

DLLImport를 수행 할 때 호출 규칙을 확인하십시오. 기본값은 Winapi/StdCall입니다.
가비지 수집기는 관리 코드 내의 참조 만 계산할 수 있기 때문에 가비지 수집기가 잠시 후 대리인을 제거하므로 응용 프로그램 수명주기 동안 관리 코드 내에서 대리인에 대한 참조를 유지해야합니다. . 대개 대리인을 설정하는 클래스의 정적 속성으로 대리인에 대한 참조를 유지합니다.

+0

감사합니다. "cdecl"DLLImport 명명 규칙을 변경했습니다. [DllImport ("EtIPAdapter.dll", CallingConvention = CallingConvention.Cdecl)] public static extern void RegisterEventCallBack ([MarshalAs (UnmanagedType.FunctionPtr)] ​​LogEventCallbackType pfnLogEvent); – Nirdesh

관련 문제