Mi sembra di aver colpito uno scenario in cui quando eseguo mstest su un assembly AnyCPU che fa riferimento a un assembly x64, ottengo un valore BadImageFormatException.BadImageFormatException quando l'assembly di test AnyCPU implementa l'interfaccia dall'assembly di produzione x64
Il problema si verifica quando si implementa un'interfaccia in x64Production.dll (anche se non utilizzato) dal gruppo di prova AnyCPUTestingx64Production.dll:
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 è in esecuzione su Windows 7 a 64 bit
- l'apparecchio di prova è costruito come AnyCPU per farlo funzionare in 64 bit su un host 64 bit (come illustrato here)
- file testsettings specifica < Esecuzione hostProcessPlatform = "MSIL"/>
- PEverify e corflags rivelano nulla interessante
- questo è facilmente riproducibile in una soluzione giocattolo, cioè dove
- x64Production
- riferimenti altri assiemi
- include solo un'interfaccia pubblica vuoto IExampleInterface
- ha <PlatformTarget> impostato su x64
- AnyCPUTestingx64Production
- riferimenti solo x64Production.dll (vale a dire questo problema è presente anche senza un riferimento a Microsoft.VisualStudio.QualityTools.UnitTestFramework)
- include solo un'implementazione vuota x64Production.IExampleInterface
- ha <PlatformTarget> insieme a x64
- x64Production
- nunit può caricare ed eseguire il test assembly (dopo aver convertito tutti gli attributi di test)
- ma non è una buona soluzione a breve termine per il problema più grande (che coinvolge un numero enorme di file di progetto)
- lo stesso problema si pone se i progetti obiettivo di 3,5 o 4,0
- gli stessi problemi si pone se il VS2008 o VS2010 compilatore C# è usato
- lo stesso problema si pone se mstest da VS2010 o Test Agents è utilizzato
- è più che non riesce durante il caricamento AnyCPUTestingx64Production - cioè questo non è un problema con il tentativo di caricare l'assembly nel QTAgent sbagliato (nulla viene visualizzato in Process Monitor e rinominare QTAgent32.exe non ha alcun effetto) :
*** 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.
Qualcun altro ha verificato se questo è semplicemente non supportato nel VS2010?
Non ha mai senso creare una DLL per il target x64, indirizzare sempre AnyCPU. L'impostazione conta solo su un progetto EXE. Mstest corre in modalità a 32 bit. –
@Hans, ero sotto l'impressione ([1] (http://stackoverflow.com/a/516740/1198408), [2] (http://stackoverflow.com/a/8436574/1198408), [3 ] (http://visualstudiohacks.com/articles/visual-studio-net-platform-target-explained/)) che specifichi che il progetto dovrebbe compilare a x64 se alla fine chiama a una DLL non gestita che è a sua volta a 64 bit . Potresti fornirmi ulteriori ragionamenti su questo? – David
David ha ragione su questo. – Joshua