「ファイルまたはアセンブリ '***'、またはその依存関係の 1 つが読み込めませんでした。」への対処方法

ファイルまたはアセンブリ '***'、またはその依存関係の 1 つが読み込めませんでした。間違ったフォーマットのプログラムを読み込もうとしました。(Could not load file or assembly '***' or one of its dependencies. An attempt was made to load a program with an incorrect format.)

必要なファイルが存在しない場合

ファイルまたはアセンブリが依存しているファイルは、dumpbinで調べられます。

プラットフォーム ターゲットに起因する場合

次のそれぞれの状況によって、対処法が異なります。

  • プラットフォーム ターゲットを設定していない場合
  • プラットフォーム ターゲットを変更した場合

プラットフォーム ターゲットを設定していない場合

プラットフォーム ターゲットは既定で[Any CPU]となっているため、これと異なる設定のアセンブリを読み込むとBadImageFormatException例外が発生します。よってアセンブリのプラットフォーム ターゲットを確認し、それに合うようにターゲットを修正します。

プラットフォーム ターゲットを変更した場合

32ビット用と64ビット用の2つのDLLがあるとき、Visual Studioではプロジェクトのプラットフォームによらず1つのDLLしか指定できません。それゆえプラットフォーム ターゲットを変更したときに、プラットフォームの異なるアセンブリを参照しているとしてBadImageFormatException例外が発生します。BadImageFormatException クラス (System) | MSDN

この問題はVisual Studioを用いず、そのプロジェクト ファイルを直接編集することで解決できます。たとえばそこで対象のDLLが、

<HintPath>x86\sample.dll</HintPath>

のように指定されているならば、

<HintPath>$(Platform)\sample.dll</HintPath>

と書き換えることで、Visual Studioでターゲットを切り替えたときに、参照するファイルも同時に切り替えられます。.net - Targeting both 32bit and 64bit with Visual Studio in same solution/project - Stack Overflow

ただしこの方法では$(Platform)の文字列とフォルダの名前が一致している必要があるため、それが異なる場合には

<Reference Include="***">
  <HintPath Condition="'$(Platform)' == 'x86'">Win32\sample.dll</HintPath>
  <HintPath Condition="'$(Platform)' == 'x64'">x64\sample.dll</HintPath>
</Reference>

のようにCondition属性を用い、参照するファイルをそれぞれ指定します。MSBuild Conditions | MSDN

Microsoft Learnから検索