3

いくつかのヘッダー、cpps、いくつかの lib ファイル、および DLL ファイルで構成される C++ プロジェクトがあります。

これらのファイルを C# プロジェクトで使用するためにラップしたいと考えています。

私は、すべての C++ プロジェクトを含む 1 つの DLL を作成し、それを C# クラスでラップして、それを操作できるようにしたいと考えていました。

だから私の質問は(Visual Studio 2010での作業)です:

  1. 最終的な DLL ファイルを作成する方法を教えてください。

    a. lib ファイルをプロジェクトにリンクする方法は知っていますが、DLL をリンクするにはどうすればよいですか?

    b. ヘッダーで宣言された関数 (lib ファイルに実装されている) を DLL にインポートするには、ヘッダーに何を追加する必要がありますか。(__declspec とは)?

  2. 最終的な DLL ファイルをビルドした後、この DLL ファイルを使用する C# プロジェクトを作成するにはどうすればよいですか?

前もって感謝します

4

2 に答える 2

2

これは (COM) InterOp と呼ばれます。さいわい、元の .NET Framework の主な設計目標の 1 つは、マネージ コードとアンマネージ コードの間の相互運用性を容易にすることでした。大まかに言えば、マネージ コードを処理するときに達成したい相互運用性には、3 つの異なる種類があります。

  • マネージド コードから COM コンポーネントを呼び出す

  • マネージ コードからネイティブ DLL を呼び出す。これは、プラットフォーム呼び出しまたは口語的に PInvoke として知られています。(これはあなたが望むものです)

  • マネージ コードをランタイム呼び出し可能ラッパー (RCW) でラップすることにより、COM コンポーネントがマネージ コードを呼び出せるようにします。これは、レガシー コードを計画的に部分的に置き換えるための戦略として使用できます。

マネージド レルムからアンマネージド レルムにデータを移動するプロセスは、マーシャリングと呼ばれます。これは、データとそれに関連付けられた型が何らかの境界を越えてシリアル化される名前です。このプロセスをサポートするために、System.Runtime.InterOp 名前空間に存在するクラスのコレクションがあります。

大まかに言えば、プロセスは基本的に次のとおりです。

  • 関数名を決定する (私は Dependency Walker を使用しています)
  • 関数シグネチャを決定します (MSFT の場合は MSDN で調べてください)。
  • コードで必要なデータ型と構造を決定する
  • 上で決定した基準を満たすネイティブ コードを呼び出すマネージド コードを記述します。
  • 記述後のラッパー コードをテストして、期待どおりの結果が得られることを確認します (これは多くの場合、最も退屈な部分です)。
于 2013-11-07T11:56:41.383 に答える
1

C++/CLI を探しています。このハイブリッドを使用すると、任意の量の通常の C++ コードを含めることができる dll を記述でき、そのインターフェイスに .NET 型 (System.String など) を使用して通常の C++ 型を内部で処理できるマネージ クラスを含めることができます。その dll は、他の .NET dll と同様に C# から使用できます。呼び出しプログラムの観点からは、C# で記述したように見えます。

通常、回答には実用的な例が含まれている必要がありますが、C++/CLI はカバーする大きな分野であるため、シナリオを説明するだけの本を書くことができます。ここに優れたチュートリアルがあり、ここに優れた概要があります

于 2013-11-07T11:56:03.547 に答える