質問

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が生成されます。上記の hHandle を返す GetHandle への呼び出しも追加したため、dllが動作していることがわかります。パラメーターを int ref int watchmode )に変更しようとしましたが、同じエラーが発生しました。上記の呼び出しをPInvokeする方法を知っている人はいますか?

役に立ちましたか?

解決

C#とC ++のパラメーターサイズの問題が発生しています。 C ++ / windowsの世界では、LONGは4バイトの符号付き整数です。 C#の世界では、8バイトの符号付き整数です。 intを取得するには、C#署名を変更する必要があります。

ffpfは、ここでIntPtrを使用する必要があると言っているのは間違っています。 IntPtrはintとしてマーシャリングするため、32ビットマシンでこの特定の問題が修正されます。これを64ビットマシンで実行すると、8バイトの符号付き整数として再びマーシャリングされ、クラッシュします。

他のヒント

マネージド、ネイティブ、およびCOM相互運用チームは、codeplexでPInvoke Interop Assistantをリリースしました。適切な署名を作成できる可能性があります。 http://www.codeplex.com/clrinterop/Release/ProjectReleases。 aspx?ReleaseId = 14120

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top