I seem to have hit on a scenario where when I run mstest on an AnyCPU assembly which references an x64 assembly, I get a BadImageFormatException.
The issue occurs when an interface in x64Production.dll is implemented (even if unused) by the AnyCPUTestingx64Production.dll test assembly:
Unable to load the test container 'D:\AnyCPUTestingx64Production.dll'
or one of its dependencies. error details:
System.BadImageFormatException:
Could not load file or assembly 'x64Production, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. An attempt was made to load a program with an incorrect format.
- mstest is running on windows 7 64-bit
- the test assembly is built as AnyCPU to get it to run in 64bit on a 64bit host (as outlined here)
- the testsettings file specifies <Execution hostProcessPlatform="MSIL"/>
- peverify and corflags reveal nothing interesting
- this is readily reproducible in a toy solution, i.e. where
- x64Production
- references no other assemblies
- includes only an empty public interface IExampleInterface
- has <PlatformTarget> set to x64
- AnyCPUTestingx64Production
- references only x64Production.dll (i.e. this issue is present even without a reference to Microsoft.VisualStudio.QualityTools.UnitTestFramework)
- includes only an empty implementation of x64Production.IExampleInterface
- has <PlatformTarget> set to x64
- x64Production
- nunit can load and run the test assembly (once I've converted all the test attributes)
- but is not a good short term solution to the larger problem (which involves a huge number of project files)
- the same issue arises whether the projects target 3.5 or 4.0
- the same issues arises whether the VS2008 or VS2010 c# compiler is used
- the same issue arises whether mstest from VS2010 or Test Agents is used
- it is mstest which fails while loading AnyCPUTestingx64Production - i.e this is not an issue with attempting to load the assembly in the wrong QTAgent (nothing shows up in Process Monitor and renaming QTAgent32.exe has no effect):
*** Assembly Binder Log Entry (09/02/2012 @ 09:44:26) ***
The operation failed.
Bind result: hr = 0x8007000b. An attempt was made to load a program with an incorrect format.
Assembly manager loaded from: C:\Windows\Microsoft.NET\Framework\v4.0.30319\clr.dll
Running under executable C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\MSTest.exe
--- A detailed error log follows.
=== Pre-bind state information ===
LOG: User = David
LOG: DisplayName = x64Production, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
(Fully-specified)
LOG: Appbase = file:///D:/
LOG: Initial PrivatePath = NULL
LOG: Dynamic Base = NULL
LOG: Cache Base = NULL
LOG: AppName = MSTest.exe
Calling assembly : AnyCPUTestingx64Production, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null.
===
LOG: This bind starts in default load context.
LOG: Using application configuration file: C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\MSTest.exe.Config
LOG: Using host configuration file:
LOG: Using machine configuration file from C:\Windows\Microsoft.NET\Framework\v4.0.30319\config\machine.config.
LOG: Policy not being applied to reference at this time (private, custom, partial, or location-based assembly bind).
LOG: Attempting download of new URL file:///D:/x64Production.DLL.
LOG: Assembly download was successful. Attempting setup of file: D:\x64Production.dll
LOG: Entering run-from-source setup phase.
LOG: Assembly Name is: x64Production, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
ERR: Failed to complete setup of assembly (hr = 0x8007000b). Probing terminated.
Has anyone else ascertained whether or not this is simply unsupported in the VS2010 mstest?
Change the testsetting
By default this is set to "Force test to run in 32 bit process"




