2013-04-04 14 views
14

私はかなり大きなシステムをC++で実装していますが、やりとりする必要があります。このシステムにはかなり大きなAPI、いくつかのC++ DLLがあります。これらのDLLは、素晴らしいCスタイルのAPIとは対照的に、C++クラスをエクスポートします。私はそれらを新しいC#プロジェクトから使用する必要があります。 - 唯一のC APIの C++ APIをC#から呼び出す方法

  • COMに取り組んでいます
  • C++/CLI
  • オブジェクト

    1. P /呼び出し:私は.NETを知っているから、

      はネイティブソフトウェアとの相互作用の三つの方法があります

      私はそれを理解しているので、私はそれに応じて3つのアプローチがあります:

      1. Cでラッパーを作成し、P/Invokeで呼び出します。あまりにも多くの仕事のように思われる。
      2. COMを使用したラッパーの作成。それは私がどうやってやるのかわからないし、それが非常に簡単なものでなければ、私にとっては死にそうな技術を学ぶことには消極的です。
      3. C++/CLIでラッパーを書く。それでもまだ一番少ないようですが、それでもなおたくさんあります。

      私の質問:すべての

      1. まず私がなぜ.NET「であるとして、」私は単に C++クラスを使用することはできません知っていただきたいと思いますか?私はそれがメモリの問題だと仮定しています 管理。もし私がファイナライザを書こうと思っている以上に、 とIDisposableを実装しています。私が知っているからC++のクラスはちょうど です.P/Invokeは構造体をサポートしており、最初のパラメータとして構造体を取る関数 は、なぜ クラスをサポートしていませんか?

      2. 第2に、私は本当に怠け者で退屈で退屈な多くの人がいると仮定して、 の作業を行います。これらのDLLを使用するにはどうすればよいでしょうか?可能であればC#から直接呼び出す が最適です。そうでなければ、私は ラッパーを生産する自動ツールが大好きです。また、DLLが に変更されている可能性もありますが、IDはむしろわずかですが、idは強制的に強制されません。 は手動でラッパーを書き換えます。

      3. 本当に良い答えのために

      、特に最初の部分、または良い自動ツールを、私は恵みに報いよ...

      は、

    +0

    1に私の古い答えを参照してください。 –

    +2

    http://stackoverflow.com/questions/2120690/tool-for-creating-net-wrappers-for-a-com-dll –

    +0

    私はC++/CLIが良いと思います。私はC++エクスポートでこれをやっている経験はありません。 – chris

    答えて

    6

    あなたが怠惰な方法を使いたいなら、C++ラッパー用のC#ラッパーを生成するツールを使用することをお勧めします。そしてもちろんのようにラッパーを生成するためのツールは、より多くの情報についてはSWIG

    で、異なるDLLのは、別の呼び出し規約を持っているのでsimilar question

    +0

    私はSWIGの提案に対するあなたの答えを受け入れています。私たちはCラッパーにP/Invokeを使用することになりました。 –

    0

    私はそれを理解する方法ありがとうC++では、クラス内のメソッドの呼び出し規約はかなり面倒です。リンカーによって使用される.LIBファイルのレベルで、関数名は "装飾"されます(例えば、Name manglingを参照)。また、メモリ内のクラス変数のレイアウトは、おそらくC#と比較してC++のさまざまな実装の間で異なるため、Interop Marshalingはそのような大きなトピックです。だから私の推測では、マイクロソフトは低レベルの問題が多すぎると判断し、そのために余りにも難しいと判断して、それを価値あるものにすると考えています。

    P/InvokeとCOMオブジェクトを使用してC#をC++にリンクしましたが、C++/CLIは使用していません。私は何年もCOMでおしゃべりをしてきました。それは自分の言語に非常によく似ています。ですから、COMを一度もやったことがなければ、この段階でそれを学ぶ価値はないと思います。 C++/CLIを使用すると、Cインターフェイスを使ってすべてを絞り込むのではなく、オブジェクトにインターフェイスすることができれば、それが最適なルートだと思っています。

    関連する問題