Ответ 1
От чтения этого файла MSTest.exe 32 бит.
Кажется, я столкнулся с сценарием, когда при запуске mstest на сборке AnyCPU, которая ссылается на сборку x64, я получаю исключение BadImageFormatException.
Проблема возникает, когда интерфейс в x64Production.dll реализован (даже если он не используется) с помощью тестовой сборки 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.
*** 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.
Кто-нибудь еще выяснил, является ли это просто неподдерживаемым в VS2010 mestest?
От чтения этого файла MSTest.exe 32 бит.
Я пришел сюда, ища решение для аналогичной проблемы. Проводя этот ответ на всякий случай, решение, которое я нашел, помогает кому-то другому. Это решило это для меня в Visual Studio (2012):
Добавить новый элемент → Настройки тестирования
Измените набор тестов
По умолчанию установлено значение "Force test для запуска в 32-битном процессе"
Из меню: Test → Test Settings → Select Test Settings File → Выберите файл настроек теста, который вы создали.
Теперь запустите тесты.
Теперь с Visual Studio 2013 (по крайней мере, не пробовал в 2012 году) мне не нужно было ничего делать, кроме как выбрать Test- > Test Settings- > Default Processor Architecture- > x64. Также можно использовать файл настроек теста для достижения того же результата. Ни один из тех старых kluges, которые вы не видите в других ответах и разных публикациях в Интернете. Поскольку мои вещи должны использовать x64, я добавил эти тестовые примеры слишком просто, чтобы напомнить мне, если у меня есть некорректная настройка.
[TestMethod]
public void Running_64Bit_OS()
{
// It was determined to run only in 64 bits.
bool is64BitOS = System.Environment.Is64BitOperatingSystem;
Assert.AreEqual(is64BitOS, true);
}
[TestMethod]
public void Running_64Bit_Process()
{
// We have a requirement that one of the unmanaged DLL is built for 64 bits.
// If you are running MS Test in Visual Studio 2013 and this
// is failing, go to Test->Test Settings->Default Processor Architecture and
// chose x64, then run the tests again. This is not the only method. You
// could also use a test settings file.
bool is64BitProcess = System.Environment.Is64BitProcess;
Assert.AreEqual(is64BitProcess, true);
}
Кроме того, вы можете перейти в Test- > Test Settings- > Default Producor Architecture- > X64. Я могу работать.
В моем случае это, казалось, не имело ничего общего с платформами x86 или x64 или тестовыми настройками конфигурации или версией .NET проекта. BTW Ошибка BadImageFormatException Я также упомянул что-то о том, что "подпись неверна".
Проблема заключалась в том, что при использовании Moq нам нужно добавить недостающие ссылки в проект unit test для классов/интерфейсов, которые зависят от объекта, который мы пытаемся высмеять. Просмотрите ссылки на проект, который вы тестируете, чтобы понять, какие сборки вы можете потерять, связанные с объектом, который вы издеваетесь.
http://vibrantcode.com/2012/05/18/badimageformatexception-the-signature-is-incorrect/
Если у вас установлен ReSharper, обратитесь к следующей ссылке
В принципе, вам нужно создать файл настроек теста в своем решении, как указано в других ответах, затем обновить параметр ReSharper для MsTest, чтобы указать на тот же файл настроек.
Я рассматриваю эту проблему с помощью Visual Studio 2013 Update 4 и Resharper 8.2.
После этого сообщения в блоге, выполните следующее: из командной строки VS (поэтому CorFlags.exe находится в PATH), получает тесты для моего решения для игрушек:
@echo off
REM remove the 32Bit flag, forcing the executable to be 64-bit when run on a 64 bit os.
REM Expect the following output:
REM "
REM corflags : warning CF011 : The specified file is strong name signed. Using /Force will invalidate the signature of this image and will require the assembly to be resigned.
REM "
CorFlags.exe "C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\MSTest.exe" /32BIT- /Force
REM skip the strong name verification, because the 32-bit flag was modified
reg add HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\StrongName\Verification\MSTest,b03f5f7f11d50a3a /f
REM copy over registry keys to the 64-bit shadow registry.
REM Without the "{13cdc9d9-ddb5-4fa4-a97d-d965ccfc6d4b}\Extensions" subkey, mstest will output
REM "
REM File extension specified '.dll' is not a valid test extension.
REM "
reg copy HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\VisualStudio\10.0\EnterpriseTools\QualityTools\TestTypes HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\10.0\EnterpriseTools\QualityTools\TestTypes /s /f
Пока неясно, как это будет действовать против реального производственного кода.
Спасибо за отзыв на Resharper, потому что он указал, что проблему можно избежать, переключившись на MSTest. Я не мог заставить Решарпера работать. Тестирование 64-битной сторонней 64-разрядной библиотеки DLL, даже если вы только Mocking (по-прежнему загружать ее), только работает с MsTest в режиме 64 бит. Параметр Resharper для MSTest для "Использовать эту конфигурацию тестового запуска" имеет только "По умолчанию" в качестве раскрывающегося списка, а "Изменить" - серым. Другой параметр "Использовать конфигурацию тестового запуска, указанный в файле метаданных" тоже не работает, и предполагается, что он знает, что или где находится этот файл метаданных. Resharper не будет работать в 64-битном режиме, как доказано выше с помощью переменной среды Is64BitProcess. (VS 2013 Update 4, Resharper 8.2)
В дополнение к решению @Anupam на VS2013 вы можете перейти в TEST > Параметры тестирования > Архитектура процессора по умолчанию и изменить между X86 и X64 strong > . Это почти то же самое, что и выбор файла настроек теста, за исключением того, что вам не нужен файл только для определения тестовой платформы.