다음을 통해 공유


Visual Studio 2022의 호환성이 손상되는 API 변경

확장을 Visual Studio 2022로 마이그레이션하는 경우 여기에 나열된 호환성이 손상되는 변경이 영향을 줄 수 있습니다.

참조 어셈블리가 더 이상 설치되지 않음

MSBuild가 Visual Studio 설치 디렉터리에서 확인한 것으로 참조했을 수 있는 많은 대부분의 어셈블리가 더 이상 설치되지 않습니다. NuGet을 사용하여 필요한 Visual Studio SDK 참조 어셈블리를 획득해야 합니다. 이 작업을 수행하는 자세한 단계는 프로젝트 현대화를 참조하세요.

제거된 API

Visual Studio 2022에서는 Visual Studio 등을 이동하는 과정의 일부로 여러 API가 제거되었습니다. 제거된 API 목록은 제거된 API 목록 페이지에서 찾을 수 있습니다.

Interop 관련 호환성이 손상되는 변경

대부분의 API는 Visual Studio 2022에서 변경되었고 일반적으로 코드에서 간단히 수용할 수 있는 간단한 변경 내용을 포함합니다.

호환성이 손상되는 변경을 관리하기 위해 interop 어셈블리의 배포를 위한 새로운 메커니즘을 제공할 계획입니다. 특히 Visual Studio 2022 이상에서는 많은 일반적인 퍼블릭 Visual Studio 인터페이스에 대한 정의가 포함된 단일 interop 어셈블리를 제공합니다. 해당 어셈블리에는 여러 interop 어셈블리에서 벗어나는 많은 Visual Studio 인터페이스에 대한 관리형 정의가 포함되어 있습니다. 새 interop 어셈블리는 Microsoft.VisualStudio.Interop NuGet 패키지를 통해 배포됩니다.

그러나 주로 네이티브 컨텍스트에서 사용되고 호환성이 손상되는 변경 수가 적은 Visual Studio 구성 요소에는 고유한 interop 어셈블리가 계속 포함됩니다(예: 디버거 어셈블리는 현재와 같이 여전히 VisualStudio.Debugger.Interop.dll임). 어떤 경우든 이후에 어셈블리는 현재와 같이 애플리케이션에서 참조할 수 있습니다.

이는 상당한 변경이며 이 새로운 접근 방식으로 빌드된 API 및 어셈블리를 사용하는 확장이 이전 interop 어셈블리를 사용하는 이전 버전의 Visual Studio와 호환되지 않음을 의미합니다.

여기에는 확장을 Visual Studio 2022로 보다 쉽게 업데이트할 수 있는 몇 가지 매우 중요한 장점이 있습니다.

  • 손상된 API는 더 쉽게 찾고 수정할 수 있는 빌드 시간 오류가 됩니다.
  • Visual Studio 2022에서 손상된 API를 사용하는 코드를 업데이트하면 됩니다.
  • 현재 손상된 이전 API를 실수로 사용할 수는 없습니다.

전반적으로 이 변경으로 인해 모든 사용자에게 보다 안정적인 버전의 Visual Studio가 제공됩니다. 이 접근 방식의 주요 단점은 각 대상 Visual Studio 버전에 대해 코드를 한 번 컴파일하지 않고는 관리형 어셈블리를 Visual Studio 2019 및 Visual Studio 2022에서 실행할 수 없다는 것입니다.

Visual Studio 2019와 Visual Studio 2022 간의 API 차이점으로 인해 컴파일 오류를 해결할 때 수정 방법에 대한 참고 자료를 통해 아래 나열된 API 또는 패턴을 찾을 수 있습니다.

IntPtr이 필요한 int 또는 uint

이 오류는 매우 일반적인 오류가 될 것으로 예상합니다. Visual Studio 2022를 64비트 프로세스로 만들려면 포인터가 32비트 정수에 적합하여 포인터 크기 값을 실제로 사용할 수 있다고 가정하는 경우 일부 interop API를 수정해야 했습니다.

샘플 오류

인수 3: ‘out uint’에서 ‘out System.IntPtr’로 변환할 수 없음

중단을 해결하는 데 int 또는 uint가 사용된 IntPtr 또는 UIntPtr를 예상하거나 제공하도록 코드를 업데이트하면 됩니다.

샘플 수정:

-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’에 참조를 추가해야 함

