web-dev-qa-db-ja.com

NUnitプロジェクトによって引き起こされたSystem.BadImageFormatException

みなさん、良い一日を。私は仕事で一日中同じ問題を抱えていて、下がる新しい道を見つけるのに苦労しています。

ソリューションをサーバー上に構築すると、次のエラーが発生します。ソリューション内のすべてのテストの実行/デバッグに問題はなく、正常にビルドされます。サーバーと私のPCはどちらもx64です。私は役に立たないことがわかった多くのアドバイスに従いました。

すべての構成で、ソリューション内のすべてのプロジェクトのプラットフォームターゲットをx86に設定しました。

すべての違いを生む可能性のあるnunit-console-x86.exeがあることは知っていますが、コードのどこでこれを指定するかはわかりません。

私はインターネットの先駆者であることに気づいてください。何かを逃した場合はお詫びします。

System.BadImageFormatException:ファイルまたはアセンブリを読み込めませんでした
'Spin.TradingServices.DataAcquisition.Test.NUnit、Version = 1.0.12103.2060、Culture = neutral、PublicKeyToken = null'またはその依存関係の1つ。不正な形式のプログラムを読み込もうとしました。
ファイル名: 'Spin.TradingServices.DataAcquisition.Test.NUnit、Version = 1.0.12103.2060、Culture = neutral、PublicKeyToken = null'

サーバースタックトレース:System.Reflection.RuntimeAssembly._nLoad(AssemblyName fileName、String codeBase、Evidence assemblySecurity、RuntimeAssembly locationHint、StackCrawlMark&stackMark、Boolean throwOnFileNotFound、Boolean forIntrospection、BooleansuppressSecurityChecks)at System.Reflection.RuntimeAssembly.RefternalLoadAssemblyName assemblySecurity、StackCrawlMark&stackMark、Boolean forIntrospection、BooleansuppressSecurityChecks)at System.Reflection.Assembly.Load(AssemblyName assemblyRef)at NUnit.Core.Builders.TestAssemblyBuilder.Load(String path)at NUnit.Core.Builders.TestAssemblyBuilder.Build(String assemblyName 、ブールautoSuites)at NUnit.Core.Builders.TestAssemblyBuilder.Build(String assemblyName、String testName、Boolean autoSuites)at NUnit.Core.TestSuiteBuilder.BuildSingleAssembly(TestPackage package)at NUnit.Core.TestSuiteBuilder.Build(TestPackage package)at NUnit NUnit.Core.Proxyの.Core.SimpleTestRunner.Load(TestPackageパッケージ) TestRunner.Load(TestPackage package)at NUnit.Core.ProxyTestRunner.Load(TestPackage package)at NUnit.Core.RemoteTestRunner.Load(TestPackage package)at System.Runtime.Remoting.Messaging.StackBuilderSink._PrivateProcessMessage(IntPtr md、Object [] System.Runtime.Remoting.Messaging.StackBuilderSink.SyncProcessMessage(iMessage msg、Int32 methodPtr、Boolean fExecuteInContext)のargs、Object server、Int32 methodPtr、Boolean fExecuteInContext、Object []&outArgs)

[0]で再スローされた例外:System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(iMessage reqMsg、iMessage retMsg)at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData&msgData、Int32 type)atNUnit.Core。 TestRunner.Load(TestPackage package)at NUnit.Util.TestDomain.Load(TestPackage package)at NUnit.ConsoleRunner.ConsoleUi.Execute(ConsoleOptions options)at NUnit.ConsoleRunner.Runner.Main(String [] args)

WRN:アセンブリバインディングログがオフになっています。アセンブリバインド失敗ログを有効にするには、レジストリ値[HKLM\Software\Microsoft\Fusion!EnableLog](DWORD)を1に設定します。注:アセンブリバインド失敗ログに関連するパフォーマンスの低下があります。この機能をオフにするには、レジストリ値[HKLM\Software\Microsoft\Fusion!EnableLog]を削除します。

http://app1017-build.oy.gb.sportingindex.com:8080/job/TradingServices.DataAcquisition-Dev/ws/DataAcquisition/build.proj(86,5) :エラーMSB6006: " nunit-console.exe "はコード-100で終了しました。 Done Building Project "(デフォルトのターゲット)-失敗しました。

ビルドに失敗しました。

注意:Hudsonでのビルドを元に戻し、ファイルをより段階的に再コミットするようになりました。これがどうなるかについて報告します。残念ながら、これに数人の頭を巻き込んでみましたが、役に立ちませんでした。恥!

