2011-03-22 3 views
1

私は、特定のC構造体に基づいてフォーマットされたデータへのポインタを返す(そして受け入れる)良い関数を持つ "ネイティブ" DLLを持っています。構造体へのポインタを返す(そして受け入れる)ネイティブDLL関数を呼び出す

私のC#プログラムでは、構造体の内部構造については気にしません。ネイティブ関数を取得して渡すだけです。私はすでにDLL内の関数をピンボケしてしまった。 ポインターについては、ポインタード構造体の内部フィールドを気にしないので、void *を使用することを考えました。ポインタを格納して使用するだけですそれをDLLライブラリ関数に渡します。

しかし、多くの種類のデータにvoid *を使用すると、コードが判読できなくなります! C#でtypedef void * some_nicer_type_tに何か方法がありますか?そういうことをするのか?

答えて

2

IntPtrをご利用ください。 MSDNから

ポインタまたはハンドルを表すために 使用されるプラットフォーム固有の型。

これは、最終的に非unsafeコードを書く際に役立ちます。

EDIT:この質問へのコメントに反復よう

ご希望のニーズに対応するために、私は(理想的になるこの提案ではないが)提案するかもしれない一つのことは、本質的であるstructまたはclassを定義することですポインタのラッパー:

public struct TypedPointer 
{ 
    public IntPtr UnderlyingPointer; 
} 

あなたとあなた自身が立ち上げ、これはすべてあなたがしたいの使用と使用の美学に適合させるためにも、より多くのコードをラップにつながる可能性があります。

+0

ありがとうございますが、IntPtrはすべてのためにIntPtrを維持しています。それはきれいにすることができますが、私にとっては、ボイド*のように面倒で無意味です。私はtypedef IntPtr someothertype_tしようとしましたが、コンパイルされません。どうすれば新しいタイプを定義できますか?私はいくつかのオブジェクトの内側にIntPtrをラップするようないくつかの回避策を使用する必要がありますし、同様に関数のラッパーを使用する必要があります。うん、迷惑な。 – gd1

+0

@Giacomo:私の答えは更新されましたが、実際には更新されたコメントと重複しています。 –

+0

お世話になりました。ありがとうございました。このソリューションは、実行可能な最高のものです。 – gd1

1

のIntPtr

移動するための方法です。
注意しなければならないのはメモリ管理だけです。安全でないかどうか - C#には参照が必要です。そうでなければ、おそらく外部のDLLのうちの1つがそれを使用しているときにも、ガーベジコレクションされます。したがって、IntPtrへの参照がC#側でも必要なだけ長く保持されるようにする必要があります。

+0

私はこのやり方をする – gd1

関連する問題