호스트되는 앱 만들기

Windows 10 버전 2004부터 호스팅된 앱을 만들 수 있습니다. 호스팅된 앱은 상위 호스트 앱과 동일한 실행 파일 및 정의를 공유하지만 시스템에서 별도의 앱처럼 보이고 작동합니다.

호스트되는 앱은 독립 실행형 Windows 10 앱처럼 동작하는 구성 요소(예: 실행 파일 또는 스크립트 파일)를 원하는 경우에는 유용하지만, 구성 요소를 실행하려면 호스트 프로세스가 필요합니다. 예를 들어 PowerShell 또는 Python 스크립트는 실행하기 위해 호스트를 설치해야 하는 호스팅된 앱으로 제공될 수 있습니다. 호스트되는 앱에는 자체 시작 타일, ID 및 Windows 10 기능(예: 백그라운드 작업, 알림, 타일 및 공유 대상)과의 긴밀한 통합이 있을 수 있습니다.

호스팅된 앱 기능은 호스팅된 앱이 호스트 앱 패키지의 실행 파일 및 정의를 사용할 수 있도록 하는 패키지 매니페스트의 여러 요소 및 특성에서 지원됩니다. 사용자가 호스팅된 앱을 실행하면 OS는 호스팅된 앱의 ID로 호스트 실행 파일을 자동으로 시작합니다. 그런 다음 호스트는 시각적 자산, 콘텐츠를 로드하거나 API를 호스팅된 앱으로 호출할 수 있습니다. 호스팅된 앱은 호스트와 호스팅된 앱 간에 선언된 기능의 교차점을 가져옵니다. 즉, 호스팅된 앱은 호스트가 제공하는 것보다 더 많은 기능을 요청할 수 없습니다.

호스트 정의

호스트는 호스팅된 앱의 기본 실행 파일 또는 런타임 프로세스입니다. 현재 지원되는 호스트는 패키지 ID가 있는 데스크톱 앱(.NET 또는 C++ 데스크톱)뿐입니다. 데스크톱 앱에 패키지 ID가 있는 방법에는 여러 가지가 있습니다.

호스트는 uap10:HostRuntime 확장에 의해 패키지 매니페스트에서 선언됩니다. 이 확장에는 호스팅된 앱의 패키지 매니페스트에서도 참조하는 값을 할당해야 하는 Id 특성이 있습니다. 호스팅된 앱이 활성화되면 호스트는 호스팅된 앱의 ID로 시작되고 호스팅된 앱 패키지에서 콘텐츠 또는 이진을 로드할 수 있습니다.

다음 예는 패키지 매니페스트에서 호스트를 정의하는 방법을 보여 줍니다. uap10:HostRuntime 확장은 패키지 전체에 적용되므로 Package 요소의 하위 요소로 선언됩니다.

<Package xmlns:uap10="http://schemas.microsoft.com/appx/manifest/uap/windows10/10">

  <Extensions>
    <uap10:Extension Category="windows.hostRuntime"  
        Executable="PyScriptEngine\PyScriptEngine.exe"  
        uap10:RuntimeBehavior="packagedClassicApp"  
        uap10:TrustLevel="mediumIL">
      <uap10:HostRuntime Id="PythonHost" />
    </uap10:Extension>
  </Extensions>

</Package>

다음 요소에 대한 중요한 세부 정보를 기록해 두세요.

요소 세부 정보
uap10:Extension windows.hostRuntime 범주는 호스팅된 앱을 활성화할 때 사용할 런타임 정보를 정의하는 패키지 전체 확장을 선언합니다. 호스팅된 앱은 확장에 선언된 정의로 실행됩니다. 이전 예에서 선언된 호스트 앱을 사용할 때 호스팅된 앱은 mediumIL 신뢰 수준에서 실행 가능한 PyScriptEngine.exe로 실행됩니다.

Executable, uap10:RuntimeBehavioruap10:TrustLevel 특성은 패키지의 호스트 프로세스 이진 이름과 호스팅된 앱이 실행되는 방식을 지정합니다. 예를 들어, 이전 예제의 특성을 사용하는 호스팅된 앱은 mediumIL 신뢰 수준에서 실행 가능한 PyScriptEngine.exe로 실행됩니다.
uap10:HostRuntime Id 특성은 패키지에서 이 특정 호스트 앱의 고유 식별자를 선언합니다. 패키지에는 여러 호스트 앱이 있을 수 있으며 각 앱에는 고유한 Id가 있는 uap10:HostRuntime 요소가 있어야 합니다.

호스팅된 앱 선언