更新しばらくこのページに戻っていませんが、さまざまな解決策があるようです。私がそれらすべてを答えとしてマークすることができれば、私はそうするでしょう!ここであなたの道を見つけた人は、おそらく各オプションに同等の信用を与えるべきです。

19
Matt Canty

アセンブリのターゲットフレームワークバージョンがnUnitテストランナーがサポートしているものと同じであることを確認してください。サポートされているランタイムのリストについては、runFile.exe.configを参照してください。

また、FW3からFW4に移行した場合、ランタイムは異なります(CLRは異なります)。

7
ili

X64 PCのコンソールアプリでこの問題が発生しました。ビルドはx86に設定されていましたが、それでもクラッシュしました。コンソールアプリの[プロパティ]に移動し、ビルド中にプラットフォームターゲットをx86から​​[任意のCPU]に変更すると、突然すべてのテストが機能し、正常に実行されました。

注目すべきことに、Configuration Managerのプラットフォームフィールドは「うそをつく」ことができ、プロジェクトのプロパティが実際に実行するように構成されていることを実際に反映する必要はありません。私の構成マネージャーは、「Common.dll」は「Any CPU」としてビルドされていると言いましたが、プロジェクトのプロパティ(本当に重要な設定)は「x86」としてビルドされていました。

enter image description here

54
Theresa Forster

すべての回答へのマイナーな追加。私の場合のように、NUnitランナープラットフォーム(私にとってはResharper)自体を変更する必要があるかもしれません。例を見る enter image description here

9
Alex M

この設定が正しいことを確認してください:テストメニュー->テスト設定->デフォルトのプロセッサアーキテクチャ-> x64/x86。私の場合は正しくなく、同じ問題で失敗しました。

6
MaurGi

コンソールまたはWPFアプリケーションに対してテストするときに、これに頻繁に遭遇します。いくつかの原因は

  • まず、アプリケーションが.Net Framework3または4クライアントプロファイルで実行されていないことを確認します
  • 次に、アプリケーションプロジェクトとテストプロジェクトの両方で、ターゲットフレームワークの.NETバージョンを比較します。それらは同じでなければなりません
  • ビルドタブでプラットフォームターゲットを確認します。それらは同じである必要があります。たとえば、テストプロジェクトに "Any CP"ターゲットがある場合、アプリケーションには "Any CP"が必要です。
5
Andy

私の場合、例外はnunitの無効な/process=single引数が原因で発生しました。値を変更すると、例外はなくなります。

/process=separate

または

/process=multiple

p/s:回答が遅れていますが、参考までに。

3
checksum

これはばかげているように聞こえるかもしれませんが、プロジェクトとプロセッサのアーキテクチャを確認してください。私の場合、64ビットテストを実行していました64ビットマシンであると想定しました(64ビットプロジェクトを構築していたため)。

何だと思う?実際には32ビットマシンでした。したがって、NUnit.exeは(明らかに)32ビットとして実行され、64ビットテストを理解できません。

ソリューション?テストのx86およびx64バージョンをビルドし、x86マシンでx86バージョンを実行し、x64マシンでx64バージョンを実行します。

明らかです。しかし、チェックする価値があります。

3
ashes999

私の状況は少し異なっていました。変更されたユニットテストを実行した後、エラーは非常にランダムに表示されました。

テストを削除すると、エラーはなくなりました。

テストを再作成したところ、エラーが再発しました。

テストの名前を変更すると、エラーはなくなりました。

テストの名前を元に戻しましたが、問題は再発しませんでした。

お役に立てれば!

ベン

2
ben

この問題がまだ発生している場合は、テストランナーのフレームワークフィールドを、含まれているプロジェクトのフレームワークフィールドと一致するように設定する必要があります(AlexMによって参照されるフィールドのすぐ右側のフィールド)。

私の場合、Windows Phone 8ライブラリのテストスイートを作成していましたが、NUnitは使用するフレームワークのバージョンを正しく把握できませんでした。

1
Zenel

私を起こしてくれてありがとうAshes999。

この問題は再び再発しました。そして、ロールバックとアップロードは機能しませんでした。それは、私たちがもはや使用していないモニターオブジェクトであることが判明しました。コメントアウトして修正しました。

これを見つける方法は、すべての単体テストをデバッグすることです。一時停止するすべての場所を修正します。 tが一時停止しない場合は、エラーが発生します。

1
Matt Canty