2009-03-22 6 views
1

C#のネイティブCOM関数にアクセスしてC#から相互運用するベストプラクティスはありますか?C#のネイティブCOM関数にアクセスしてC#から相互運用するベストプラクティスはありますか?

たとえば、コアウィンドウコンポーネントとやり取りする100個のC++メソッド(基本的にはネイティブライブラリ)があるとします。

私は基本的にC#でこれらのC++メソッドのラッパーを作っていますので、新しく雇われた従業員はC++などの代わりにそれを使用できます。C++コードは古くて恐怖です。一度。対応するC#メソッドを持つ各メソッドのアプローチはここにありますか?実際、これを行う別の方法がありますか?

何らかのラッパーサブシステムを使用できますか。どのように人々は一般的にこれを行うのですか?

また、パフォーマンスに関する考慮事項などはありますか?

答えて

7

C++メソッドがCOMオブジェクトにある場合は、C#のCOM interopを使用できます。良い紹介については、CLR Inside Out: Introduction to COM Interopを参照してください。

これらのC++メソッドが従来のAPI呼び出しに似ている場合は、プラットフォーム呼び出し(PInvoke)を使用することをお勧めします。これは、アンマネージ(C++関数)のC#でマネージプロトタイプを作成することを必要とします。始めるのに適した場所はPlatform Invoke Tutorialです。

パフォーマンスに関する考慮事項については、一般的に心配することはほとんどありません。 C#からの呼び出しは、多くの場合、データをマーシャリングすることによって、C++から直接呼び出すよりはるかに遅くなる可能性があります()。呼び出しているコードが重要なループに入っていない限り、あなたは何の違いにも気付かないでしょう。

本当にそれらのネイティブ関数が何をするかによって異なります。管理されていない世界と管理されている世界の間でデータを共有するほど、プロセスが難しくなります。特定の機能に関する詳細情報がないと、どこに問題が発生する可能性があるかを言うことは難しいです。

+0

COMは私が何とか傾いていると思います。だから、基本的に私の関数用のCOMラッパーを作成して、すべてのC++関数(レガシー)は別のラッパー(新しいC++ Comのもの)を持っていて、これは他人(私の新しい人材!! –

+2

まだCOMでない場合は、私はCOMラッパーを作るのをためらうでしょう。私はもっ​​とネイティブ関数を呼び出すためにPInvokeを使うC#でOOラッパーを作る傾向があるでしょう。しかし、それは経験に基づいた一般的なアドバイスであり、あなたの個々の事例の知識はありません。 –

+0

私はC#をラップしても問題ないと思っています。あなたはCOMが/より速くなると思っています。 –

1

COM Interopを使用してライブラリをラップします。次に、C++コードを通常の方法で呼び出すことができる.NETネイティブコードとして多かれ少なかれ扱うことができます。

関連する問題