2010-12-27 12 views
3

同僚、ref、ヌルポインタ、IntPtrで構造体を渡すことに関するInteropの質問

プリアンブル。私の質問はベストプラクティスの詳細です。私は1つの回避策を知っています。これは、C#での相互運用性を処理しなければならないのは初めてですが、同時にCとC++で相当量のコードを書いています。

アンマネージDLLによって公開されている関数の2倍を呼び出す必要があります。この関数は、構造体へのポインタを引数として取ります。初めてnullポインタを渡す必要があります。 2回目は、構造体のインスタンスへのポインタを渡す必要があります。

この関数には6つのパラメータがあります。以下では、この質問の目的で機能する簡単な宣言を示します。 (誰もが興味を持っている場合、私は詳細を投稿することができます。)ここでは、宣言の第一変種です:

[DllImport("setupapi.dll", CharSet = CharSet.Auto, SetLastError = true)] 
    static extern bool foo(ref NEEDED_STRUCT_TYPE sDataStruct);

私はそれが好き、それは強く型付けされたNEEDED_STRUCT_TYPEのためだからです。しかし、NULLポインタを渡すことができるように、私は今、私はnullポインタにIntPtr.Zeroを渡すことができ

[DllImport("setupapi.dll", CharSet = CharSet.Auto, SetLastError = true)] 
    static extern bool foo(IntPtr sDataStruct);

に宣言を変更しなければならなかったが、パラメータはもはや強く型付けされません。与えられた状況では、強く型付けされたパラメータとヌルポインタを渡す能力の両方を持つ方法がありますか?

どのような提案、洞察力または参照は本当に感謝しています!その後、ニック

答えて

3

それはあなたが(など、強く型付けされた)を露出する正確なAPIでラッパー・メソッドを使用することも珍しくありませんし、そのラッパー・メソッドは、DLLIMPORTメソッドを呼び出すようにするには、どの -

乾杯、
プライベートです。言い換えれば、rawメソッドがマネージAPIを強制する必要はありません。

関連する問題