Visual Studio 2022용 Visual Studio 확장 업데이트
Important
이 문서의 조언은 개발자가 Visual Studio 2019 및 Visual Studio 2022 모두에서 작동하도록 주요 변경이 필요한 확장을 마이그레이션하는 방법을 안내할 수 있습니다. 이러한 경우 두 개의 VSIX 프로젝트와 조건부 컴파일을 사용하는 것이 좋습니다.
많은 확장이 Visual Studio 2019와 Visual Studio 2022 모두에서 작동하며, 이 문서의 확장 현대화에 대한 조언을 따르지 않아도 되는 사소한 변경 내용이 있습니다. Visual Studio 2022에서 확장을 시도하고 확장에 가장 적합한 옵션을 평가합니다.
Visual Studio 2022는 64비트 애플리케이션이며 Visual Studio SDK의 몇 가지 주요 변경 내용을 소개합니다. 이 문서에서는 Visual Studio 2022의 현재 미리 보기로 확장 기능을 사용하는 데 필요한 단계를 안내합니다. 그러면 Visual Studio 2022가 일반 공급되기 전에 사용자가 확장을 설치할 수 있습니다.
Visual Studio 설치 및 확장 컴파일
Visual Studio 2022 다운로드에서 Visual Studio 2022를 설치합니다.
.NET 언어로 작성된 확장
관리되는 확장용 Visual Studio 2022를 대상으로 하는 Visual Studio SDK는 NuGet에서만 사용할 수 있습니다.
- Microsoft.VisualStudio.Sdk(17.x 버전) 메타패키지는 필요한 참조 어셈블리의 대부분 또는 전부를 가져옵니다.
- Visual Studio 2022 규격 VSIX를 빌드할 수 있도록 VSIX 프로젝트에서 Microsoft.VSSDK.BuildTools(17.x 버전) 패키지를 참조해야 합니다.
호환성이 손상되는 변경 내용을 참조하지 않더라도 확장을 Any CPU 또는 x64 플랫폼으로 반드시 컴파일해야 합니다. x86 플랫폼은 Visual Studio 2022의 64비트 프로세스와 호환되지 않습니다.
C++로 작성된 확장
C++로 컴파일된 확장용 Visual Studio SDK는 평소처럼 설치된 Visual Studio SDK에서 사용할 수 있습니다.
호환성이 손상되는 변경 내용을 참조하지 않더라도 Visual Studio 2022 SDK 및 AMD64에 대해 특별히 확장을 컴파일해야 합니다.
실행 중인 코드가 있는 확장
실행 중인 코드가 있는 확장은 Visual Studio 2022용으로 특별히 컴파일해야 합니다. Visual Studio 2022는 이전 버전의 Visual Studio를 대상으로 하는 확장을 로드하지 않습니다.
이전 Visual Studio 버전의 확장을 Visual Studio 2022로 마이그레이션하는 방법을 알아봅니다.
- 프로젝트를 현대화합니다.
- Visual Studio 2022 및 이전 버전을 대상으로 지정할 수 있도록 소스 코드를 공유 프로젝트로 리팩터링합니다.
- Visual Studio 2022 대상 VSIX 프로젝트 추가 및 패키지/어셈블리 다시 매핑 테이블.
- 필요한 코드를 조정합니다.
- Visual Studio 2022 확장을 테스트합니다.
- Visual Studio 2022 확장을 게시합니다.
코드를 실행하지 않는 확장
실행 중인 코드(예: 프로젝트 또는 항목 템플릿)를 포함하지 않는 확장은 두 개의 고유한 VSIX의 프로덕션을 포함하여 이전 단계를 수행할 필요가 없습니다.
대신 source.extension.vsixmanifest
파일이 두 개의 설치 대상을 선언하도록 하나의 VSIX를 수정합니다.
<Installation>
<InstallationTarget Id="Microsoft.VisualStudio.Community" Version="[15.0,17.0)">
<ProductArchitecture>x86</ProductArchitecture>
</InstallationTarget>
<InstallationTarget Id="Microsoft.VisualStudio.Community" Version="[17.0,18.0)">
<ProductArchitecture>amd64</ProductArchitecture>
</InstallationTarget>
</Installation>
공유 프로젝트 및 여러 VSIX 사용에 대한 이 문서의 단계를 건너뛸 수 있습니다. 테스트를 진행할 수 있습니다.
참고 항목
Visual Studio 2022를 사용하여 새 Visual Studio 확장을 작성하고 Visual Studio 2019 또는 이전 버전도 대상으로 지정하려는 경우 이 가이드를 참조하세요.
MSBuild 작업
MSBuild 작업을 작성하는 경우 Visual Studio 2022에서 64비트 MSBuild.exe 프로세스에 로드될 가능성이 높습니다. 작업을 실행하기 위해 32비트 프로세스가 필요한 경우 대상 및 태스크 구성을 참조하여 MSBuild가 32비트 프로세스에서 작업을 로드하는지 확인합니다.
VSIX 프로젝트 현대화
확장에 Visual Studio 2022 지원을 추가하기 전에 기존 프로젝트를 정리하고 현대화하는 것이 좋습니다.
직접 Visual Studio SDK 어셈블리 참조를
PackageReference
항목으로 바꿉니다.-<Reference Include="Microsoft.VisualStudio.OLE.Interop" /> +<PackageReference Include="Microsoft.VisualStudio.OLE.Interop" Version="..." />
팁
메타패키지에 대한 수많은 어셈블리 참조를
PackageReference
인스턴스 단 하나로 대체할 수 있습니다.-<Reference Include="Microsoft.VisualStudio.OLE.Interop" /> -<Reference Include="Microsoft.VisualStudio.Interop" /> -<Reference Include="Microsoft.VisualStudio.Interop.8.0" /> +<PackageReference Include="Microsoft.VisualStudio.Sdk" Version="..." />
대상으로 하는 Visual Studio의 최소 버전과 일치하는 패키지 버전을 선택해야 합니다.
Visual Studio SDK에 고유하지 않은 일부 어셈블리(예: Newtonsoft.Json.dll)는 Visual Studio 2022 이전의 간단한 <Reference Include="Newtonsoft.Json" />
참조를 통해 검색할 수 있었습니다. 하지만 Visual Studio 2022에서는 대신 패키지 참조가 필요합니다. 그 이유는 일부 Visual Studio 런타임 및 SDK 디렉터리가 MSBuild의 기본 어셈블리 검색 경로에서 제거되었기 때문입니다.
직접 어셈블리 참조에서 NuGet 패키지 참조로 전환하는 경우 NuGet이 종속성의 전이적 닫기를 자동으로 설치하기 때문에 추가 어셈블리 참조 및 분석기 패키지를 선택할 수 있습니다. 일반적으로 정상이지만 빌드하는 동안 추가 경고가 발생할 수 있습니다. 이러한 경고를 처리하고 가능한 한 많은 문제를 해결합니다. 코드 내 #pragma warning disable <id>
영역을 사용하여 해결할 수 없는 경고를 표시하지 않는 것이 좋습니다.
다중 대상 지정에 공유 프로젝트 사용
공유 프로젝트는 Visual Studio 2015에 도입된 프로젝트 형식입니다. Visual Studio의 공유 프로젝트를 사용하면 조건부 컴파일 기호와 고유한 참조 세트를 사용하여 소스 코드 파일을 여러 프로젝트 간에 공유하고 다르게 빌드할 수 있습니다.
Visual Studio 2022에는 이전의 모든 Visual Studio 버전의 고유한 참조 어셈블리 세트가 필요합니다. 따라서 공유 프로젝트를 사용하여 Visual Studio 2022, 이전 버전 및 이후 버전의 확장을 편리하게 다중 대상으로 지정하는 것이 좋습니다. 이 기술은 코드 공유를 제공하지만 별개의 참조를 제공합니다.
Visual Studio 확장의 컨텍스트에서 Visual Studio 2022 이상용 VSIX 프로젝트 하나와 Visual Studio 2019 이하 버전용 VSIX 프로젝트 하나를 가질 수 있습니다. 이러한 각 프로젝트에는 16.x SDK 또는 17.x SDK에 대한 패키지 참조와 source.extension.vsixmanifest
인스터스만 포함됩니다. 또한 이러한 VSIX 프로젝트에는 두 Visual Studio 버전에서 공유할 수 있는 모든 소스 코드를 호스트하는 새 공유 프로젝트에 대한 공유 프로젝트 참조가 있습니다.
이 섹션에서는 Visual Studio 2019를 대상으로 하는 VSIX 프로젝트가 이미 있으며 Visual Studio 2022에서 확장이 작동한다고 가정합니다.
Visual Studio 2019를 사용하여 이러한 모든 단계를 완료할 수 있습니다.
아직 수행하지 않은 경우 프로젝트를 현대화하여 이 업데이트 프로세스의 뒷부분에서 단계를 쉽게 수행할 수 있습니다.
Visual Studio SDK를 참조하는 각 기존 프로젝트의 솔루션에 새 공유 프로젝트를 추가합니다. 솔루션을 마우스 오른쪽 단추로 클릭한 다음, 추가>새 프로젝트를 선택합니다.
새 프로젝트 추가 대화 상자에서 공유 프로젝트를 검색한 다음, 공유 프로젝트 템플릿을 선택합니다.
각 Visual Studio SDK 참조 프로젝트의 참조를 공유 프로젝트에 추가합니다.
각 Visual Studio SDK 참조 프로젝트의 모든 소스 코드(.cs 및 .resx 파일 포함)를 해당 공유 프로젝트로 이동합니다. VSIX 프로젝트의 source.extension.vsixmanifest 파일을 그대로 둡니다.
메타데이터 파일(예: 릴리스 정보, 라이선스 및 아이콘) 및 VSCT 파일을 공유 디렉터리로 이동합니다. 그런 다음, VSIX 프로젝트에 연결된 파일로 추가합니다. 공유 디렉터리는 공유 프로젝트와 별개입니다.
메타데이터 파일의 경우 빌드 작업을 콘텐츠로 설정합니다. VSIX에 포함을 True로 설정합니다.
VSCT 파일의 경우 빌드 작업을 VSCTCompile로 설정합니다. VSIX에 포함을 False로 설정합니다.
Visual Studio에서 이 설정이 지원되지 않아 불편한 경우 프로젝트를 언로드하고
Content
를VSCTCompile
로 변경하여 빌드 작업을 수동으로 변경할 수 있습니다.-<Content Include="..\SharedFiles\VSIXProject1Package.vsct"> - <Link>VSIXProject1Package.vsct</Link> -</Content> +<VSCTCompile Include="..\SharedFiles\VSIXProject1Package.vsct"> + <Link>VSIXProject1Package.vsct</Link> + <ResourceName>Menus.ctmenu</ResourceName> +</VSCTCompile>
프로젝트를 빌드하여 오류가 발생하지 않았는지 확인합니다.
이제 프로젝트에서 Visual Studio 2022 지원을 추가할 준비가 되었습니다.
Visual Studio 2022 대상 추가
이 섹션에서는 공유 프로젝트를 사용하여 Visual Studio 확장 팩터링 단계를 완료한 것으로 가정합니다.
다음 단계를 사용하여 확장에 Visual Studio 2022 지원을 추가합니다. Visual Studio 2019를 사용하여 완료할 수 있습니다.
솔루션에 새 VSIX 프로젝트를 추가합니다. 이 프로젝트는 Visual Studio 2022를 대상으로 합니다. 템플릿과 함께 제공된 소스 코드를 제거하지만 source.extension.vsixmanifest 파일은 유지합니다.
새 VSIX 프로젝트에서 Visual Studio 2019 대상 VSIX가 참조하는 것과 동일한 공유 프로젝트에 대한 참조를 추가합니다.
새 VSIX 프로젝트가 제대로 빌드되는지 확인합니다. 컴파일러 오류를 해결하려면 원래 VSIX 프로젝트와 일치하도록 참조를 추가해야 할 수 있습니다.
관리되는 Visual Studio 확장의 경우 Visual Studio 2022 대상 프로젝트 파일에서 패키지 참조를 16.x(또는 이전 버전)에서 17.x 패키지 버전으로 업데이트합니다. NuGet 패키지 관리자를 사용하거나 프로젝트 파일을 직접 편집합니다.
-<PackageReference Include="Microsoft.VisualStudio.SDK" Version="16.0.206" /> +<PackageReference Include="Microsoft.VisualStudio.SDK" Version="17.0" /> -<PackageReference Include="Microsoft.VSSDK.BuildTools" Version="16.10.32" /> +<PackageReference Include="Microsoft.VSSDK.BuildTools" Version="17.0" />
이전 코드에 표시된 버전은 데모용입니다. 코드에서 NuGet 웹 사이트에서 사용할 수 있는 버전을 사용합니다.
대부분의 경우 패키지 ID가 변경되었습니다. Visual Studio 2022의 변경 내용 목록은 패키지/어셈블리 매핑 테이블을 참조하세요.
C++로 작성된 확장에는 컴파일할 수 있는 SDK가 아직 없습니다.
C++ 프로젝트의 경우 AMD64용으로 확장을 컴파일해야 합니다. 관리되는 확장의 경우 프로젝트를 Any CPU용 빌드에서 x64 대상으로 변경하는 것이 좋습니다. 이렇게 변경하면 Visual Studio 2022에서 확장이 항상 64비트 프로세스로 로드됩니다. Any CPU도 괜찮지만 x64 전용 네이티브 이진 파일을 참조하는 경우 경고가 발생할 수 있습니다.
확장이 네이티브 모듈에 대해 가질 수 있는 모든 종속성은 x86 이미지에서 AMD64 이미지로 업데이트해야 합니다.
source.extension.vsixmanifest 파일을 편집하여 Visual Studio 2022 대상 지정을 반영합니다. Visual Studio 2022를 나타내도록
<InstallationTarget>
태그를 설정합니다. AMD64 페이로드를 나타내도록ProductArchitecture
요소를 설정합니다.<InstallationTarget Id="Microsoft.VisualStudio.Community" Version="[17.0,18.0)"> <ProductArchitecture>amd64</ProductArchitecture> </InstallationTarget>
Important
Visual Studio 2019에서 이 파일의 디자이너는 새
ProductArchitecture
요소를 노출하지 않습니다. XML 편집기를 사용하여 이 변경을 수행해야 합니다. XML 편집기에서 액세스하려면 솔루션 탐색기 이동하여 Open With 명령을 선택합니다.ProductArchitecture
요소가 중요합니다. Visual Studio 2022가 없으면 확장이 설치되지 않습니다.요소 값 설명 ProductArchitecture
x86
,amd64
이 VSIX에서 지원하는 플랫폼입니다. 대/소문자를 구분하지 않습니다. 요소당 하나의 플랫폼을 사용하고 InstallationTarget
인스턴스당 하나의 요소를 사용합니다. 17.0 미만 제품 버전의 경우 기본값은x86
이며 생략할 수 있습니다. 제품 버전 17.0 이상에서는 이 요소가 필요하며 기본값은 없습니다. Visual Studio 2022의 경우 이 요소에 대한 유효한 콘텐츠는amd64
뿐입니다.Visual Studio 2019(있는 경우)를 대상으로 하는 것과 일치하도록 source.extension.vsixmanifest에서 필요한 다른 조정을 수행합니다.
각각 다른 버전의 Visual Studio를 대상으로 하는 두 가지 버전의 확장을 게시하는 경우 매니페스트의
Identity
요소에 있는 VSIX의 ID가 각 확장에 대해 서로 다른지 확인합니다.
이 시점에서 Visual Studio 2022 대상 확장 VSIX가 있습니다. Visual Studio 2022 대상 VSIX 프로젝트를 빌드하고 표시되는 모든 빌드 중단을 수행해야 합니다. Visual Studio 2022 대상 VSIX 프로젝트에 빌드 중단이 없다면 축하합니다! 테스트할 준비가 완료되었습니다.
호환성이 손상되는 API 변경 처리
호환성이 손상되는 API 변경에는 이전 버전의 Visual Studio에서 실행된 코드를 업데이트해야 할 수 있습니다. 코드를 업데이트하는 방법에 대한 팁은 Visual Studio 2022의 호환성이 손상되는 API 변경 내용을 참조하세요.
코드를 조정하는 경우 조건부 컴파일을 사용하는 것이 좋습니다. 그러면 코드는 Visual Studio 2022에 대한 지원을 추가하는 동시에 이전 Visual Studio 버전을 계속 지원할 수 있습니다.
Visual Studio 2022 대상 확장 빌드를 가져오는 경우 테스트를 진행합니다.
조건부 컴파일 기호 사용
Visual Studio 2022 및 이전 버전에서도 동일한 소스 코드, 동일한 파일을 사용하려면 조건부 컴파일을 사용해야 할 수 있습니다. 그런 다음, 코드를 포크하여 호환성이 손상되는 변경에 맞게 조정할 수 있습니다. 조건부 컴파일은 C#, Visual Basic 및 C++ 언어의 기능입니다. 특정 위치에서 서로 다른 API를 수용하면서 대부분의 코드를 공유하는 데 사용할 수 있습니다.
전처리기 지시문 및 조건부 컴파일 기호 사용에 대한 자세한 내용은 C# 전처리기 지시문을 참조하세요.
이전 Visual Studio 버전을 대상으로 하는 프로젝트에는 조건부 컴파일 기호가 필요합니다. 그런 다음, 이 기호를 사용하여 코드를 포크하여 다른 API를 사용할 수 있습니다. 프로젝트 속성 페이지에서 조건부 컴파일 기호를 설정할 수 있습니다.
모든 구성에 대해 컴파일 기호를 설정해야 합니다. 기본적으로 입력한 기호는 하나의 구성에만 적용될 수 있습니다.
C# 기술
다음 코드와 같이 컴파일 기호를 전처리기 지시문(#if
)으로 사용할 수 있습니다. 그런 다음, 코드를 포크하여 Visual Studio 버전 간의 호환성이 손상되는 변경을 처리할 수 있습니다.
Guid myGuid = new Guid("{633FBA02-719B-40E7-96BF-0899767CD104}");
uint myFlags = 0;
IVsShell shell = await AsyncServiceProvider.GlobalProvider.GetServiceAsync<SVsShell, IVsShell>();
#if Dev16
shell.LoadUILibrary(myGuid, myFlags, out uint ptrLib);
#else
shell.LoadUILibrary(myGuid, myFlags, out IntPtr ptrLib);
#endif
경우에 따라 형식의 이름을 지정하지 않도록 하고 #if
지역에 대한 필요성을 방지하는 데 var
을(를) 사용할 수 있습니다. 앞의 코드 조각은 다음과 같이 작성할 수도 있습니다.
Guid myGuid = new Guid("{633FBA02-719B-40E7-96BF-0899767CD104}");
uint myFlags = 0;
IVsShell shell = await AsyncServiceProvider.GlobalProvider.GetServiceAsync<SVsShell, IVsShell>();
shell.LoadUILibrary(myGuid, myFlags, out var ptrLib);
#if
구문을 사용하는 경우 언어 서비스 컨텍스트에 대한 드롭다운 목록을 사용하여 구문 강조 표시를 변경하는 방법을 확인합니다. 다른 드롭다운 목록을 사용하면 언어 서비스가 이 확장의 대한 대상 Visual Studio 버전과 다른 버전에 집중할 수 있습니다.
XAML 공유 기술
XAML에는 전처리기 기호를 기반으로 콘텐츠를 사용자 지정할 수 있는 전처리기가 없습니다. Visual Studio 2022와 이전 버전 간에 콘텐츠가 다른 두 개의 XAML 페이지를 복사하고 유지 관리해야 할 수 있습니다.
경우에 따라 Visual Studio 2022 및 이전 버전에서 고유한 어셈블리에 있는 형식에 대한 참조는 여전히 하나의 XAML 파일에서 표시될 수 있습니다. 어셈블리를 참조하는 네임스페이스를 제거합니다.
-xmlns:vsui="clr-namespace:Microsoft.VisualStudio.PlatformUI;assembly=Microsoft.VisualStudio.Shell.14.0"
-Value="{DynamicResource {x:Static vsui:TreeViewColors.SelectedItemActiveBrushKey}}"
+Value="{DynamicResource TreeViewColors.SelectedItemActiveBrushKey}"
확장 테스트
Visual Studio 2022를 대상으로 하는 확장을 테스트하려면 Visual Studio 2022를 설치해야 합니다. 이전 버전의 Visual Studio에서는 64비트 확장을 실행할 수 없습니다.
Visual Studio 2022를 사용하여 Visual Studio 2022 또는 이전 버전을 대상으로 하는지 여부에 관계없이 확장을 빌드하고 테스트할 수 있습니다. Visual Studio 2022에서 VSIX 프로젝트를 열면 Visual Studio의 실험적 인스턴스가 열립니다.
확장을 지원하려는 Visual Studio의 각 버전에서 테스트하는 것이 좋습니다.
확장 게시
확장에 Visual Studio 2022 대상을 추가하고 테스트했습니다. 이제 전 세계가 감탄할 만한 확장 기능을 게시할 준비가 되었습니다.
Visual Studio Marketplace
Visual Studio Marketplace에 확장을 게시하면 새 사용자가 확장을 찾아 설치할 수 있습니다. 확장이 Visual Studio 2022를 독점적으로 대상으로 하는지 또는 이전 Visual Studio 버전을 대상으로 하는지 여부에 관계없이 Marketplace에서 지원합니다.
나중에 Marketplace에서 여러 VSIX를 하나의 Marketplace 목록에 업로드할 수 있습니다. 그런 다음, 이전 버전의 Visual Studio용 Visual Studio 2022 대상 VSIX 및 VSIX를 업로드할 수 있습니다. 사용자가 Visual Studio 확장 관리자를 사용할 때 설치한 Visual Studio 버전에 적합한 VSIX를 자동으로 받게 됩니다.
사용자 지정 설치 관리자
MSI 또는 EXE 파일을 빌드하여 확장자를 설치하고 vsixinstaller.exe
를 생성하여 확장자의 일부를 설치하는 경우 Visual Studio 2022의 VSIX 설치 관리자가 업데이트되었습니다. 개발자는 Visual Studio 2022와 함께 제공되는 VSIX 설치 관리자 버전을 사용하여 해당 버전의 Visual Studio에 대한 확장을 설치해야 합니다.
Visual Studio 2022의 VSIX 설치 관리자는 동일한 컴퓨터에 Visual Studio 2022에 있는 이전 버전의 Visual Studio를 대상으로 하는 적용 가능한 확장도 설치합니다.
네트워크 공유
LAN 또는 다른 방법을 통해 확장을 공유할 수 있습니다. Visual Studio 2022 및 이전 버전을 대상으로 하는 경우 여러 VSIX를 개별적으로 공유해야 합니다. 사용자가 설치한 Visual Studio 버전에 따라 설치할 VSIX를 알 수 있도록 파일 이름을 지정하거나 고유한 폴더에 배치합니다.
종속성
VSIX가 <dependency>
요소를 통해 다른 VSIX를 종속성으로 지정하는 경우 참조된 각 VSIX는 VSIX와 동일한 대상 및 제품 아키텍처에 설치되어야 합니다. 종속 VSIX가 Visual Studio의 대상 설치를 지원하지 않으면 VSIX가 실패합니다.
종속 VSIX가 사용자보다 더 많은 대상과 아키텍처를 지원하는 것도 괜찮습니다. 이 제한은 종속성이 있는 VSIX의 배포 및 배포 접근 방식이 종속성의 배포 및 배포 방식을 미러링해야 한다는 것을 의미합니다.
질문 & 답변
Q: 내 확장은 데이터(예: 템플릿)만 제공하기 때문에 상호 운용성 변경이 필요하지 않습니다. Visual Studio 2022도 포함하는 단일 확장을 만들 수 있나요?
A: 예! 이에 관한 정보는 코드를 실행하지 않는 확장을 참조하세요.
Q: NuGet 종속성이 이전 상호 운용성 어셈블리를 가져와 클래스가 충돌합니다. 어떻게 해야 합니까?
A: 중복 어셈블리를 방지하려면 .csproj 파일에 다음 줄을 추가합니다.
<PackageReference Include="<Name of offending assembly>" ExcludeAssets="compile" PrivateAssets="all" />
이 코드는 패키지 참조가 다른 종속성에서 이전 버전의 어셈블리를 가져오는 것을 방지합니다.
Q: 원본 파일을 공유 프로젝트로 전환한 후 Visual Studio에서 내 명령 및 바로 가기 키의 작동이 중지되었습니다. 어떻게 해야 합니까?
A: Image Optimizer 샘플의 2.4단계에서는 VSCT 파일을 연결 항목으로 추가하여 VSCT 파일로 컴파일하는 방법을 보여줍니다.
관련 콘텐츠
프로젝트에 대한 링크와 각 단계에 대한 코드 변경 내용이 포함된 단계별 예제인 ImageOptimizer를 따릅니다.