2009-07-01 6 views
2

私たちは、ネイティブのWin32 C++コードと、C++コードから呼び出すC#アセンブリのセットを持っています。私はoptiosを次のように要約します:C++のC#オプションを呼び出す

  1. COMを使用してください。 C#コードは、追加の属性(GUID、COMVisible)で装飾する必要があります。 C#アセンブリはregasmに登録する必要があり、COM経由でネイティブC++コードで使用できるようになります。

  2. C++/CLI(以前は管理されていたC++)ラッパークラスを使用します。 C++クラスをネイティブC++プロジェクトに追加することができます。そのクラスは/ clrでコンパイルされます。ネイティブのC++コードは、C++/CLIクラスを呼び出して、.NETコードを呼び出します。 COMは関与していません。 CLRは、C++/CLI拡張で処理されたマーシャリングで必要に応じて魔法によって開始されます。

  3. ネイティブのC++コードでCLRのインスタンスをホストします。

私はラッパークラスの必要性を失う以外に、オプション2よりも利点がわかりませんので、オプション3をディスカウントします。ですから、オプション1とオプション2の長所と短所は何ですか?

ありがとうございます。

答えて

3

オプション2は、最もシームレスでメンテナンス性の高いIMOとなるでしょう。

私が見つけたオプション1には本当に利点はありません。 C++/CLIを使用すると、はるかに機能し、動作が速く、一般的にははるかに単純になります。

また、ラッパークラスを持たずにC#アセンブリを直接使用することもできます。これには、/ CLRで使用するファイルをコンパイルする必要がありますが、かなりうまく動作します。

1

オプション1の場合、あなたのメインプロはあなたのプロジェクトに応じて髪型を得ることができるラッパークラスを書く必要はありません。

オプション2では、管理対象ライブラリを変更しなくても、管理対象外の使用を容易にすることができます。これはオプションではない場合があります。

私の場合は、コードを変更したい場所になります。

1

オプション2を使用すると、アプリケーション全体をC++/CLIに変換して、管理対象/管理対象外の移行を避けることができます。遷移は、参照されたアセンブリをどのように使用するか、つまりパフォーマンスが低下するかによって問題になる可能性があります。

これまでのところ、私はC++/CLIで肯定的な経験しか得ておらず、そのルートを推薦することができます。