참조 어셈블리 다시 매핑 테이블을 사용하면 요청된 어셈블리가 실제로 참조해야 하는 어셈블리가 아닌지 확인할 수 있습니다.

가장 좋은 수정은 제거된 interop 어셈블리가 컴파일러에서 더 이상 요청되지 않도록 Visual Studio 2022 SDK에 대해 컴파일된 버전으로 종속성을 업데이트하는 것입니다.

경우에 따라 형식 전달자를 포함하는 사용되지 않는 어셈블리에 대한 Visual Studio 2022 버전 패키지를 제공합니다. 이 기능을 사용할 수 있는 경우 형식 전달자가 컴파일러의 오류를 해결할 수 있도록 사용되지 않는 패키지의 Visual Studio 2022 버전에 패키지 참조를 추가하는 옵션이 있습니다.

IAsyncServiceProvider가 누락됨

이 인터페이스의 두 가지 정의는 두 개의 네임스페이스에 있습니다. 이 중 하나만 관리형 사용을 위해 제공됩니다.

Visual Studio 2019 네임스페이스 Visual Studio 2022 네임스페이스 올바른 사용법
Microsoft.VisualStudio.Shell.IAsyncServiceProvider Microsoft.VisualStudio.Shell.IAsyncServiceProvider 관리 코드 사용
Microsoft.VisualStudio.Shell.Interop.IAsyncServiceProvider Microsoft.VisualStudio.Shell.COMAsyncServiceProvider.IAsyncServiceProvider 하위 수준 interop만

오류가 IAsyncServiceProvider표시되면 네이티브 코드(두 번째 행)를 사용 중일 수 있습니다. 이 경우 새 네임스페이스로 업데이트하거나 관리형 인터페이스로 전환할 수 있습니다.

DTE_DTE 형식 캐스트 실패

DTE_DTE는 둘 다 인터페이스입니다. 한 인터페이스는 다른 인터페이스에서 파생됩니다. 그러나 Visual Studio 2022에서는 기본 형식과 파생 형식이 교환됩니다. 이로 인해 특정 형식 할당 또는 캐스트가 실패합니다.

이는 new DTE()를 사용했던 경우 이제 new _DTE()를 사용해야 함을 의미합니다.

이와 관련된 대부분의 문제를 완화하려면 대신 EnvDTE80 네임스페이스의 DTE2를 사용합니다.

메서드 호출의 누락된 인수

몇 가지 메서드는 interop API의 선택적 매개 변수였던 항목에 대한 기본 인수를 더 이상 선언하지 않습니다. COM interop 호출의 누락된 인수 및 object 형식의 매개 변수 호출에 대한 오류가 발생하는 경우 정의된 Visual Studio 2019 interop API에서 정의한 이전 기본값은 ""이었을 수 있으므로 컴파일 오류를 해결하기 위해 ""를 인수로 추가하는 것이 좋습니다.

기본 인수가 무엇이었는지 궁금할 경우 언어 서비스 컨텍스트를 Visual Studio 2022에서 Visual Studio 2019로 전환해 보면 이전 interop 어셈블리가 포함된 Intellisense를 가져와서 기본 인수가 무엇이었는지 확인한 다음, 코드에 명시적으로 추가할 수 있습니다. Visual Studio 2019용으로 컴파일될 때 계속 제대로 작동하지만 이제 Visual Studio 2022용으로 컴파일됩니다.

샘플 수정:

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

레거시 찾기 API 사용 중단

파일에서 찾기를 현대화하기 위한 작업의 일환으로 VS 2022에서 EnvDTE 인터페이스의 다음 API에 대한 지원이 더 이상 사용되지 않습니다.

이 API는 VS 2022 이상에서 더 이상 작동하지 않습니다. 찾기 및 바꾸기 메서드가 있는 IFinder 인터페이스(Microsoft.VisualStudio.Text.Operations)를 대신 사용해야 합니다. IFinder 인터페이스를 구현하는 개체에 대한 액세스는 IFindService.CreateFinderFactory 메서드를 통해 얻을 수 있습니다. 이전 API에서 최신 IFinder API로 타사 확장을 Visual Studio로 마이그레이션하는 예제는 EnvDTE 찾기 및 바꾸기 패턴 API에서 최신 IFinder API로 Code Maid 확장 마이그레이션에서 찾을 수 있습니다.