C#でdllを使う時の引数の型(void**版)
- 題名: C#でdllを使う時の引数の型(void**版)
- 著者: midnight
- 日時: 2006/07/19 23:46:48
- ID: 16738
- この記事の返信元:
- この記事への返信:
- ツリーを表示
- 題名: Re[2]: C#でdllを使う時の引数の型(void**版)
- 著者: midnight
- 日時: 2006/07/20 13:00:18
- ID: 16747
- この記事の返信元:
- この記事への返信:
- ツリーを表示
- 題名: Re[4]: C#でdllを使う時の引数の型(void**版)
- 著者: midnight
- 日時: 2006/07/22 23:15:24
- ID: 16792
- この記事の返信元:
- この記事への返信:
- ツリーを表示
分類:[.NET]
C++で作成したdllをC#でimportして
利用したいのですが
引数 void** の型をどのように宣言すれば
よろしいでしょうか?
C++版で作成されたdllの関数は
仮に
void init(long* h , void** m)
void lock(long h,int cnt, void** m)
void unlock(long h, void** m)
となっていた場合
C#では以下のようにしました。
[DllImport("test.dll")]
static extern void init(long h,out IntPtr m);
[DllImport("test.dll")]
static extern void lock(long h, int cnt,out IntPtr m);
[DllImport("test.dll")]
static extern void unlock(long h,out IntPtr m);
呼び出しは
IntPtr m;
long h;
init(h,m);
lock(h,10,m);
unlock(h,m);
です。
この実装では、ビルドは通りましたが
実行時に、lock()を呼び出すと、例外が発生しました。
(null exception)
他にやったことは、
(1)IntPtrをやめてlongに変更 →例外エラー
(2)IntPtrをやめてMarshalAsを使用 →例外エラー
以下のように書きました
[DllImport("test.dll")]
static extern void init(long h,[MarshalAs(UnmanagedType.AsAny)] out object m);
他の関数も同様
(3)unsafeを使用 →例外エラー
[DllImport("test.dll")]
static unsafe extern void init(long* h,void** m);
他の関数も同様
呼び出しは
unsafe{
void* m;
long h;
fixed(void** address = &m){
init(&h,address);
lock(h,10,address);
unlock(h,address);
}
}
と書きました。同じようにlock()で例外が発生します。
ちなみにC++でdllを呼び出す場合、
以下のような実装で正常に動いています
ので,dll側に問題はないです。
long h;
void* m;
init(&h,&m); mのアドレスが取得される
lock(h,10,&m);
ここでmを別の型にキャストして値を代入してます
unlock(h,&m);
C#はじめて間もないです。