3

同僚、

前文。私の質問は、ベストプラクティスについてです。私は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ポインターを渡すことができるようにするには、宣言を次のように変更する必要がありました。

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

IntPtr.Zeroこれでポインタを渡すことができnullますが、パラメータは強く型付けされなくなりました。与えられた状況で、強く型付けされたパラメーターとnullポインターを渡す機能の両方を持つ方法はありますか?

どんな提案、洞察または参照も本当にありがたいです!

乾杯、
-ニック

4

1 に答える 1

3

公開したい正確なAPI(強く型付けされているなど)でラッパーメソッドを使用し、そのラッパーメソッドでプライベートのDllImportメソッドを呼び出すことは珍しくありません。つまり、rawメソッドがマネージAPIを強制する必要がある理由はありません。

于 2010-12-27T06:13:34.703 に答える