開発環境
Visual Studio Community 2019
前置き
昔UnityのC#を使っていた際、C#の知識をチームに教えるより、経験あるC++で作成したDLLを作っていたことがあります。
当時書いたDLLに関する記事はこちら。
Unity(C#)でC++で作成されたDLLを使用する基本的な方法
そして現在、大学の研究室でC#を利用する機会を頂き、同じようなソースコードでDLLを実装したのですが、何故かエラーが出てくる状態に…。
それを解決するまでの経緯を記事にしておきます。
経緯
DLLをダンブして関数が機能しているか確認する
上記記事のように、超単純なDLLでテストしても「DLLはあっても関数が存在しない」例外が出て、もしかしたら関数名がおかしいのでは?と思って、バイナリファイルをダンプして関数があるか調べました。
こちらの記事を参考にして、
- Visual Studioの「ツール」->「コマンドライン」->「開発者用PowerShell」を選択
- 以下のようにコマンドを入力
dumpbin /exports Debug\example.dll > output.txt
こうすることで、Visual Studio内でデバッグ出力したDLLの関数の詳細がslnファイルがあるフォルダに生成されます。
生成されたテキストファイルを見てみると、関数がよくわからない名前になっていました。
__stdcallがついてるか確認する
恐らくコンパイルしたときに何かの手違いで変な名前にされた可能性があると思い、他のDLLに関するソースコードを漁って比較しました。
そうすると、多くのソースコードに呼び出し規約である
__stdcall
を、関数を宣言する際に使われていました。そこで、
extern "C"
{
__declspec(dllexport) void __stdcall example()
}
void __stdcall example()
{
...
}
のようにすることで、C#側でしっかり利用できるようになりました。
まとめ
今回学んだことは以下の2つです。
-
DLLのエラー困ったらdumpbinで確認する
-
呼び出し規約「__stdcall」をつける