以下の記事を参考にして,C#からC++の関数を呼び出すサンプルを作ってみた. C#から、C++の関数の実行(関数)
とりあえず,説明通り動いた.この記事ではネィティブコードのDLLを生成し,それを呼び出すラッパクラスを別プロジェクトでビルドしている.DLLのヘッダでは以下を宣言して使っている.
#ifdef NATIVEFUNC_EXPORTS
#define NATIVEFUNC_API __declspec(dllexport)
#else
#define NATIVEFUNC_API __declspec(dllimport)
#endif
namespace Native
{
// num個のint配列srcから、最大値とそのインデックスを探す関数です
NATIVEFUNC_API void Max(int* src, int num, int* mx, int* mxIndex);
}
ラッパクラスの関数の中では以下のように生ポインタをピン止めするという操作を行っている.
void Wrapper::WrapperClass::Max(array<int>^ src, int num, int% mx, int% mxIndex)
{
// ★ここがポイント
// 実行中、ガベージコレクションされないように、pin_ptrを使って固定する
pin_ptr<int> psrc = &src[0];
pin_ptr<int> pmx = &mx;
pin_ptr<int> pMxIndex = &mxIndex;
// 自作関数実行
Native::Max(psrc, num, pmx, pMxIndex);
// ★ここがポイント
// 固定解除
psrc = nullptr;
pmx = nullptr;
pMxIndex = nullptr;
}
C++プロジェクトでは「シンボルのエクスポートにチェック」となっているが,VS2019の画面ではこのようなオプションは表示されない.また,C++では出力ファイルをDLLとしているのに,ラッパクラスのプロパティ → リンカー → 入力 →追加の依存ファイルではLIBが設定されているというのもよく分からないところだ.