46

インターフェイスとして単一のクラス (COM ではなく...単純な C++ クラス) をエクスポートするだけのアンマネージ C++ DLL があります。このクラスを C# で使用したいのですが、単に C# にインポートすることはできないと言われました。

私の C# アプリケーションでこのクラスを使用する正しい方法は何ですか?

4

5 に答える 5

44

クラスFooを想定した簡単な方法:

  1. C++/CLI プロジェクトを作成し、これを FooWrapper と呼びます。
  2. FooWrapper をアンマネージ dll に依存させます (ただし、通常はそうします)。
  3. タイプ Foo* の単一のプライベート インスタンス フィールドを含むマネージ クラス ManagedFoo を作成します。
  4. 基になるインスタンス フィールドに転送する ManagedFoo のパブリック ラッピング関数を提供します。
  5. 必要に応じて (推奨されますが):
    • パラメータを .net イディオム (文字列など) から C++ イディオム (std::string または char*) に変換します。
    • アンマネージ例外をキャッチし、代わりにマネージ例外をスローする

次に、C# コードを FooWrapper project/dll に依存させ、アンマネージ dll が適切にデプロイされていることを確認します。その方法は、アンマネージ dll によって異なりますが、通常は同じディレクトリで十分です。

関数がクラスのインスタンスに依存しない場合、さらに単純なのは P/Invoke です

于 2009-02-20T13:53:43.033 に答える
8

この答えは、単一のクラス ライブラリにはやり過ぎかもしれませんが、SWIG は、他の言語から使用する C/C++ クラスを "ラップ" するための優れたソリューションです。C# でうまく動作します。

見る http://www.swig.org/

于 2009-02-20T14:24:35.877 に答える
3

DllImport が最善の策です。特に構造体を渡す場合は、少しデータ型のマッサージがありますが、それを使ってほとんど何でもできます。

于 2009-02-20T15:18:24.780 に答える
2

管理対象/非管理対象の境界を橋渡しするには、プロキシ (GoF パターン) 仲介が必要です。

2 つのオプション:

  • C++/CLI ラッパー
  • COM ラッパー。

前者はより直接的であり、後者は純粋な C++ -> COM -> .NET の 2 つのステップで構成されます。

于 2009-02-20T13:55:12.450 に答える
2

場合によっては、独自の C インターフェイスを提供する方が簡単です。 SWIGのセットアップは簡単ではありません。マネージ C++ と C++/CLI を使用していますが、問題ありません。最も簡単な方法は、C ラッパーを実行することでした (ほとんどの言語には C 関数を呼び出す方法があるため、他のほぼすべての言語で使用できます)。

于 2009-02-20T21:01:22.800 に答える