(Visual Studio 2005 で検証)
フォームアプリケーションなどの VC++ .net プロジェクトにおいて、プロジェクトのプロパティ設定画面を開き、[構成プロパティ]→[全般]を開く、
[共通言語ランタイムサポート]が「純粋MSIL共通言語ランタイムサポート /clr:pure」になっているので、
「共通言語ランタイムサポート /clr」にする。
プロジェクト作成直後は「純粋MSIL共通言語ランタイムサポート /clr:pure」になっている。
この場合、CLR に対応していない(__clrcall 規約を用いないで作成した)、C/C++ の関数をリンクすると、以下のリンカエラーが発生する。(例として FuncText という関数を実装)
error LNK2031: "extern "C" void __clrcall FuncText(void)" (@$$XXXXXXZ) の p/invoke を生成できませんでした。 呼び出し規約がメタデータに見つかりません。
error LNK2028: 未解決のトークン (0A00000C) "extern "C" void __clrcall FuncText(void)" (@$$XXXXXXZ) が関数 "int __clrcall main(〜略)" (@〜略) で参照されました。
error LNK2019: 未解決の外部シンボル "extern "C" void __clrcall FuncText(void)" (@$$XXXXXXZ) が関数 "int __clrcall main(〜略)" (@〜略) で参照されました。
加えて、__declspec(dllimport) を使用していると以下の警告も出ます。
warning C4272: 'FuncText' : __declspec(dllimport) に設定されています。 関数をインポートするときは、ネイティブ呼び出し規約を指定しなければなりません。
CLR に対応した関数で定義すれば、VB や VS でも使用できるようになりますが、関数定義などコードの修正が必要になります。既存のライブラリやオープンソースのライブラリなどを用いる場合は、この設定が必要になるでしょう。
以下を参考にした。
http://blog.mystorage.jp/2008/07/visual-c-express-edition-2008.html
(リンク切れ)
[MSDN LNK2031]
http://msdn.microsoft.com/ja-jp/library/ms173734.aspx
[MSDN __clrcall]
http://msdn.microsoft.com/ja-jp/library/ec7sfckb(VS.80).aspx