私自身のソリューションでは、4 つのプロジェクトがありました。
- C++ プロジェクトとテスト コード
- ダイナミック リンクを使用して最初のプロジェクト ソースから DLL をコンパイルするだけのC++ DLL プロジェクト
- 生の C++ をラップする、C++/CLI を使用する単なるアダプターであるラッパープロジェクト
- 私のグラフィカルインターフェイスであるC #WPFプロジェクト。
上記のリンクの私の翻訳は次のとおりです。
C++ DLL プロジェクト
C++ コードを DLL ライブラリにします。
- Visual Studio 内で、File > New > Projectに移動し、Visual C++ タブからWin32 プロジェクトを選択します。
- プロジェクトとソリューションの両方の名前を選択します。ソリューションにはすべてのプロジェクトが含まれます。
- Win32 アプリケーションのアシスタント内で、[次へ] をクリックし、[ DLL ]ボックスをオンにして、[空のプロジェクト] をクリックし、[完了] をクリックします。

追加するコード
これは、dll の C++ ヘッダーです (多くのものを除く)。
Token.h
#pragma once
#define DLLEXP __declspec( dllexport )
DLLEXP void pop_back(std::string& str);
DLLEXP std::string testReturnString();
DLLEXP int getRandomNumber();
CPP 内で変更するものは何もありません。
プロジェクトをビルドします。C# プロジェクトのデバッグ ディレクトリに含める DLL と LIB ファイルが必要です。
C++/CLI ラッパー
このプロジェクトは、前のプロジェクトのネイティブ コードと GUI のマネージ コードの間のインターフェイスとして機能します。
- 新しいプロジェクト (Visual C++ のクラス ライブラリ) (この例では "Wrapper" と呼ばれます) をソリューションに追加します。
- 追加のインクルード ディレクトリを使用して、ネイティブ プロジェクトへのパスを追加します。
- 新しいプロジェクトの参照としてネイティブ プロジェクトを追加します (右クリック > [参照...] > [新しいリンクの追加] ) 。
- Properties > Linker > Inputで、ネイティブ dll の名前を DLL の遅延ロード (この例では Computations.dll) フィールドに入力します。
C++/CLI コード
私のラッパーは、このようなクラスです(自分のコードを除く)。
Wrapper.h
#include "Token.h" // include your C++ header
#include <string>
#include <iostream>
namespace Wrapper {
// noticed the ref?
public ref class TokenAnalyzer
{
public:
TokenAnalyzer(){
};
void Init();
// use the C++/CLI type, like String^ (handles)
System::String^ ProcessLine(int lineNbr, System::String^ line);
};
}
を含める必要があることを除いて、CPP 内で特別なことは何もありません#include "stdafx.h"。
また、C# デバッグ ディレクトリ内に含める DLL にビルドする必要があります。
SOのどこかで見つけた便利な機能ですが、どこで必要になるか覚えていません。C++/CLI 文字列ハンドルを C++ 標準文字列に変換します。
std::string MarshalString (String ^ s) {
using namespace Runtime::InteropServices;
const char* chars =
(const char*)(Marshal::StringToHGlobalAnsi(s)).ToPointer();
std::string os = chars;
Marshal::FreeHGlobal(IntPtr((void*)chars));
return os;
}
C# プロジェクト
ソリューションに新しいプロジェクト ( C # Windows フォームまたはWPFまたは任意のもの) を追加し、それをスタートアップ プロジェクトとして設定します (右クリック > スタートアップ プロジェクトとして設定)。
- C++/CLI プロジェクトを新しいプロジェクトの参照として追加します
using Wrapper;ソースコード形式でディレクティブを追加
次のように使用します。
/// Store the C++/CLI Wrapper object.</summary>
private Wrapper.TokenAnalyzer mTokenAnalyzer = new TokenAnalyzer();
2016/05/06 更新
Ashwinは、サンプル プロジェクトと、さらに役立つ可能性のあるブログ投稿チュートリアルを作成するために時間を割きました。