littlewing

人間とコンピューターとメディアの接点をデザインするために考えたこと

Unityで利用する c++ のDLLを作成する。(Visual Studio 2017)

基本的に、以下のページにある手順で進めればNative Plugin を作成できるのですが 解説が、VS2013ベースになっているので、Visuai Studio 2017で実施した場合に ハマッた部分を、忘れないうちにスクショ付きでまとめました。

部分的にしか解説してないので、全体は以下のページを参照してください。

qiita.com

  • Visual Studio Community 2017
  • Unity 2017.3.0f3
  • Windows 10 Fall creator update

でやりました。


DLLビルド用のVSプロジェクトの準備

  1. 既存のソリューションに、DLL作成用のプロジェクトを追加する場合はこんな感じでスタート

f:id:pigshape:20180118122930p:plain

  1. DLLを作るのですが、この画面では、「c++ のWin32コンソールアプリケーション」を選択。 f:id:pigshape:20180118123005p:plain

  2. 次に表示されるこの画面で「アプリケーション設定」をクリックして、DLLを選択します。 シンボルのエクスポートも忘れないように。 f:id:pigshape:20180118123057p:plain

  3. Unityに出力するなら「SDLのチェック」は外さないといけないらしいです。

f:id:pigshape:20180118133326p:plain


で、コードを書く。ここは省略します。


exe形式で実行テスト

同一ソリューション内で、テストのためのexe用プロジェクトを作成したのであれば、 「参照の追加」を行うのが、手っ取り早いです。

f:id:pigshape:20180118131611p:plain

ただし、既存の外部DLLやlibを使う場合はこれではダメです。 そのような場合は、以下の3つを設定します。

  1. c++  > 全般 > 追加のインクルードディレクトリ include/フォルダを指定し、その中に.hファイルを置く f:id:pigshape:20180118131154p:plain

  2. リンカ >全般>追加のライブラリディレクトリ libフォルダを指定 f:id:pigshape:20180118131322p:plain

  3. リンカ >入力 >追加の依存ファイル libファイルを指定 f:id:pigshape:20180118131345p:plain


作成したDLLをUnity上で実行する

Unityからは

[DllImport("sample-opencv-dll")] private static extern int CountUp();
            Debug.Log(CountUp());
            Debug.Log(CountUp());
            Debug.Log(CountUp());

のような感じで呼びだすことができます。 「DllImport」にファイル名を書くときは拡張子 (.dll)を含めるとエラーになるので含めません。


libで追加ライブラリを指定した場合は、そのdllもPlugins内に配置しておかないと、

Plugins: Failed to load 'Assets/Plugins/x86_64/xxxxxxxx.dll' with error '指定されたモジュールが見つかりません。
'.

という警告や

DllNotFoundException: Failure has occurred while loading a type.

という例外エラーが発生するので、関連DLLの配置もお忘れなく。


おまけ 既存DLL ( or lib ) の中身を解析する方法

スタートメニューから[開発者コマンド プロンプト for VS2015]を起動する

  • DLLのインターフェースを確認する
cd (DLLの場所)
dumpbin  /exports xxxxx.dll
  • dllが32bitか64bitか確認する。
dumpbin   /HEADERS xxxxx.dll | findstr machine