執行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 test 和 vstest 設定。 如果您在 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
沒有。