.NET Framework

プロジェクトの構成

プロジェクト作成の抜粋:

  • Win32 Console Applicationでプロジェクトを構築
  • Application type: DLL
  • Application options: "Emptyp project" "Security Development Lifecycle(SDL) checks"

プロジェクト設定の抜粋:

  • 「構成プロパティ」→「VC++ディレクトリ」内の「インクルードディレクトリ」(Headerファイル)と「ライブラリディレクトリ」(libファイル)を設定する
  • 「構成プロパティ」→「リンカー」→「全般」の「追加のライブラリ ディレクトリ」(libファイル)を設定する
  • 「構成プロパティ」→「リンカー」→「入力」の「追加の依存ファイル」(libファイル行ごと)を設定する

上記の設定が漏れた場合は、以下のエラーが発生する可能性が高い

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】

コメント:



(画像の文字列を入力して下さい)

トップ   編集 凍結 差分 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2019/12/02 (月) 12:33:33 (1628d)

e[NȂECir Yahoo yV LINEf[^[Ōz500~`I
z[y[W ̃NWbgJ[h COiq@COsیI COze