はじめに
Visual StudioにてDllを作成する方法は2つある。
- declspec(dllexport)を使う方法
- declspec(dllexport)を使わない方法
declspec(dllexport)を使う方法
- Win32コンソールアプリケーションを選択。
- アプリケーションの設定で、「DLL」と「空のプロジェクト」を選択。
- mydll.hを作成し、以下を記述する。
マクロはプロパティに記述されているものを使うと便利である。ここではDLLWITHEXPORT_EXPORTSを用いた。
そうでない場合は、下記の.cppの一番先頭(#include "mydll.h"の前)にそのマクロを
#define
すること。 Dllをビルドする場合は__declspec(dllexport)
が使われ、ヘッダとして公開される場合は__declspec(dllimport)
が使われる。 - mydll.cppを作成し、以下を記述する。
- ビルドする。DebugあるいはReleaseフォルダ内にプロジェクト名と同じ名前の.lib/.dllファイルが作成される。
- できあがったDllを使うため、通常のコンソールアプリを作る。
main.cpp
を作り、以下を記述する。 「追加のインクルードディレクトリ」にmydll.h
へのパス、「追加のライブラリディレクトリ」にDllWithExport.libへのパスを記述する。「追加の依存ファイル」に
DllWithExport.lib
を記述する。DllWithExport.dll
を実行ファイルと同じフォルダにコピーするか、VSの検索パスに登録しておく(たとえば環境変数に、dllを含むフォルダへのパスを記入する)。 - 実行する。
declspec(dllexport)を使わない方法
- 先と同じようにDll用のプロジェクトを作る。
-
mydll.hを作成し、以下を記述する。
__declspec(dllexport)
がないことに注意。 - cppと同じフォルダ内に
mydll.def
を作成し、以下を記述する。LIBRARY
と同じ行にdll名(プロジェクト名と同じ名前のdll)を、EXPORTS
の下に一行ずつexport
する関数名を書く。これがdllexport
の役割を果たす。 - プロパティの「モジュール定義ファイル」にmydll.defを記述する。
- ビルドする。
C#からの呼び出し
- 空のプロジェクトを作る。
- DllTest.csファイルを作り以下を記述する。
8,9行目でdllから関数
add
を取り出し、Add
という名前の関数を定義している。 同じ名前のまま使用するなら、EntryPoint
の記述は必要ない。 - 実行すると失敗する。 「DLL 'DllWithExport.dll'の'add'というエントリポイントが見つかりません」
- dllを作成する際、以下を記述した。 このとき、C++のコンパイラは関数の名前を装飾する。したがって、dllから明示的に関数を取り出す場合、その装飾された名前を指定しなければならない。これを避けるには、Dllを作るとき名前装飾が起こらないようにすればよい。 以下のようにする。 つまり、Cの規約にしたがって関数名を作成する。
- これで実行できる。
- C++のdoubleとC#のdoubleは自動的に対応付けられる。明示的に対応付けが必要な場合はMarshallingなる機能を使う。
0 件のコメント:
コメントを投稿