C#開発で「MissingMethodException」が突然出てはまった話

2022/05/22に公開

経緯

あるdllを呼び出しているC#のプロジェクトがありました。
開発時にはデバッグ実行が正常に機能することを確認できていたのですが、しばらく日がたって改めて実行してみたら、MissingMethodExceptionという例外が発生してしまって頭を抱える経験をしました。

わかってみれば簡単なことですがはまってしまったので知見として残します。

原因:dllが2つ存在していた

プロジェクトにdllを追加して参照するときに、普通に参照すると実行ファイルが存在するディレクトリ直下にコピーされるような設定になります。

これを途中で、以下の記事で説明しているように実行ファイルディレクトリの中にフォルダを設けて、その中に出力するように変更していました。
https://sutefu7.hatenablog.com/entry/2019/04/19/010551

ただ、この設定は開発中の途中段階で行っていたため、あるリビジョンを境にビルドされた後のdllコピー先が変わっていました。
その途中でまったく別のブランチに切り替えながら開発を行ったりしていたせいで、ある時から実行ファイルディレクトリ直下にもdllが取り残されつつ、別フォルダにもdllが存在する状態になっていました。
そして、ある時からこの2つ存在するdllでバージョンの違いが発生しました。それにより、開発時にはディレクトリ内のdllを参照していたために存在していたメソッドが、実行時にはフォルダ直下のdllを参照することにより存在しないことになってしまい、MissingMethodExceptionとなっていました。

📂 Release
|---- 📂 lib-directory
|   |--- someLib.dll(本来参照したいdll)
|-----someLib.dll(意図せず取り残されたdll、こちらが優先的に参照される)

結果として、Releaseフォルダ直下のdllを削除することで無事に問題解決しました。

わかってみればなんてことはないのですが、何回かやってしまっているので、早期に気付けるような対策を考えたいと思います。

Discussion