0

いくつかのアセンブリがメイン アプリケーションとは別にビルドされているアプリケーションがあります。実行時に、これらはメインの BIN フォルダーの外側のフォルダーに存在し、Assembly.LoadFrom を使用してメイン アプリケーションによって読み込まれます。これらの「プラグイン」アセンブリの VS プロジェクトには、メイン アプリケーションから構築された物理アセンブリへの参照があります。

メイン アプリケーションとプラグインの両方のビルドは、TFS ビルド サーバーによって作成されます。「プラグイン」アセンブリ プロジェクトで参照として使用されるアセンブリは、通常、メイン アプリケーションの TFS ビルドから取得されますが、PC で作成されたビルドから取得されることもあります。

私は毎日このアプリケーションに取り組んでおり、99% のプラグイン ビルドが正常に動作します。次に、明確な説明がなくても、プラグイン アセンブリがメイン アプリケーションによって読み込まれず、次のエラーが発生します。

System.BadImageFormatException: Could not load file or assembly 'file:///C:\Program Files\MyCompany\MainApp\Plugins\MyApp.Plugins.ABC.XYZ.dll' or one of its dependencies. The module was expected to contain an assembly manifest.
File name: 'file:///C:\Program Files\MyCompany\MainApp\Plugins\MyApp.Plugins.ABC.XYZ.dll'
   at System.Reflection.RuntimeAssembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks)
   at System.Reflection.RuntimeAssembly.nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks)
   at System.Reflection.RuntimeAssembly.InternalLoadAssemblyName(AssemblyName assemblyRef, Evidence assemblySecurity, RuntimeAssembly reqAssembly, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks)
   at System.Reflection.RuntimeAssembly.InternalLoadFrom(String assemblyFile, Evidence securityEvidence, Byte[] hashValue, AssemblyHashAlgorithm hashAlgorithm, Boolean forIntrospection, Boolean suppressSecurityChecks, StackCrawlMark& stackMark)
   at System.Reflection.Assembly.LoadFrom(String assemblyFile)

これが発生した場合、それを解決するためにさまざまなことを行いますが、信頼できる解決策がありません。次のすべてを試してみると、最終的に問題は消えます。

  • ビルドを再度実行する
  • 「プラグイン」アセンブリ プロジェクトによって参照として使用されるアセンブリを、ビルド サーバーによってビルドされた新しい DLL で更新します。
  • 同上、ただし、新しい DLL が PC に組み込まれている
  • ビルドサーバーを再起動します
  • ビルド サーバーに Windows Update をインストールする
  • 家に帰って翌日、問題が解決していることを確認してください。

ビルド サーバーによって作成されたプラグイン ビルドでこの問題が発生する場合、PC で作成されたビルドが機能することがあります。それ以外の場合は、両方のビルドで問題が発生します。

これまで、メイン アプリケーションとプラグイン ソリューションの両方のビルド構成は、「任意の CPU」を対象としていました。今日 (対象となるプロセッサ アーキテクチャにこの例外を関連付ける S/O 投稿が多数あったようです)、両方をターゲット x64 に切り替えてみましたが、違いはありませんでした。

他に何を見るべきかわかりません...何かアイデアはありますか?

4

1 に答える 1