亀岡的プログラマ日記

京都のベッドタウン、亀岡よりだらだらとお送りいたします。

C# -> C++/CLI -> C++ の関数コール。

なんかやたらとはまってしまったので、メモ書き代わりに。
いや、ほんと、このMSDN通りにやったらできるはずなんですけれどね・・・

でも、やっておきましょう。一応、C#から呼び出すまで。

まず、C#の実行可能なアプリと、C++/CLIでクラスライブラリを作っておきます。
f:id:posaunehm:20120202231501p:image

そこに、Win32スタティックライブラリとしてプロジェクトを追加します。
f:id:posaunehm:20120202231712p:image

次に、プロジェクトプロパティ→共通→新しい参照の追加→プロジェクトタブ とたどり、追加したスタティックライブラリを選択します。ここでライブラリディレクトリへのリンクと追加のライブラリファイルについては設定が完了します。
ただし、ヘッダファイルのインクルードディレクトリは追加されてないので、それはプロジェクトプロパティ→構成→C/C++より追加のインクルードディレクトリとして設定します。

そしてC++/CLIから呼び出すのですが、よく注意されるように、ここではネイティブクラスはポインタしか置けませんので、ご注意を。例えばこんな感じのクラスになります。

	private:
		CNativeClass* nativeClass;
	public:
		Class1()
		{
			nativeClass = new CNativeClass();
		}
		~Class1()
		{
			this->!Class1();
		}
		!Class1()
		{
			delete nativeClass;
		}

一応コレで完了です。エラーなく呼び出せるはず。

ちなみにはまったのは、

	private:
		CNativeClass nativeClass();

こんな感じでうっかりポインタじゃなくインスタンス化していたところ。これ、なんとエラーが

error LNK2020: 未解決のトークン (06000001) CLILibrary.Class1::nativeClass

とまるでリンクエラーのごとく出るのです。なのでリンカの設定を一時間ほどいじらされてしまいました。。。
もうちょっとCLIに優しくてもいいんじゃないかな、VS2010たん。。。