Поделиться через


Покрытие кода EnableDynamicNativeInstrumentation по умолчанию равно false

При выполнении dotnet test --collect:"Code Coverage" теперь по умолчанию отключается динамическое встроенное инструментирование. Это изменение влияет на сбор покрытия кода из нативного кода. Это не влияет на процесс сбора данных покрытия кода из управляемого кода.

Представленная версия

Общедоступная версия .NET 10

Предыдущее поведение

Ранее динамическое нативное инструментирование было включено по умолчанию и использовало резервный вариант для нативных модулей, если не удалось использовать статическое нативное инструментирование. Это поведение описано в нативном статическом и динамическом инструментировании.

dotnet test --collect:"Code Coverage"
# Dynamic native instrumentation was enabled by default

Новое поведение

Начиная с .NET 10 динамическое нативное инструментирование отключено по умолчанию. Параметр <EnableDynamicNativeInstrumentation>false</EnableDynamicNativeInstrumentation> устанавливается по умолчанию из dotnet test и vstest. Если вы явно задали параметр в файле runsettings , он не переопределяется.

dotnet test --collect:"Code Coverage"
# Dynamic native instrumentation is now disabled by default

Вы можете включить заново динамическое нативное инструментирование, задав параметр <EnableDynamicNativeInstrumentation>true</EnableDynamicNativeInstrumentation> в файле runsettings. Однако при возникновении этой ошибки может появиться сообщение "Невозможно выполнить код, так как не найден covrun64.dll." Эта ошибка также может произойти в 32-разрядном процессе covrun32.dll.

Тип разрушающего изменения

Это изменение поведения.

Причина изменения

Динамическое встроенное инструментирование по умолчанию было включено для обеспечения обратной совместимости dotnet test. Однако его способ внедрения библиотек DLL в процесс не является стандартным. При изменении безопасности в среде выполнения .NET 10 не удается найти связанную библиотеку DLL, что приведет к сбою процесса с ошибкой. Ошибка может не отображаться в неинтерактивных сеансах или в командной строке, но процесс завершается сбоем.

Динамическое собственное инструментирование уже отключено по умолчанию dotnet-coverage, что является альтернативным способом сбора покрытия кода с помощью тех же самых базовых средств. Он также отключен по умолчанию для решений в Visual Studio, которые не имеют собственных проектов.

Если вы собираете покрытие для решений, которые не имеют собственных компонентов, на вас это не должно повлиять. Однако при сборе покрытия вы можете заметить улучшение производительности.

Если вы собираете охват решений, включающих собственные компоненты, такие как проекты C++, у вас есть следующие варианты:

  • Настройка проектов для использования статической нативной инструментации

    OR

  • Обновите microsoft.CodeCoverage 18.0.1 и включите динамическое встроенное инструментирование:

    • Добавьте параметр <EnableDynamicNativeInstrumentation>true</EnableDynamicNativeInstrumentation> в файл runsettings .
    • Глобально отключить использование новых настроек по умолчанию, установив переменную среды VSTEST_DISABLE_DYNAMICNATIVE_CODECOVERAGE_DEFAULT_SETTING=1.

    Аналогичным образом, при сборе покрытия кода с vstest.console помощью VSTest версии 18.0.1 и более поздних версий требуется, чтобы успешно собирать динамическое собственное покрытие на системах с установленным SDK .NET 10.

Затронутые API

Нет.