이 문서에서는 MSIX를 사용하여 (즉, 외부 위치로 패키지되었거나 패키지되지 않은 상태로) 설치되지 않은 앱을 구성하여 부트스트래퍼 API를 활용하고, Windows 앱 SDK 런타임을 명시적으로 로드하며, Windows 앱 SDK API를 호출하는 방법을 설명합니다. MSIX를 통해 설치되지 않은 앱에는 외부 위치로 패키지된 앱과 패키지되지 않은 앱이 포함됩니다.
중요합니다
Windows App SDK 1.0부터 외부 위치로 패키지된 앱 또는 패키지되지 않은 앱에서 Windows App SDK를 로드하는 기본 방식은 자동 초기화를 <WindowsPackageType> 프로젝트 속성을 통해 사용하고 추가 구성을 변경하는 것입니다. WinUI 프로젝트의 컨텍스트에서 자동 초기화와 관련된 단계는 첫 번째 WinUI 프로젝트 만들기를 참조하세요. 또는 WinUI가 아닌 기존 프로젝트가 있는 경우 기존 프로젝트에서 Windows 앱 SDK 사용을 참조하세요.
고급 요구 사항(예: 사용자 지정 오류 처리 또는 특정 버전의 Windows 앱 SDK 로드)이 있는 경우 그 대신 부트스트래퍼 API를 명시적으로 호출하면 됩니다. 이것이 이 항목에서 보여 주는 접근 방식입니다. 또한, 자세한 내용은 외부 위치로 패키지되는 앱 또는 패키지되지 않은 앱에 Windows App SDK 런타임 사용을 참조하세요.
이 항목에서는 기본 콘솔 앱 프로젝트에서 부트스트래퍼 API를 명시적으로 호출하는 방법을 보여 줍니다. 그러나 단계는 Windows 앱 SDK를 사용하는 패키지되지 않은 모든 데스크톱 앱에 적용됩니다.
이 자습서를 완료하기 전에 런타임 아키텍처 를 검토 하여 앱이 Windows 앱 SDK 사용할 때 사용하는 프레임워크 패키지 종속성과 외부 위치 또는 패키지되지 않은 앱으로 패키지된 앱에서 작동하는 데 필요한 추가 구성 요소에 대해 자세히 알아보는 것이 좋습니다.
필수 조건
- Windows 앱 SDK용 도구 설치.
- 외부 위치로 패키지된 앱 및 패키지되지 않은 앱에 대한 모든 종속성이 설치되어 있는지 확인합니다(외부 위치로 패키지되거나 패키지 되지 않은 프레임워크 종속 앱에 대한 Windows 앱 SDK 배포 가이드 참조). 이 작업을 수행하는 쉬운 방법은 Windows 앱 SDK 런타임 설치 관리자를 실행하는 것입니다.
지침
C# 또는 C++ 프로젝트를 사용하여 이 자습서를 따를 수 있습니다.
참고
동적 종속성 및 부트스트래퍼 API는 관리자 권한 프로세스에 의해 호출될 때 실패합니다. 따라서 Visual Studio를 관리자 권한으로 시작해서는 안 됩니다. 자세한 내용은 동적 종속성에서 권한 상승 #567을 지원하지 않음을 참조하세요.
다음 지침에 따라 외부 위치로 패키지되거나 패키지되지 않은 C# WinUI 프로젝트를 구성합니다.
Visual Studio에서 새 C# 콘솔 앱 프로젝트를 만듭니다. 프로젝트 이름을 DynamicDependenciesTest로 지정합니다. 프로젝트를 만든 후에는 "Hello, World!" C# 콘솔 앱이 있어야 합니다.
다음으로 프로젝트를 구성합니다.
- 솔루션 탐색기에서 프로젝트를 마우스 오른쪽 단추로 클릭하고 프로젝트 파일 편집을 선택합니다.
- TargetFramework 요소의 값을 대상 프레임워크 모니커로 바꿉니다. 예를 들어 앱이 Windows 10 버전 2004를 대상으로 하는 경우 다음을 사용합니다.
<TargetFramework>net8.0-windows10.0.19041.0</TargetFramework>- 프로젝트 파일을 저장한 후 닫습니다.
솔루션의 플랫폼을 x64로 변경합니다. .NET 프로젝트의 기본값은 AnyCPU이지만 WinUI는 해당 플랫폼을 지원하지 않습니다.
- 빌드>구성 관리자를 차례로 선택합니다.
- 활성 솔루션 플랫폼에서 드롭다운을 선택하고 새로 만들기를 클릭하여 새 솔루션 플랫폼 대화 상자를 엽니다.
- 새 플랫폼 유형 또는 선택 아래의 드롭다운에서 x64를 선택합니다.
- 확인을 클릭하여 새 솔루션 플랫폼 대화 상자를 닫습니다.
- Configuration Manager에서 닫기를 클릭합니다.
프로젝트에 Windows App SDK NuGet 패키지를 설치합니다.
- 솔루션 탐색기에서 Dependencies 노드를 마우스 오른쪽 단추로 클릭하고 Manage Nuget Packages를 선택합니다.
- 이 NuGet 패키지 관리자 창에서 찾아보기 탭을 선택하고 Microsoft.WindowsAppSDK 패키지를 설치합니다.
이제 부트스트래퍼 API(외부 위치로 패키지되거나 패키지 되지 않은 앱에 Windows 앱 SDK 런타임 사용 참조)를 사용하여 Windows 앱 SDK 프레임워크 패키지에 대한 종속성을 동적으로 사용할 준비가 되었습니다. 이를 통해 앱에서 Windows App SDK API를 사용할 수 있습니다.
해당 Program.cs 코드 파일을 열고 기본 코드를 다음 코드로 바꿔 부트스트랩.Initialize 메서드를 호출 하여 부트스트래퍼를 초기화 합니다. 이 코드는 부트스트래퍼를 초기화할 때 앱이 의존하는 Windows App SDK 버전을 정의합니다.
중요합니다
특정 구성에 맞게 아래 코드를 편집해야 합니다. 설치한 Windows 앱 SDK 버전 중 하나를 지정할 수 있도록 Bootstrap.Initialize 메서드의 매개 변수에 대한 설명을 참조하세요.
using System; using Microsoft.Windows.ApplicationModel.DynamicDependency; namespace DynamicDependenciesTest { class Program { static void Main(string[] args) { Bootstrap.Initialize(0x00010002); Console.WriteLine("Hello, World!"); // Release the DDLM and clean up. Bootstrap.Shutdown(); } } }루트에서 부트스트래퍼 API는 앱에서 Windows 앱 SDK API를 사용할 수 있도록 하는 네이티브 C/C++ API입니다. 그러나 Windows 앱 SDK 1.0 이상을 사용하는 .NET 앱에서는 부트스트래퍼 API에 .NET 래퍼를 사용할 수 있습니다. 이 래퍼는 네이티브 C/C++ 함수를 직접 호출하는 것보다 .NET 앱에서 부트스트래퍼 API를 호출하는 더 쉬운 방법을 제공합니다. 이전 코드 예제에서는 부트스트래퍼 API에 대한 .NET 래퍼에서 Bootstrap 클래스의 정적 Initialize 및 Shutdown 메서드를 호출합니다.
Windows App SDK 런타임 구성 요소가 제대로 로드되었음을 보여 주기 위해 Windows App SDK의 ResourceManager 클래스를 사용하여 문자열 리소스를 로드하는 일부 코드를 추가합니다.
프로젝트에 새 리소스 파일(.resw) 을 추가합니다(기본 이름 그대로 두기).
편집기에서 리소스 파일을 연 상태에서 다음 속성을 사용하여 새 문자열 리소스를 만듭니다.
- 이름: 메시지
- 값: 안녕하세요, 리소스!
리소스 파일을 저장합니다.
해당 Program.cs 코드 파일을 열고
Console.WriteLine("Hello, World!");행을 다음 코드로 바꿉니다.
// Create a resource manager using the resource index generated during build. var manager = new Microsoft.Windows.ApplicationModel.Resources.ResourceManager("DynamicDependenciesTest.pri"); // Look up a string in the .resw file using its name. Console.WriteLine(manager.MainResourceMap.GetValue("Resources/Message").ValueAsString);-
디버깅 없이 시작 (또는 디버깅 시작)을 클릭하여 앱을 빌드하고 실행합니다. 문자열
Hello, resources!가 성공적으로 표시되어야 합니다.
프로젝트가 WPF인 경우
WPF(Windows Presentation Foundation) 앱의 경우 WPF 앱에서 Windows 앱 SDK 사용을 참조하세요.
관련 항목
Windows developer