호스팅된 앱호스트에 대한 패키지 종속성을 선언합니다. 호스팅된 앱은 자체 패키지에서 실행 가능한 진입점을 지정하는 대신 활성화를 위해 호스트의 ID(즉, 호스트 패키지에 있는 uap10:HostRuntime 확장의 Id 특성)를 활용합니다. 호스팅된 앱에는 일반적으로 호스트에서 액세스할 수 있는 콘텐츠, 시각적 자산, 스크립트 또는 이진이 포함됩니다. 호스팅된 앱 패키지의 TargetDeviceFamily 값은 호스트와 동일한 값을 대상 지정해야 합니다.

호스팅된 앱 패키지는 서명되거나 서명되지 않을 수 있습니다.

  • 서명된 패키지에는 실행 파일이 포함될 수 있습니다. 이는 호스트가 호스팅된 앱 패키지에 DLL 또는 등록된 구성 요소를 로드할 수 있도록 하는 이진 확장 메커니즘이 있는 시나리오에서 유용합니다.
  • 대부분의 시나리오에서 서명되지 않은 패키지에는 실행 가능한 콘텐츠가 담겨 있습니다. 그러나 실행 불가능한 파일만 담겨 있는, 서명되지 않은 패키지는 호스트가 이미지, 자산, 콘텐츠 또는 스크립트 파일만 로드해야 하는 시나리오에 유용합니다. 서명되지 않은 패키지의 Identity(ID) 요소에는 특별한 OID 값이 포함되어야 합니다. 그렇지 않으면 서명되지 않은 패키지의 등록이 허용되지 않습니다. 이렇게 하면 서명되지 않은 패키지가 서명된 패키지의 ID와 충돌하거나 위장하는 것을 방지할 수 있습니다.

호스팅된 앱을 정의하려면 패키지 매니페스트에서 다음 항목을 선언합니다.

다음 예는 서명되지 않은 호스팅 앱에 대한 패키지 매니페스트의 관련 섹션을 보여 줍니다.

<Package xmlns:uap10="http://schemas.microsoft.com/appx/manifest/uap/windows10/10">

  <Identity Name="NumberGuesserManifest"
    Publisher="CN=AppModelSamples, OID.2.25.311729368913984317654407730594956997722=1"
    Version="1.0.0.0" />

  <Dependencies>
    <TargetDeviceFamily Name="Windows.Desktop" MinVersion="10.0.19041.0" MaxVersionTested="10.0.19041.0" />
    <uap10:HostRuntimeDependency Name="PyScriptEnginePackage" Publisher="CN=AppModelSamples" MinVersion="1.0.0.0"/>
  </Dependencies>

  <Applications>
    <Application Id="NumberGuesserApp"  
      uap10:HostId="PythonHost"  
      uap10:Parameters="-Script &quot;NumberGuesser.py&quot;">
    </Application>
  </Applications>

</Package>

다음 요소에 대한 중요한 세부 정보를 기록해 두세요.

요소 세부 정보
ID 이 예에서 호스팅된 앱 패키지는 서명되지 않았으므로 Publisher 특성에는 OID.2.25.311729368913984317654407730594956997722=1 문자열이 포함되어야 합니다. 이렇게 하면 서명되지 않은 패키지가 서명된 패키지의 ID를 스푸핑할 수 없습니다.
TargetDeviceFamily MinVersion 특성은 10.0.19041.0 이상의 OS 버전을 지정해야 합니다.
uap10:HostRuntimeDependency 이 요소는 호스트 앱 패키지에 대한 종속성을 선언합니다. 이는 호스트 패키지의 NamePublisher, 그리고 종속된 MinVersion으로 구성됩니다. 이러한 값은 호스트 패키지의 Identity 요소에서 찾을 수 있습니다.
애플리케이션 uap10:HostId 특성은 호스트에 대한 종속성을 나타냅니다. 호스팅된 앱 패키지는 Application 또는 Extension 요소에 대한 일반적인 ExecutableEntryPoint 특성 대신 이 특성을 선언해야 합니다. 결과적으로 호스팅된 앱은 해당 HostId 값을 사용하여 호스트에서 Executable, EntryPoint 및 런타임 특성을 상속합니다.

uap10:Parameters 특성은 호스트 실행 파일의 진입점 함수에 전달되는 매개 변수를 지정합니다. 호스트는 이러한 매개 변수로 무엇을 해야 하는지 알아야 하기 때문에 호스트와 호스트된 앱 간에 묵시적 계약이 있습니다.

런타임에 서명되지 않은 호스팅 앱 패키지 등록

uap10:HostRuntime 확장의 한 가지 이점은 호스트가 런타임 시 호스팅된 앱 패키지를 동적으로 생성하고 PackageManager API를 사용하여 등록할 수 있다는 것입니다. 서명할 필요 없이. 이를 통해 호스트는 호스팅된 앱 패키지에 대한 콘텐츠 및 매니페스트를 동적으로 생성한 다음 등록할 수 있습니다.

