Visual Studio 2022 中的重大 API 變更

如果您要將延伸模組移轉至 Visual Studio 2022,此處列出的重大變更可能會影響您。

不再安裝的參考元件

您可能已經參考許多從 Visual Studio 安裝目錄解析的 MSBuild 元件已不再安裝。 您應該使用 NuGet 來取得所需的 Visual Studio SDK ref 元件。 如需執行這項操作的詳細步驟,請參閱 現代化專案

已移除的 API

在 Visual Studio 2022 中,已移除許多 API,作為繼續移動 Visual Studio 的一部分。 您可以在 [已移除的 API 清單] 頁面上找到 移除的 API 清單

Interop 重大變更

我們的許多 API 在 Visual Studio 2022 中都已變更,通常是簡單的變更,可讓您的程式代碼適應。

為了管理重大變更,我們正計劃提供一個新的機制來散發 Interop 元件。 具體來說,對於Visual Studio 2022和更多版本,我們提供單一Interop元件,其中包含許多常見公用Visual Studio介面的定義。 該元件包含許多 Visual Studio 介面的 Managed 定義,這些介面會遠離多個 Interop 元件。 新的 Interop 元件會透過 Microsoft.VisualStudio.Interop NuGet 套件散發。

不過,主要用於原生內容的Visual Studio元件,而且有少量的重大變更會繼續有自己的Interop元件(例如,調試程式元件仍將是VisualStudio.Debugger.Interop.dll,就像今天一樣)。 在任何情況下,都可以從您的應用程式參考元件,就如同目前一樣。

這是一項重大變更,表示使用這個新方法內建 API 的延伸模組與舊版 Visual Studio 不相容,使用先前的 Interop 元件。

這有一些非常重要的優點,可讓您更輕鬆地將延伸模組更新至 Visual Studio 2022:

  • 任何中斷的 API 都會變成建置時間錯誤,使其更容易尋找和修正。
  • 您只需要更新使用 Visual Studio 2022 中中斷之 API 的程式代碼。
  • 您將無法不小心使用舊的、現在中斷的 API。

整體而言,這些變更將會為所有用戶產生更穩定的Visual Studio版本。 此方法的主要缺點是,您的 Managed 元件將無法在 Visual Studio 2019 和 Visual Studio 2022 中執行,而不需針對每個目標 Visual Studio 版本編譯程式代碼一次。

當您因 Visual Studio 2019 與 Visual Studio 2022 之間的 API 差異而解決編譯錯誤時,您可能會發現以下所列的 API 或模式,並提供如何修正此問題的指引。

intuint預期的位置IntPtr

我們預期這是一個非常常見的錯誤。 若要讓 Visual Studio 2022 成為 64 位進程,我們必須修正部分 Interop API,假設指標可以容納在 32 位整數中,才能實際使用指標大小的值。

範例錯誤:

自變數 3:無法從 'out uint' 轉換為 'out System.IntPtr'

只要更新您的程式代碼,以預期或提供IntPtr或用來解析中斷的位置intuintUIntPtr

範例修正:

-shell.LoadLibrary(myGuid, myFlags, out uint ptrLib);
+shell.LoadLibrary(myGuid, myFlags, out IntPtr ptrLib);

兩個元件中定義的 Interop 類型

當 C# 編譯程式報告您使用的類型定義於兩個元件中時,您可能會從您不應該再參考的 Visual Studio 2019 版 SDK 參考元件。

範例錯誤:

錯誤 CS0433:'IVsDpiAware' 類型同時存在於 'Microsoft.VisualStudio.Interop 中 Version=17.0.0.0、Culture=neutral、PublicKeyToken=b03f5f7f11d50a3a' 和 'Microsoft.VisualStudio.Shell.Interop.16.0.DesignTime, Version=16.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'

請參閱參考 元件重新對應數據表 ,以查看哪些元件名稱是 Visual Studio 2022 中的慣用名稱。 請考慮上述範例錯誤中名為的兩個元件,並查看此數據表,請注意 Microsoft.VisualStudio.Interop ,這是新的元件名稱。 修正程式會是從專案中移除的 Microsoft.VisualStudio.Shell.Interop.16.0.DesignTime 參考。

在某些情況下,我們會為包含類型轉寄站的已淘汰元件提供Visual Studio 2022 版本套件。 當可用時,您可以選擇 升級 Visual Studio 2022 版本的套件參考,而不是移除它。 類型轉寄站會從編譯程式解析錯誤。

