Sdílet prostřednictvím


Zásadní změny rozhraní API v sadě Visual Studio 2022

Pokud migrujete rozšíření do sady Visual Studio 2022, můžou vás tyto zásadní změny ovlivnit.

Referenční sestavení se už nenainstalují

Mnoho sestavení, na která pravděpodobně odkazujete, že nástroj MSBuild vyřešený z instalačního adresáře sady Visual Studio již není nainstalován. K získání potřebných sestavení sady Visual Studio SDK byste měli použít NuGet. Podrobný postup najdete v tématu Modernizace projektů .

Odebraná rozhraní API

V sadě Visual Studio 2022 byla v rámci přesunu sady Visual Studio odebrána řada rozhraní API. Seznam odebraných rozhraní API najdete na stránce Seznam odebraných rozhraní API.

Zásadní změny spolupráce

Mnoho našich rozhraní API se v sadě Visual Studio 2022 změnilo, obvykle s jednoduchými změnami, které jsou jednoduché pro přizpůsobení kódu.

Ke správě zásadních změn plánujeme poskytnout nový mechanismus pro distribuci sestavení vzájemné spolupráce. Konkrétně pro Visual Studio 2022 a nad rámec poskytujeme jedno sestavení vzájemné spolupráce s definicemi pro mnoho běžných veřejných rozhraní sady Visual Studio. Toto sestavení obsahuje spravované definice pro mnoho rozhraní sady Visual Studio, které se přesouvají od více sestavení vzájemné spolupráce. Nové sestavení vzájemné spolupráce se distribuuje Microsoft.VisualStudio.Interop prostřednictvím balíčku NuGet.

Komponenty sady Visual Studio, které se primárně používají v nativních kontextech a mají nízký počet zásadních změn, budou mít i nadále vlastní sestavení vzájemné spolupráce (například sestavení ladicího programu bude stále VisualStudio.Debugger.Interop.dll stejně jako dnes). V každém případě lze sestavení následně odkazovat z vaší aplikace, stejně jako jsou dnes.

Jedná se o významnou změnu a znamená, že rozšíření, která používají rozhraní API a sestavení integrovaná v tomto novém přístupu, nejsou kompatibilní se staršími verzemi sady Visual Studio pomocí předchozího sestavení vzájemné spolupráce.

To má několik velmi důležitých výhod, které usnadní aktualizaci rozšíření na Visual Studio 2022:

  • Všechna poškozená rozhraní API se stanou chybami v době sestavení, což usnadňuje jejich vyhledání a opravu.
  • Stačí aktualizovat kód, který používá rozhraní API, které bylo přerušeno v sadě Visual Studio 2022.
  • Nebudete moct omylem použít staré, nyní poškozené rozhraní API.

Celkově tyto změny budou mít za následek stabilnější verzi sady Visual Studio pro všechny uživatele. Hlavní nevýhodou tohoto přístupu je, že spravovaná sestavení nebudou moct běžet v sadě Visual Studio 2019 i v sadě Visual Studio 2022, aniž by se kód kompilují jednou pro každou cílovou verzi sady Visual Studio.

Při práci s chybami kompilace kvůli rozdílům rozhraní API mezi sadou Visual Studio 2019 a Visual Studio 2022 můžete najít rozhraní API nebo vzor, kterým čelíte níže, a pokyny k jeho opravě.

int nebo uint kde IntPtr se očekává

Očekáváme, že se jedná o velmi běžnou chybu. Aby bylo visual Studio 2022 64bitový proces, bylo nutné některé z našich rozhraní API pro interoperabilitu opravit, kde se předpokládalo, že se ukazatel vejde do 32bitového celého čísla, aby skutečně používal hodnotu velikosti ukazatele.

Ukázková chyba:

Argument 3: Nelze převést z "out uint" na 'out System.IntPtr'

Jednoduše aktualizujte kód tak, aby očekával nebo zadal IntPtr , kde UIntPtr int nebo uint kdy se použil k vyřešení přerušení.

Ukázková oprava:

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

Typ interoperability definovaný ve dvou sestaveních

Když kompilátor jazyka C# hlásí chybu typu, který používáte, je definován ve dvou sestaveních, pravděpodobně odkazujete na sestavení ze sady Visual Studio 2019 verze sady SDK, na kterou byste už neměli odkazovat.

Ukázková chyba:

chyba CS0433: Typ IVsDpiAware existuje v microsoft.VisualStudio.Interop, Version=17.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a a Microsoft.VisualStudio.Shell.Interop.16.0.DesignTime, Version=16.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f1d50a3a'

Pokud chcete zjistit, který název sestavení je upřednostňovaným názvem v sadě Visual Studio 2022, podívejte se na naši referenční tabulku pro přemapování sestavení. Při zvažování dvou sestavení pojmenovaných ve výše uvedené ukázkové chybě a při pohledu na tuto tabulku si všimněte, že Microsoft.VisualStudio.Interop se jedná o nový název sestavení. Oprava by pak byla odebráním odkazu z Microsoft.VisualStudio.Shell.Interop.16.0.DesignTime projektu.

V některých případech nabízíme balíček sady Visual Studio 2022 s verzí pro zastaralé sestavení, které obsahuje služby předávání typů. Pokud je tato možnost k dispozici, můžete místo odebrání upgradovat odkaz na balíček na verzi sady Visual Studio 2022. Předávání typů vyřeší chybu z kompilátoru.

