MSIX AppContainer 앱

레거시 애플리케이션용 AppContainer 항목에서는 AppContainer 환경의 정의 및 이점에 대한 모든 필수 배경 정보를 다룹니다. 이 항목에는 프로세스가 AppContainer 내에서 실행 중인지 여부를 테스트하기 위한 C# 및 C++ 코드 예제도 포함되어 있습니다.

이제 읽고 있는 항목에서는 MSIX를 사용하여 패키지된 앱을 가져와 AppContainer 환경(경량 앱 컨테이너)에서 실행하도록 쉽게 구성하는 방법을 보여 줍니다. UWP(유니버설 Windows 플랫폼) 앱은 자동으로 AppContainer 앱입니다. 그러나 MSIX로 패키지된 데스크톱 앱을 AppContainer 앱으로 구성할 수도 있습니다.

앱 컨테이너 앱의 프로세스와 그 자식 프로세스는 경량 앱 컨테이너 내에서 실행되며, 해당 프로세스는 특별히 부여된 리소스에만 액세스할 수 있습니다. 또한 파일 시스템 및 레지스트리 가상화를 사용하여 격리됩니다. 따라서 AppContainer에 구현된 앱은 해킹을 통해 할당된 제한된 리소스 외의 악의적인 동작을 허용할 수 없습니다.

패키지되지 않은 앱도 AppContainer에서 실행할 수 있습니다. 그러나 MSIX를 사용하여 패키지하는 경우 AppContainer를 사용하기가 특히 쉽습니다. 따라서 이 항목에 설명된 모든 시나리오는 패키지된 앱에 관한 것입니다.

AppContainer에 대한 WinUI 3 프로젝트 구성

패키지된 C# 또는 C++ WinUI 3 데스크톱 앱에 대한 새 프로젝트 만들기의 단계에서는 새 WinUI 3 프로젝트를 만드는 기본 및 권장 방법을 보여줍니다.

기본적으로 프로젝트의 Package.appxmanifest 파일에는 완전 신뢰(즉, 중간 무결성 수준) 패키지에 대한 구성이 포함됩니다. 관련 섹션은 다음과 같습니다.

...
<Applications>
  <Application ...
    EntryPoint="$targetentrypoint$">
    ...
  </Application>
</Applications>

<Capabilities>
  <rescap:Capability Name="runFullTrust" />
</Capabilities>
...

패키지를 AppContainer 앱을 포함하는 것으로 구성하려면 EntryPoint 특성을 편집하고 제한된 기능 선언을 제거할 수 있습니다(그러나 Capabilities 요소를 유지). 다음과 같습니다.

...
<Applications>
  <Application ...
    EntryPoint="windows.partialTrustApplication">
    ...
  </Application>
</Applications>

<Capabilities/>
...

패키지가 Windows 10 버전 2004(10.0; 빌드 19041) 이상에서는 EntryPoint를 설정하는 대신 uap10:TrustLeveluap10:RuntimeBehavior를 설정할 수 있습니다(표시된 대로 XML 네임스페이스 접두사를 선언한 후). 다음과 같습니다.

<Package ...
  xmlns:uap10="http://schemas.microsoft.com/appx/manifest/uap/windows10/10"
  ...>
...
  <Applications>
    <Application ...
      EntryPoint="$targetentrypoint$"
      uap10:TrustLevel="appContainer"
      uap10:RuntimeBehavior="packagedClassicApp">
      ...
    </Application>
  </Applications>

  <Capabilities/>
...

자세한 내용은 다음 항목을 참조하세요.

AppContainer에 대한 WinUI 3 2 프로젝트 솔루션 구성

이전 섹션에서는 단일 프로젝트 MSIX에 대한 프로세스를 설명했습니다. 권장하며 새 WinUI 3 프로젝트의 기본값입니다. 자세한 내용은 단일 프로젝트 MSIX를 사용하여 앱 패키지 지정을 참조하세요.

