私はC++で関数を持っていて、DLLでエクスポートしました。 関数C#の配列として配列を含む構造体ポインタを渡す
LONG LOGIN(LPDEVINFO info);
LPDEVINFO
の構造体がある:
struct{
BYTE sSerialNumber[20];
} *LPDEVINFO;
LPDEVINFO
パラメータを渡すために、私は、マネージドコードでクラスを定義した:
class DEVINFO{
Byte[] sSerialNumber = new Byte[20];
}
、次いでP /呼び出しをこのように:
[DllImport ('MyDll.dll')]
public static extern Int32 LOGIN(DEVINFO info);
その後、
とは、C#でそれを呼び出す:私は、問題は、アレイsSerialNumber
によって引き起こされると考え
An unhandled exception of type 'System.AccessViolationException' occurred in WindowsFormsApplication1.exe
Additional information: Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
:私はこのコードを実行すると
DEVINFO info = new DEVINFO();
Int id = LOGIN(info)
、私はエラー以下ました。しかし、私はそれを正しい方法で定義する方法を知らない。
ありがとうございます! Fixed Size Buffersを参照してください
public unsafe struct DevInfo
{
public fixed byte sSerialNumber[20];
}
:
C++で 'LONG'が64ビット整数型として定義されている場合、関数を' extern Int64 LOGIN(DEVINFO info);または 'extern long LOGIN(DEVINFO info);としてエクスポートする必要があります。 '。あなたの 'DEVINFO'クラスについては、構造体にして、' [MarshalAs(UnmanagedType.ByValArray、SizeConst = 20)] 'という属性をバイト配列に適用します。 [この回答を参照してください](http://stackoverflow.com/questions/1354275/marshaling-a-byte-array-to-ac-sharp-structure) –
@ Jim 'LONG'はWindowsではCとC++の32ビット整数です。 –
ああ、私はそれが再定義されて見たことがあります。私はそれがなぜあるのか分からない。 –