문제

C#에서 외부 DLL을 호출해야합니다. 이것은 헤더 정의입니다.

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

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

열거와 C#에 호출을 추가했습니다.

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을 생성합니다. DLL이 '작동'하고 있다는 것을 알고 있습니다. GetHandle 반환합니다 hHandle 위에 언급했듯이. 나는 매개 변수를 An으로 변경하려고 노력했다 int (ref int watchmode)하지만 같은 오류를 받으십시오. 위의 통화를 어떻게 지울 수 있는지 아는 사람이 있습니까?

도움이 되었습니까?

해결책

C#과 C ++의 매개 변수 크기 문제 차이를 실행합니다. C ++/Windows World Long에는 4 바이트 서명 정수가 있습니다. C# World Long에는 8 바이트 서명 정수가 있습니다. C# 서명을 변경하여 int를 가져와야합니다.

FFPF는 여기에서 intptr을 사용해야한다고 말하는 데 잘못된 것입니다. intptr이 int로 마샬링되므로 32 비트 기계 에서이 특정 문제를 해결합니다. 64 비트 머신에서 이것을 실행하면 8 바이트 서명 정수로 다시 마샬링되어 충돌합니다.

다른 팁

Managed, Native 및 COM Interop 팀은 CodePlex에서 Pinvoke Interop Assistant를 발표했습니다. 어쩌면 그것은 적절한 서명을 만들 수 있습니다.http://www.codeplex.com/clrinterop/release/projectreleases.aspx?releaseid=14120

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top