プロジェクトの構成 †プロジェクト作成の抜粋:
プロジェクト設定の抜粋:
上記の設定が漏れた場合は、以下のエラーが発生する可能性が高い error LNK2019: 未解決の外部シンボル TestCPPLibrary.h †ヘッダーファイルにnamespaceとクラス両方が入っている場合、下記のように定義する必要すれば、コンパイルできるだが、.NET側の呼び出しにも、namespaceとクラス両方を入れないと、ダメなので #ifdef TESTFUNCDLL_EXPORT #define TESTFUNCDLL_API __declspec(dllexport) #else #define TESTFUNCDLL_API __declspec(dllimport) #endif extern "C" { namespace xxxnamespace { class xxxClass { TESTFUNCDLL_API float TestMultiply(float a, float b); TESTFUNCDLL_API float TestDivide(float a, float b); } } エントリでは、namespaceとクラスが内容に定義したほうが便利 #ifdef TESTFUNCDLL_EXPORT #define TESTFUNCDLL_API __declspec(dllexport) #else #define TESTFUNCDLL_API __declspec(dllimport) #endif extern "C" { TESTFUNCDLL_API float TestMultiply(float a, float b); TESTFUNCDLL_API float TestDivide(float a, float b); } TestCPPLibrary.cpp †#include "TestCPPLibrary.h" extern "C" { float TestMultiply(float a, float b) { return a * b; } float TestDivide(float a, float b) { if (b == 0) { return 0; //throw invalid_argument("b cannot be zero!"); } return a / b; } } その他 †コンパイルしたDLLは.NETからアクセスできるかの判断は以下のコマンドで確認できる。 ※VS2012 x64 Native Tools Command Promptで入力する dumpbin.exe /EXPORTS xxx.dll 上記のコマンドでヘッダーファイルにnamespaceとclass あるとない両方を比較したら、以下の違いがある ordinal hint RVA name 1 0 00011230 ?TestMultiply@xxxClass@xxxnamespace@@QAEXXZ = @ILT+555(?TestMultiply@xxxClass@xxxnamespace@@QAEXXZ) 2 1 00011055 ?TestDivide@xxxClass@xxxnamespace@@QAEHXZ = @ILT+80(?TestDivide@xxxClass@xxxnamespace@@QAEHXZ) ordinal hint RVA name 1 0 00011267 TestMultiply = @ILT+610(_TestMultiply ) 2 1 000112E4 TestDivide = @ILT+735(_TestDivide ) 参考 http://ericeastwood.com/blog/17/unity-and-dlls-c-managed-and-c-unmanaged フレッツ光が月額556円~【GMOとくとくBB】 コメント: |