Подтвердить что ты не робот

Исключение BadImageFormatException, когда сборка тестов AnyCPU реализует интерфейс из сборки сборки x64

Кажется, я столкнулся с сценарием, когда при запуске 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.
  • mstest работает в Windows 7 64-разрядный
  • тестовая сборка построена как AnyCPU, чтобы заставить ее работать на 64-битной основе на 64-битном хосте (как описано здесь)
  • файл настроек тестов указывает < Исполнение hostProcessPlatform = "MSIL" / >
  • peverify и corflags не показывают ничего интересного
  • это легко воспроизводится в игрушечном решении, т.е. где
    • x64Production
      • ссылки отсутствуют другие сборки
      • включает только пустой открытый интерфейс IExampleInterface
      • имеет <PlatformTarget> установлен на x64
    • AnyCPUTestingx64Production
      • ссылается только на x64Production.dll(т.е. эта проблема присутствует даже без ссылки на Microsoft.VisualStudio.QualityTools.UnitTestFramework)
      • включает только пустую реализацию x64Production.IExampleInterface
      • имеет <PlatformTarget> установлен на x64
  • nunit может загружать и запускать тестовую сборку (как только я преобразую все тестовые атрибуты)
    • но не является хорошим краткосрочным решением более крупной проблемы (которая включает огромное количество файлов проекта).
  • возникает одна и та же проблема: ориентированы ли проекты на 3.5 или 4.0
  • возникают те же проблемы, если используется компилятор VS2008 или VS2010 С#
  • возникает одна и та же проблема: используется ли mstest из VS2010 или тестовых агентов.
  • Ошибка при загрузке AnyCPUTestingx64Production - это не проблема с попыткой загрузить сборку в неправильном QTAgent (ничего не отображается в Process Monitor и переименование QTAgent32.exe не имеет никакого эффекта):
    *** 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?

4b9b3361

Ответ 1

От чтения этого файла MSTest.exe 32 бит.

Ответ 2

Я пришел сюда, ища решение для аналогичной проблемы. Проводя этот ответ на всякий случай, решение, которое я нашел, помогает кому-то другому. Это решило это для меня в Visual Studio (2012):

Добавить новый элемент → Настройки тестирования Add Test Setting Item Измените набор тестов Run test in 64 bit process По умолчанию установлено значение "Force test для запуска в 32-битном процессе"

Из меню: Test → Test Settings → Select Test Settings File → Выберите файл настроек теста, который вы создали.

Теперь запустите тесты.

Ответ 3

Теперь с 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);
    }

Ответ 4

Кроме того, вы можете перейти в Test- > Test Settings- > Default Producor Architecture- > X64. Я могу работать.

Ответ 5

В моем случае это, казалось, не имело ничего общего с платформами x86 или x64 или тестовыми настройками конфигурации или версией .NET проекта. BTW Ошибка BadImageFormatException Я также упомянул что-то о том, что "подпись неверна".

Проблема заключалась в том, что при использовании Moq нам нужно добавить недостающие ссылки в проект unit test для классов/интерфейсов, которые зависят от объекта, который мы пытаемся высмеять. Просмотрите ссылки на проект, который вы тестируете, чтобы понять, какие сборки вы можете потерять, связанные с объектом, который вы издеваетесь.

http://vibrantcode.com/2012/05/18/badimageformatexception-the-signature-is-incorrect/

Ответ 6

Если у вас установлен ReSharper, обратитесь к следующей ссылке

В принципе, вам нужно создать файл настроек теста в своем решении, как указано в других ответах, затем обновить параметр ReSharper для MsTest, чтобы указать на тот же файл настроек.

Я рассматриваю эту проблему с помощью Visual Studio 2013 Update 4 и Resharper 8.2.

Ответ 7

После этого сообщения в блоге, выполните следующее: из командной строки 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

Пока неясно, как это будет действовать против реального производственного кода.

Ответ 8

Спасибо за отзыв на Resharper, потому что он указал, что проблему можно избежать, переключившись на MSTest. Я не мог заставить Решарпера работать. Тестирование 64-битной сторонней 64-разрядной библиотеки DLL, даже если вы только Mocking (по-прежнему загружать ее), только работает с MsTest в режиме 64 бит. Параметр Resharper для MSTest для "Использовать эту конфигурацию тестового запуска" имеет только "По умолчанию" в качестве раскрывающегося списка, а "Изменить" - серым. Другой параметр "Использовать конфигурацию тестового запуска, указанный в файле метаданных" тоже не работает, и предполагается, что он знает, что или где находится этот файл метаданных. Resharper не будет работать в 64-битном режиме, как доказано выше с помощью переменной среды Is64BitProcess. (VS 2013 Update 4, Resharper 8.2)

Ответ 9

В дополнение к решению @Anupam на VS2013 вы можете перейти в TEST > Параметры тестирования > Архитектура процессора по умолчанию и изменить между X86 и X64 strong > . Это почти то же самое, что и выбор файла настроек теста, за исключением того, что вам не нужен файл только для определения тестовой платформы.