PackageManager 클래스의 다음 메서드를 사용하여 서명되지 않은 호스팅 앱 패키지를 등록합니다. 이러한 방법은 Windows 10 버전 2004부터 사용할 수 있습니다.

  • AddPackageByUriAsync: options 매개 변수의 AllowUnsigned 속성을 사용하여 서명되지 않은 MSIX 패키지를 등록합니다.
  • RegisterPackageByUriAsync: 느슨한 패키지 매니페스트 파일 등록을 수행합니다. 패키지가 서명된 경우 매니페스트가 포함된 폴더에는 .p7x 파일 및 카탈로그가 포함되어야 합니다. 서명되지 않은 경우 options 매개 변수의 AllowUnsigned 속성을 설정해야 합니다.

서명되지 않은 호스팅 앱에 대한 요구 사항

  • 패키지 매니페스트의 Application 또는 Extension 요소는 Executable, EntryPoint 또는 TrustLevel 특성과 같은 활성화 데이터를 포함할 수 없습니다. 대신 이러한 요소에는 호스트에 대한 종속성을 나타내는 uap10:HostId 특성과 uap10:Parameters 특성만 포함될 수 있습니다.
  • 패키지는 기본 패키지여야 합니다. 번들, 프레임워크 패키지, 리소스 또는 선택적 패키지일 수 없습니다.

서명되지 않은 호스팅 앱 패키지를 설치 및 등록하는 호스트에 대한 요구 사항

  • 호스트에는 패키지 ID가 있어야 합니다.
  • 호스트에는 packageManagement제한된 기능이 있어야 합니다.
    <rescap:Capability Name="packageManagement" />
    

예제

스스로를 호스트로 선언한 다음 런타임 시 호스팅된 앱 패키지를 동적으로 등록하는 완전한 기능의 샘플 앱은 호스팅된 앱 샘플을 참조하세요.

호스트

호스트 이름은 PyScriptEngine입니다. 이는 Python 스크립트를 실행하는 C#으로 작성된 래퍼입니다. -Register 매개 변수를 사용하여 실행할 때 스크립트 엔진은 Python 스크립트가 포함된 호스팅된 앱을 설치합니다. 사용자가 새로 설치된 호스팅 앱을 시작하려고 하면 호스트가 시작되고 NumberGuesser python 스크립트를 실행합니다.

호스트 앱의 패키지 매니페스트(PyScriptEnginePackage 폴더의 Package.appxmanifest 파일)에는 ID가 PythonHost이고 실행 가능한 PyScriptEngine.exe가 있는 호스트로 앱을 선언하는 uap10:HostRuntime 확장이 포함되어 있습니다.

참고 항목

이 샘플에서 패키지 매니페스트의 이름은 Package.appxmanifest이며 Windows 애플리케이션 패키징 프로젝트의 일부입니다. 이 프로젝트가 빌드되면 AppxManifest.xml이라는 매니페스트를 생성하고 호스트 앱에 대한 MSIX 패키지를 빌드합니다.

호스팅된 앱

호스팅된 앱은 Python 스크립트와 패키지 매니페스트와 같은 패키지 아티팩트로 구성됩니다. PE 파일이 포함되어 있지 않습니다.

호스팅된 앱의 패키지 매니페스트(NumberGuesser/AppxManifest.xml 파일)에는 다음 항목이 포함되어 있습니다.

  • Identity 요소의 Publisher 특성에는 서명되지 않은 패키지에 필요한 OID.2.25.311729368913984317654407730594956997722=1 식별자가 포함되어 있습니다.
  • Application 요소의 uap10:HostId 특성은 PythonHost를 호스트로 식별합니다.

샘플 실행

샘플에는 버전 10.0.19041.0 이상의 Windows 10 및 Windows SDK가 필요합니다.

  1. 개발 컴퓨터의 폴더에 샘플을 다운로드합니다.

  2. Visual Studio에서 PyScriptEngine.sln 솔루션을 열고 PyScriptEnginePackage 프로젝트를 시작 프로젝트로 설정합니다.

  3. PyScriptEnginePackage 프로젝트를 빌드합니다.

  4. 솔루션 탐색기에서 PyScriptEnginePackage 프로젝트를 마우스 오른쪽 단추로 클릭하고 배포를 선택합니다.

  5. 샘플 파일을 복사한 디렉터리로 명령 프롬프트 창을 열고 다음 명령을 실행하여 샘플 NumberGuesser 앱(호스팅된 앱)을 등록합니다. D:\repos\HostedApps를 샘플 파일을 복사한 경로로 변경합니다.

    D:\repos\HostedApps>pyscriptengine -Register D:\repos\HostedApps\NumberGuesser\AppxManifest.xml
    

    참고 항목

    샘플의 호스트가 AppExecutionAlias를 선언하므로 명령줄에서 pyscriptengine을 실행할 수 있습니다.

  6. 시작 메뉴를 열고 NumberGuesser를 클릭하여 호스팅된 앱을 실행합니다.