共用方式為


程式碼涵蓋範圍 EnableDynamicNativeInstrumentation 預設為 false

執行dotnet test --collect:"Code Coverage"後,預設會停用動態原生工具。 此變更會影響從原生程式碼收集程式碼涵蓋面的方式。 它不會影響從受控程式碼收集程式碼覆蓋率的方式。

推出的版本

.NET 10 GA

先前的行為

先前,預設會啟用動態原生檢測,並在無法使用靜態原生檢測時,對原生模組進行後援。 此行為在 靜態和動態原生檢測中說明。

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

新行為

從 .NET 10 開始,預設會停用動態原生檢測。 預設情況下,<EnableDynamicNativeInstrumentation>false</EnableDynamicNativeInstrumentation> 選項由 dotnet testvstest 設定。 如果您在 runsettings 檔案中明確設定選項,則這些選項不會被覆蓋。

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

您可以在您的 <EnableDynamicNativeInstrumentation>true</EnableDynamicNativeInstrumentation> 檔案中透過設置 來重新啟用動態原生工具。 不過,當您這樣做時,可能會失敗,並顯示「程式碼執行無法繼續,因為找不到 covrun64.dll」。此錯誤也可能發生 covrun32.dll 在 32 位元進程中。

破壞性變更的類型

此變更為行為變更

變更的原因

預設會啟用動態原生工具化,以在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 版和更新版本,才能在已安裝 .NET 10 SDK 的系統上成功收集動態原生涵蓋範圍。

受影響的 API

沒有。