請記住,有時候這些參考可以透過可轉移的套件參考來產生,因此比項目檔中的直接參考更難移除。 在這種情況下,請確定您的所有直接套件參考全都使用Visual Studio 2022 SDK 套件本身。 您可以參考 project.assets.json 來識別負責帶入已取代元件的套件鏈結。 更新 Visual Studio 2022 版的可轉移套件參考,就像將它安裝為直接參考一樣簡單。

如果您無法變更相依性樹狀結構(例如,因為它涉及第三方相依性),您可以將直接套件參考新增至 Visual Studio 2022 之前套件,並將元數據新增 ExcludeAssets="compile" 至該專案 PackageReference ,以解決編譯程序錯誤。 但請記住,使用這項技術,您的延伸模組可能會保留與Visual Studio 2022前元件相依性,而您的延伸模組可能會在運行時間發生問題。

遺漏 Interop 元件的參考

當您參考針對 Visual Studio 2022 SDK 編譯的元件時,您可能會收到遺漏元件參考的錯誤。

範例錯誤:

錯誤 CS0012 未參考的元件中定義類型 『IVsTextViewFilter』。 您必須新增元件 'Microsoft.VisualStudio.TextManager.Interop, Version=7.1.40304.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' 的參考

使用參考元件重新對應數據表,您可以確認所要求的元件實際上不是您應該參考的元件。

最佳修正方法是將相依性更新為針對Visual Studio 2022 SDK編譯的版本,讓編譯程式不再要求移除的Interop元件。

在某些情況下,我們會為包含類型轉寄站的已淘汰元件提供Visual Studio 2022 版本套件。 當這個可用時,您可以選擇將套件參考新增至 Visual Studio 2022 版本的過時套件,讓類型轉寄站能夠解決編譯程式的錯誤。

IAsyncServiceProvider 遺失

這個介面有兩個定義,在兩個命名空間中。 其中只有一個用於受控取用。

Visual Studio 2019 命名空間 Visual Studio 2022 命名空間 預定用途
Microsoft.VisualStudio.Shell.IAsyncServiceProvider Microsoft.VisualStudio.Shell.IAsyncServiceProvider Managed 程式代碼耗用量
Microsoft.VisualStudio.Shell.Interop.IAsyncServiceProvider Microsoft.VisualStudio.Shell.COMAsyncServiceProvider.IAsyncServiceProvider 僅限低階 Interop

如果您看到有關 IAsyncServiceProvider的錯誤, 可能是 您使用適用於機器碼的機器碼 (第二個數據列)。 如果是,您可以更新至新的命名空間,或切換至更易管理的介面。

DTE_DTE 類型轉換失敗

DTE_DTE 都是介面。 其中一個衍生自另一個。 不過,在Visual Studio 2022中,會交換基底和衍生類型。 這會使特定類型指派或轉換失敗。

這也表示您過去使用 new DTE()的位置,現在 new _DTE()必須使用 。

若要減輕大部分的問題, DTE2 請改用 命名空間中的 EnvDTE80

方法調用的遺漏自變數

一些方法不再宣告 Interop API 中選擇性參數的預設自變數。 如果您收到 COM Interop 呼叫遺漏自變數的錯誤,以及類型的參數呼叫 object ,則 Visual Studio 2019 Interop API 定義的先前預設值可能是 "",因此請考慮新增 "" 作為自變數來解決編譯錯誤。

當懷疑預設自變數是什麼時,請嘗試將語言服務內容從Visual Studio 2022切換至Visual Studio 2019,讓Intellisense與舊版 Interop 元件一起查看預設自變數是什麼,然後將它明確新增至您的程式代碼。 針對 Visual Studio 2019 編譯時,它將繼續正常運作,但現在會針對 Visual Studio 2022 進行編譯。

範例修正:

-process4.Attach2();
+process4.Attach2("");

舊版尋找 API 淘汰

在將檔案中尋找現代化的努力中,我們已淘汰 VS 2022 中 EnvDTE 介面的下列 API 支援。

這些 API 將不再在 VS 2022 和以後運作。 指引是改用 IFinder 介面 (Microsoft.VisualStudio.Text.Operations) 來尋找並取代其上的方法。 您可以透過 IFindService.CreateFinderFactory 方法取得實作 IFinder 介面的物件存取權。 您可以在這裡找到將第三方延伸模組從舊版 API 移轉至 Visual Studio 的範例: 將 Code Maid 延伸模組從 EnvDTE 尋找和取代模式 API 移轉至新式 IFinder API