概要
C#の単体テストでDLLのロードに失敗した。簡単に解決できると思っていたがなかなか解決できなかった。今後、同じようなミスを犯さないよう、ミスの内容を記述する。
環境
OS:Windows 10
IDE:Visual Studio 2010
現象
C#のコードから呼び出すネイティブDLLに次のようなコードがあり、ロードに失敗していた。
WCHAR* dllPath = "Hoge.dll";
::LoadLibrary(dllPath); // ここで失敗
実行アプリのディレクトリには"Hoge.dll"があること、またデバッグ実行ではロードに失敗しないことから、ロードできないはずはないと思い込んでいて、解決に時間がかかった。
原因
分かってしまうと簡単で、カレントディレクトリが実行アプリのディレクトリでなかったため。
単体テストの時はカレントディレクトリが下記のような位置になる。
"D:\Projects\TestResults\user_pc 2018-05-21 17_52_47\Out"
そのため、単体テスト中はロードできなかった。
※デバッグ実行時はカレントディレクトリが実行アプリのディレクトリになっているからロードできていた。
対策
下記の方法が考えられるが、モジュールに手を加えられないため後者の方法を使用した。
1. ネイティブDLL内のLoadLibraryで指定するモジュールパスを、実行アプリのディレクトリを付加した形式にする
2. 単体テスト実行時に、Directory.SetCurrentDirectory()を使ってカレントディレクトリを実行アプリのディレクトリに変更する