Mějte na paměti, že někdy můžou tyto odkazy pocházet z tranzitivního odkazu na balíček, a proto může být obtížnější je odebrat než přímý odkaz v souboru projektu. V takových případech se ujistěte, že všechny přímé odkazy na balíčky sady Visual Studio 2022 SDK používají všechny samotné balíčky. Můžete se podívat na project.assets.json a identifikovat řetězec balíčků zodpovědných za přenesení zastaralého sestavení. Aktualizace tranzitivního odkazu na balíček na verzi sady Visual Studio 2022 je stejně snadná jako přímá instalace.

Pokud strom závislostí nemůžete změnit (například protože zahrnuje závislost třetí strany), můžete přidat přímý odkaz na balíček před sadou Visual Studio 2022 a přidat ExcludeAssets="compile" do této PackageReference položky metadata pro vyřešení chyby kompilátoru. Mějte ale na paměti, že s touto technikou může rozšíření zachovat závislost na sestavení před sadou Visual Studio 2022 a vaše rozšíření může za běhu fungovat.

Chybějící odkaz na sestavení vzájemné spolupráce

Když odkazujete na sestavení kompilované proti sadě Visual Studio 2022 SDK, může se zobrazit chyba týkající se chybějícího odkazu na sestavení.

Ukázková chyba:

Chyba CS0012 Typ IVsTextViewFilter je definován v sestavení, na které není odkazováno. Je nutné přidat odkaz na sestavení Microsoft.VisualStudio.TextManager.Interop, Version=7.1.40304.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a.

Pomocí tabulky remapping sestavení odkazu můžete potvrdit, že požadované sestavení ve skutečnosti není jedno, na které byste měli odkazovat.

Nejlepší opravou je aktualizace závislosti na verzi, která byla zkompilována v sadě Visual Studio 2022 SDK, aby kompilátor už nepožadoval odebrané sestavení vzájemné spolupráce.

V některých případech nabízíme balíček sady Visual Studio 2022 s verzí pro zastaralé sestavení, které obsahuje služby předávání typů. Pokud je tato možnost dostupná, můžete přidat odkaz na balíček na zastaralou verzi sady Visual Studio 2022, aby služby předávání typů vyřešily chybu z kompilátoru.

IAsyncServiceProvider Chybí

Existují dvě definice tohoto rozhraní ve dvou oborech názvů. Pro spravovanou spotřebu byla určena pouze jedna z těchto možností.

Visual Studio 2019 – obor názvů Obor názvů sady Visual Studio 2022 Zamýšlený účel
Microsoft.VisualStudio.Shell.IAsyncServiceProvider Microsoft.VisualStudio.Shell.IAsyncServiceProvider Spotřeba spravovaného kódu
Microsoft.VisualStudio.Shell.Interop.IAsyncServiceProvider Microsoft.VisualStudio.Shell.COMAsyncServiceProvider.IAsyncServiceProvider Pouze spolupráce na nízké úrovni

Pokud se zobrazí chyba týkající IAsyncServiceProviderse , může to být, že jste používali ten, který je určený pro nativní kód (druhý řádek). Pokud ano, můžete ho aktualizovat na nový obor názvů nebo přepnout na spravované rozhraní.

DTE selhání přetypování a _DTE typ

DTE a _DTE jsou obě rozhraní. Jeden je odvozen od druhého. V sadě Visual Studio 2022 se ale základní a odvozené typy prohodí. Tím dojde k selhání přiřazení nebo přetypování určitých typů.

To také znamená, kdy jste používali new DTE(), musíte nyní použít new _DTE().

Pokud chcete zmírnit většinu problémů s tímto způsobem, použijte DTE2 místo toho obor EnvDTE80 názvů.

Chybějící argument pro vyvolání metody

Některé metody už nehlásí výchozí argumenty pro volitelné parametry v rozhraní API pro interoperabilitu. Pokud se zobrazí chyba týkající se chybějícího argumentu pro volání zprostředkovatele komunikace modelu COM a volání parametru object pro typ, předchozí výchozí hodnota, kterou bylo možné definovat ""rozhraní API pro interoperabilitu sady Visual Studio 2019, zvažte přidání "" jako argument k vyřešení chyby kompilace.

Pokud máte pochybnosti o tom, jaký je výchozí argument, zkuste přepnout kontext služby jazyka ze sady Visual Studio 2022 na Visual Studio 2019, abyste získali IntelliSense se staršími sestaveními vzájemné spolupráce, abyste zjistili, jaký byl výchozí argument, a pak ho explicitně přidejte do kódu. Při kompilaci pro Visual Studio 2019 bude i nadále fungovat, ale teď se zkompiluje pro Visual Studio 2022.

Ukázková oprava:

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

Vyřazení starší verze rozhraní API pro hledání

V rámci našeho úsilí o modernizaci hledání v souborech jsme vYřadili podporu následujících rozhraní API rozhraní EnvDTE ve VS 2022.

Tato rozhraní API už nebudou fungovat ve VS 2022 a dál. Pokyny slouží k použití rozhraní IFinder (Microsoft.VisualStudio.Text.Operations), které obsahuje metody hledání a nahrazení. Přístup k objektu implementující rozhraní IFinder lze získat prostřednictvím IFindService.CreateFinderFactory – metoda. Příklad migrace rozšíření třetí strany do sady Visual Studio ze starších rozhraní API na moderní rozhraní API IFinderu najdete tady: Migrace rozšíření Maid kódu z rozhraní API envDTE Find and Replace na moderní rozhraní API IFinderu