System BadImageFormatException Формат исполняемого файла (.exe) или библиотеки (.dll) недопустим.
Для завершения конвейера CI требуется около 50 минут, и большая часть времени уходит на тестирование. Имейте достаточное количество модульных тестов и тестов на основе данных. Решили запустить тестирование параллельно, и подход был основан на этом документе. Запуск тестов параллельно в конвейерах сборки.
Идея состоит в том, чтобы разделить конвейер на 3 задания
Build Job: создает двоичные файлы и публикует их в артефактах с предварительным добавлением имени.
Тестовое задание: загрузка артефакта перед удалением, извлечение файлов, параллельное выполнение тестов с помощью задачи VSTest@2
Опубликовать задание: опубликовать артефакты для удаления (для конвейера выпуска).
Не уверен, что смог воплотить свою идею в.yml.
Тестовое задание
- job : 'TestJob'
pool:
vmImage: windows-latest
strategy:
parallel: 2
dependsOn: 'BuildJob'
steps:
- task: DownloadBuildArtifacts@0
inputs:
buildType: 'current'
downloadType: 'single'
artifactName: 'predrop'
downloadPath: '$(System.ArtifactsDirectory)'
- task: ExtractFiles@1
inputs:
archiveFilePatterns: '$(System.ArtifactsDirectory)/predrop/predrop.zip'
destinationFolder: '$(System.ArtifactsDirectory)/predrop/Extpredrop'
- task: VSTest@2
inputs:
testSelector: 'testAssemblies'
testAssemblyVer2: |
**\*tests.dll
!**\*TestAdapter.dll
!**\obj\**
searchFolder: '$(System.ArtifactsDirectory)'
vstestLocationMethod: 'location'
vstestLocation: 'C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\Common7\IDE\Extensions\TestPlatform\'
otherConsoleOptions: '/platform:x64 /Framework:.NETCoreApp,Version=v3.1'
Проблема заключается в том, что задача VSTest распознает и запускает некоторые тесты, но выдает ошибки в других тестах со следующей ошибкой в некоторых тестах
System.BadImageFormatException : Could not load file or assembly 'Microsoft.Extensions.Logging.Abstractions, Version=3.1.3.0, Culture=neutral, PublicKeyToken=adb9793829ddae60'.
Format of the executable (.exe) or library (.dll) is invalid.
Двоичные файлы из первого задания создали Microsoft.Extensions.Logging.Abstractions.dll как часть артефакта.
1 ответ
В документе класса BadImageFormatException говорится, что это исключение выбрасывается в следующем сценарии:
DLL или исполняемый файл загружается как 64-разрядная сборка, но содержит 32-разрядные функции или ресурсы. Например, он полагается на COM-взаимодействие или вызывает методы в 32-разрядной библиотеке динамической компоновки.
Чтобы устранить это исключение, установите для свойства целевой платформы проекта значение x86 (вместо x64 или AnyCPU) и перекомпилируйте.
Итак, вы можете попробовать настроить задачу VSBuild, чтобы пересобрать проект как x86 или x64. Посмотрите эту похожую ошибку в этой теме.
Если указано выше, изменение платформы не работает. Вы можете попробовать этот обходной путь, чтобы добавить задачу VSBuild для сборки проекта и в задание TestJob. Таким образом, не потребуется загружать и извлекать артефакты в задании TestJob. Для примера ниже:
- job : 'TestJob'
pool:
vmImage: windows-latest
strategy:
parallel: 2
dependsOn: 'BuildJob'
steps:
- task: VSBuild@1
inputs:
solution: '**/*.sln'
platform: "any cpu"
configuration: 'Release'
- task: VSTest@2
inputs:
...
Вы также можете проверить эту ветку.