VC(C++/CLI)でビルドしたDLLがC#からロードできず4時間もハマった事案が発生したので、解決策を書き留めておく。
事象
開発環境がインストールされていない環境でのみ発生する。
該当のDLLに含まれるクラスのインスタンスを生成するところで"アセンブリまたはファイルが見つからない" (FileIOException)が発生する。
DLLはexeと同じ場所に置かれている。
DLLの内容はネイティブコード(C++, 非CLI)で書かれたロジックのラッパークラス。
アプリ(exe)はC#。
原因
VCのビルド設定がDebugプロファイルになっていた。
詳細
アプリ構成としてはネイティブC++のラッパークラス(DLL)を内部で使用するライブラリ(マネージド/C#)をアプリ(C#)から呼び出すというもの。
当初Visual Studioのインストールされた開発マシンで動作を確認、うまく動いてそうなので、Windowsタブレットでの動作を確認するためにリモートデバッガを使って動作させたところDLLが読み込めず例外を吐いて終了…
いろいろ調べたところDLLファイルが見つからないわけではなく、アセンブリのシグネチャが違うか、DLL内部で参照しているアセンブリが見つからないことが原因と思われる。
frameworkバージョンの違い影響など色々と調べて試行錯誤の末、VC側でDLLのみRelease版でビルドしたとろあっさり動作した。
デバッグのため、DLL、ライブラリ、アプリともにDebugプロファイルとしていて、C#で書いたライブラリとアプリ本体はDebugのままで問題なく動作していたのでハマってしまった。
なお、原因からすると当然だが、リモートデバッガの有無には関係なく複数のPC、OSバージョンで同じ現象が発生した。