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