ネイティブ C++ から C# ライブラリを呼び出す方法 (C++\CLI と IJW を使用) 質問する

ネイティブ C++ から C# ライブラリを呼び出す方法 (C++\CLI と IJW を使用) 質問する

背景:より大きな課題の一環として、C# ライブラリをアンマネージ C++ および C コードからアクセスできるようにする必要があります。この質問に自分で答えるために、ここ数日/数週間、C++/CLI を学習してきました。

アンマネージ C++ および C から C# dll を使用するには、さまざまな方法があるようです。簡単に答えると、Interlope サービスを使用する、.com. および regasm を使用する、PInvoke を使用する (C# から C++ のみに移行するようです)、C++/CLR で IJW を使用する (Interlope サービスのようです) などです。ネイティブ C++ および C コードの代わりに IJW を使用して C# dll を呼び出す CLR ラッパーのようなライブラリを設定するのが最善だと考えています。

詳細:C++ コードから C# dll に文字列と int の値を渡し、void を返す必要があります。

関連性:多くの企業では、C++、C、C# を混在させる言い訳がたくさんあります。パフォーマンス: アンマネージ コードは通常高速です。インターフェイス: マネージ インターフェイスは一般に保守や展開が簡単で、見た目も優れていることが多いと、マネージャーも言っています。レガシー コードもそれを強いています。それはそこにありました (私たちが登った山のように)。C# から C++ ライブラリを呼び出す方法の例は豊富にありますが、C++ コードから C# ライブラリを呼び出す方法の例を Google で検索するのは困難です。特に、更新された 4.0+ コードを見たい場合です。

ソフトウェア:C#、C++/CLR、C++、C、Visual Studio 2010、および .NET 4.0

質問の詳細:OK、複数部構成の質問です:

  1. COM オブジェクトを使用する利点はありますか? または PInvoke ですか? あるいは他の方法ですか? (Google Land でこのトピックに関する詳細情報を見つけたとしても、ここでの学習曲線は同じくらい急峻になると思います。IJW は、私が望むことを実現してくれそうです。IJW ソリューションを探すのをあきらめて、代わりにこれに集中すべきでしょうか?) (利点/欠点?)

  2. C++/CLR で IJW を利用するラッパーを作成するという解決策があると考えるのは正しいでしょうか。このトピックに関する詳細情報はどこで入手できますか。Google で十分に調べなかったとか、MSDN で調べたとか言わず、どこで見たかを教えてください。(明確でシンプルなコードを書くために、このオプションの方がよいと思います。)

  3. 質問の範囲を絞り込む: 私の本当の問題とニーズは、次の小さな質問に答えることだと感じています。アンマネージ C++ ファイルが Visual Studio 内で使用できる C++/CLR ライブラリを設定するにはどうすればよいですか。アンマネージ C++ コードでマネージ C++ クラスを単純にインスタンス化できれば、残りの部分 (インターフェイスやラッピングなど) を解決できると思います。私の主な失敗は、Visual Studio 内で参照や #include などを設定しようとしていることだと思いますが、明らかに他の誤解がある可能性もあります。おそらく、この全体の答えは、これに役立つチュートリアルまたは手順へのリンクだけかもしれません。

研究:私は何度も Google や Bing で検索し、ある程度成功しました。C# コードからアンマネージ ライブラリを使用する方法を示すリンクを多数見つけました。また、COM オブジェクトを使用してそれを実行する方法を示すリンクもいくつかあったことは認めます。VS 2010 を対象とした結果は多くありませんでした。

参考文献:私は何度も何度も多くの投稿を読みました。最も関連性の高いものを試してみました。いくつかは答えに非常に近いように思えましたが、どうもうまくいかないようです。私が見逃しているものは、キーワード ref の誤用、#include または using ステートメントの欠落、名前空間の誤用、IJW 機能の実際の適切な使用、VS がコンパイルを正しく処理するために必要な設定の欠落など、非常に小さなものであると思われます。では、なぜコードを含めないのかと疑問に思うでしょう。そうですね、私は自分が理解できる段階ではなく、コードが機能すると期待できる段階ではないと感じています。理解できる段階になりたいのですが、そこまで到達したら、修正の助けが必要になるかもしれません。ランダムに 2 つのリンクを含めますが、現在の Hitpoint レベルでは、すべてを表示することはできません。

http://www.codeproject.com/Articles/35437/マネージドコードとアンマネージドコード間のデータの移動

これは、C++ から Visual Basic へ、そして C++CLR 経由でその逆の双方向で、マネージ コードとアンマネージ コードのコードを呼び出します。もちろん、私は C# にも興味があります。:http://www.codeproject.com/Articles/9903/Unmanaged Code からのマネージド コードの呼び出し

ベストアンサー1

これはかなり簡単にできます。

  1. .h/.cppコンボを作成する
  2. 新しく作成した .cpp ファイルで /clr を有効にします。(CPP -> 右クリック -> プロパティ)
  3. 「追加の #using ディレクトリ」の検索パスを C# dll を指すように設定します。

ネイティブ.h

void NativeWrapMethod();

ネイティブ.cpp

#using <mscorlib.dll>
#using <MyNet.dll>

using namespace MyNetNameSpace;

void NativeWrapMethod()
{
    MyNetNameSpace::MyManagedClass::Method(); // static method
}

これが、ネイティブ コードで C++\CLI から C# ライブラリを使用する基本です。(必要な場所で Native.h を参照し、関数を呼び出すだけです。)

C# コードをマネージ C++\CLI コードと共に使用するのはほぼ同じです。

この件に関しては誤った情報がたくさんあるので、これで誰かの面倒が省けるといいですね。:)


これを VS2010 - VS2012 で実行しました (おそらく VS2008 でも動作します)。

おすすめ記事