그러나 단일 프로젝트 MSIX 기능이 도입되기 이전의 WinUI 3 프로젝트가 있을 수 있습니다. 이 경우 솔루션에 앱 프로젝트와 추가 Windows 애플리케이션 패키징 프로젝트라는 두 개의 프로젝트가 있습니다. 프로젝트를 단일 프로젝트 MSIX로 마이그레이션할 수 있는 경우 이상적입니다. 또한 이전 섹션의 지침을 따를 수 있습니다. 자세한 내용은 단일 프로젝트 MSIX를 사용하여 앱 패키지 지정을 참조하세요.

프로젝트를 단일 프로젝트 MSIX로 마이그레이션할 수 없는 경우 이 섹션에서는 AppContainer 앱을 포함하는 것으로 패키지를 구성하는 방법을 설명합니다.

Windows 애플리케이션 패키징 프로젝트는 구성을 재정의Package.appxmanifest하는 기본 설정을 의미합니다. 프로젝트는 프로젝트 파일에 Full 값으로 설정된 TrustLevel 속성이 있는 것처럼 동작합니다.

암시적 속성 값을 해결하려면 패키징 프로젝트의 종속성>애플리케이션 노드를 확장하고 WinUI 3 프로젝트에 대한 참조를 나타내는 노드를 선택합니다. 그런 다음, Visual Studio의 속성 창(프로젝트 속성 아님)에서 신뢰 수준 속성에 대해 부분 신뢰 값을 선택합니다.

이제 패키징 프로젝트의 프로젝트 파일에 다음 명시적 속성이 포함됩니다.

...
<ItemGroup>
  <ProjectReference Include="...">
    <TrustLevel>Partial</TrustLevel>
  </ProjectReference>
</ItemGroup>
...

이제 패키징 프로젝트의 Package.appxmanifest 파일에서 제거할 <rescap:Capability Name="runFullTrust" /> 수 있습니다.

AppContainer에 대한 Windows 애플리케이션 프로젝트(C++ Win32 WndProc 형식 앱) 구성

이 섹션은 Windows 애플리케이션 프로젝트 프로젝트 템플릿을 사용하여 만든 C++ Win32 WndProc 형식 프로젝트가 있는 경우에 적합합니다. 한마디로 첫 번째 단계는 C++ Windows 애플리케이션 패키징 프로젝트를 솔루션에 추가하는 것입니다. Visual Studio에서 MSIX 패키징을 위한 데스크톱 애플리케이션 설정의 정확한 단계에 대한 자세한 내용이 있습니다. 이 항목은 C++ 또는 C#으로 작성된 데스크톱 앱에 적용됩니다.

그런 다음, 새 패키징 프로젝트의 프로젝트 파일을 열고 다음과 같이 기존 ProjectReference 속성에 TrustLevel 속성을 추가합니다.

...
<ItemGroup>
  <ProjectReference Include="...">
    <TrustLevel>Partial</TrustLevel>
  </ProjectReference>
</ItemGroup>
...

빌드할 때 "오류 APPX1673: 앱 매니페스트에 필수 요소 '전화Identity'"가 누락되었습니다. 이 경우 다음과 같이 프로젝트의 Package.appxmanifest 파일을 편집합니다.

<Package ...
  xmlns:mp="http://schemas.microsoft.com/appx/2014/phone/manifest"
  ...>
...
  <mp:PhoneIdentity
      PhoneProductId="A GUID in the form xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx."
      PhonePublisherId="A GUID in the form xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx.">
  </mp:PhoneIdentity>
...

AppContainer에 대한 WPF 또는 WinForms 프로젝트 구성

다음 중 하나가 있는 경우 이 섹션을 참조하세요.

한마디로 첫 번째 단계는 솔루션에 C# Windows 애플리케이션 패키징 프로젝트를 추가하는 것입니다. Visual Studio에서 MSIX 패키징을 위한 데스크톱 애플리케이션 설정의 정확한 단계에 대한 자세한 내용이 있습니다.

그런 다음 패키징 프로젝트의 종속성>애플리케이션 노드를 확장하고 WPF 또는 WinForms 프로젝트에 대한 참조를 나타내는 노드를 선택합니다. 그런 다음, Visual Studio의 속성 창(프로젝트 속성 아님)에서 신뢰 수준 속성에 대해 부분 신뢰 값을 선택합니다.