VC++ .net で CLR 以外の Dll エクスポート Lib をリンクさせる方法

(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


Last-modified: 2011-04-03 (日) 15:36:49 (2505d)