2008-09-29 4 views
1

C#에서 외부 DLL을 호출해야합니다. 내가 열거 형 및 C#에서 호출을 추가 한P/Invoke를 올바르게 사용하기

enum WatchMode { 
    WATCH_MODE_SYSTEM = 0,   
    WATCH_MODE_APPLICATION = 1 }; 

LONG ADS_API WDT_GetMode (LONG i_hHandle, WatchMode * o_pWatchMode); 

:

public enum WatchMode 
{ 
    WATCH_MODE_SYSTEM = 0, 
    WATCH_MODE_APPLICATION = 1  
} 
[DllImport("AdsWatchdog.dll")] 
internal static extern long WDT_GetMode(long hHandle, ref WatchMode watchmode); 

이는 AccessViolationException를 생성이 헤더 정의입니다. 위에서 언급 한 hHandle을 반환하는 GetHandle에 대한 호출을 추가 했으므로 dll이 '작동 중'이라는 것을 알고 있습니다. param을 int (ref int watchmode)으로 변경하려고했지만 동일한 오류가 발생합니다. 아무도 내가 위의 전화를 PInvoke 수있는 방법을 알고 있습니까?

답변

7

C#과 C++의 매개 변수 크기에 문제가 있습니다. C++/windows에서 LONG은 4 바이트 부호있는 정수입니다. C#에서 long은 8 바이트 부호있는 정수입니다. int를 사용하도록 C# 서명을 변경해야합니다.

ffpf는 IntPtr을 사용해야한다고 잘못 말합니다. IntPtr이 int로 마샬링하므로 32 비트 컴퓨터에서이 특정 문제를 해결합니다. 이것을 64 비트 머신에서 실행하면 다시 8 바이트 부호있는 정수로 마샬링되고 충돌합니다.

관련 문제