BadImageFormatException when AnyCPU test assembly implements interface from x64 production assembly

David picture David · Feb 9, 2012 · Viewed 28.3k times · Source

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
  • 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?

Answer

Anupam picture Anupam · Dec 27, 2012

I came here searching for the solution for a similar problem. Posting this answer just in case the solution I found helps someone else. This solved it for me in Visual Studio (2012):

Add New Item -> Test Settings Add Test Setting Item Change the testsetting Run test in 64 bit process By default this is set to "Force test to run in 32 bit process"

From the menu: Test -> Test Settings -> Select Test Settings File -> Choose the test settings file you have created.

Now run the tests.