C# 入門 & 実践 / C sharp

101. アンマネージ DLL の使用 - 4 - 構造体


typedef struct {
	unsigned char* myBytes;// 8 バイトの値を取得
}MyStruct

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
struct MyStruct
{
       public IntPtr myBytes;
}


bool getBytes( MyStruct ms )

        [DllImport(@"E:\Felica\Japanese\FeliCa_Library\bin\felica.dll")]
        private extern static bool getBytes(ref myStruct );

こんな感じで。IntPtrに置き換えておきます。

main の中で
GCHandleを利用してガベージコレクションでメモリのアドレスが変わらないようにします!

MyStruct ms = new MyStruct();
byte[] id_code = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
GCHandle gch = GCHandle.Alloc(id_code, GCHandleType.Pinned);
ms.myBytes = gch.AddrOfPinnedObject();

// 関数呼び出し
getBytes( ms );

// メモリ解放
gch.free();
これで unsigned char* として利用できます。
この要領で、構造体の中のポインタ利用部分は IntPtr を渡す形で対応できるようです。



101. アンマネージ DLL の使用 - 3 - 文字列、参照渡し « 101. アンマネージ DLL の使用

C# 入門 & 実践 / C sharp