1

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

4

2 に答える 2

8

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

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

于 2008-09-29T18:33:13.273 に答える
4

Managed、Native、および COM Interop チームは、codeplex で PInvoke Interop Assistant をリリースしました。たぶん、適切な署名を作成できます。 http://www.codeplex.com/clrinterop/Release/ProjectReleases.aspx?ReleaseId=14120

于 2008-10-17T03:11:22.370 に答える