호스트되는 앱 만들기Create hosted apps

Windows 10 버전 2004부터 호스트 된 앱을 만들 수 있습니다.Starting in Windows 10, version 2004, you can create hosted apps. 호스팅된 앱은 부모 호스트 앱과 동일한 실행 파일 및 정의를 공유 하지만 시스템에서 별도의 앱 처럼 보이고 동작 합니다.A hosted app shares the same executable and definition as a parent host app, but it looks and behaves like a separate app on the system.

호스트되는 앱은 독립 실행형 Windows 10 앱처럼 동작하는 구성 요소(예: 실행 파일 또는 스크립트 파일)를 원하는 경우에는 유용하지만, 구성 요소를 실행하려면 호스트 프로세스가 필요합니다.Hosted apps are useful for scenarios where you want a component (such as an executable file or a script file) to behave like a standalone Windows 10 app, but the component requires a host process in order to execute. 예를 들어 PowerShell 또는 Python 스크립트를 실행 하기 위해 호스트를 설치 해야 하는 호스트 된 앱으로 배달할 수 있습니다.For example, a PowerShell or Python script could be delivered as a hosted app that requires a host to be installed in order to run. 호스트되는 앱에는 자체 시작 타일, ID 및 Windows 10 기능(예: 백그라운드 작업, 알림, 타일 및 공유 대상)과의 긴밀한 통합이 있을 수 있습니다.A hosted app can have its own start tile, identity, and deep integration with Windows 10 features such as background tasks, notifications, tiles, and share targets.

호스팅된 앱 기능은 호스트 된 앱이 호스트 앱 패키지에서 실행 파일 및 정의를 사용할 수 있도록 하는 패키지 매니페스트의 여러 요소 및 특성에서 지원 됩니다.The hosted apps feature is supported by several elements and attributes in the package manifest that enable a hosted app to use an executable and definition in a host app package. 사용자가 호스트 된 앱을 실행 하면 OS에서 호스트 된 앱의 id로 호스트 실행 파일을 자동으로 시작 합니다.When a user runs the hosted app, the OS automatically launches the host executable under the identity of the hosted app. 호스트는 시각적 자산, 콘텐츠 또는 호출 Api를 호스트 된 앱으로 로드할 수 있습니다.The host can then load visual assets, content, or call APIs as the hosted app. 호스트 된 앱은 호스트와 호스트 된 앱 간에 선언 된 기능의 교집합을 가져옵니다.The hosted app gets the intersection of capabilities declared between the host and hosted app. 즉, 호스트 된 앱이 호스트에서 제공 하는 것 보다 많은 기능을 요청할 수 없습니다.This means that a hosted app cannot ask for more capabilities than what the host provides.

호스트 정의Define a host

호스트는 호스트 된 앱에 대 한 기본 실행 파일 또는 런타임 프로세스입니다.The host is the main executable or runtime process for the hosted app. 현재 유일 하 게 지원 되는 호스트는 패키지 id를 포함 하는 데스크톱 앱 (.Net 또는 c + +/win32)입니다.Currently, the only supported hosts are desktop apps (.NET or C++/Win32) that have package identity. 지금은 UWP 앱이 호스트로 지원 되지 않습니다.UWP apps are not supported as hosts at this time. 데스크톱 앱에 패키지 id를 포함 하는 방법에는 여러 가지가 있습니다.There are several ways for a desktop app to have package identity:

  • 데스크톱 앱에 패키지 id를 부여 하는 가장 일반적인 방법은 MSIX 패키지에서패키지 id를 패키징하는 것입니다.The most common way to grant package identity to a desktop app is by packaging it in an MSIX package.
  • 경우에 따라 스파스 패키지를 만들어 패키지 id를 부여 하도록 선택할 수도 있습니다.In some cases, you may alternatively choose to grant package identity by creating a sparse package. 이 옵션은 데스크톱 앱을 배포 하기 위해 MSIX 패키징을 채택할 수 없는 경우에 유용 합니다.This option is useful if you are unable to adopt MSIX packaging for deploying your desktop app.

호스트는 uap10: HostRuntime 확장을 통해 패키지 매니페스트에 선언 됩니다.The host is declared in its package manifest by the uap10:HostRuntime extension. 이 확장에는 호스트 된 앱에 대 한 패키지 매니페스트에서 참조 하는 값을 할당 해야 하는 Id 특성이 있습니다.This extension has an Id attribute that must be assigned a value that is also referenced by the package manifest for the hosted app. 호스트 된 앱이 활성화 되 면 호스트는 호스트 된 앱의 id로 시작 되 고 호스트 된 앱 패키지에서 콘텐츠나 이진 파일을 로드할 수 있습니다.When the hosted app is activated, the host is launched under the identity of the hosted app and can load content or binaries from the hosted app package.

다음 예제에서는 패키지 매니페스트에서 호스트를 정의 하는 방법을 보여 줍니다.The following example demonstrates how to define a host in a package manifest. Uap10: HostRuntime 확장은 패키지 전체에 해당 하므로 package 요소의 자식으로 선언 됩니다.The uap10:HostRuntime extension is package-wide and is therefore declared as a child of the Package element.

<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>

다음 요소에 대 한 중요 한 세부 정보를 기록해 둡니다.Make note of these important details about the following elements.

요소Element 세부 정보Details
uap10:Extensionuap10:Extension windows.hostRuntime범주는 호스트 된 앱을 활성화할 때 사용할 런타임 정보를 정의 하는 패키지 전체 확장을 선언 합니다.The windows.hostRuntime category declares a package-wide extension that defines the runtime information to be used when activating a hosted app. 호스팅된 앱은 확장에 선언 된 정의를 사용 하 여 실행 됩니다.A hosted app will run with the definitions declared in the extension. 이전 예제에서 선언 된 호스트 앱을 사용 하는 경우 호스트 된 앱이 Mediumil 신뢰 수준에서 실행 PyScriptEngine.exe 실행 됩니다.When using the host app declared in the previous example, a hosted app will run as the executable PyScriptEngine.exe at the mediumIL trust level.

실행 파일, Uap10: runtimebehavioruap10: TrustLevel 특성은 패키지의 호스트 프로세스 이진 이름과 호스트 된 앱이 실행 되는 방법을 지정 합니다.The Executable, uap10:RuntimeBehavior, and uap10:TrustLevel attributes specify the name of the host process binary in the package and how the hosted apps will run. 예를 들어 이전 예제에서 특성을 사용 하는 호스트 된 앱은 mediumIL 신뢰 수준에서 실행 PyScriptEngine.exe 실행 됩니다.For example, a hosted app using the attributes in the previous example will run as the executable PyScriptEngine.exe at mediumIL trust level.
uap10:HostRuntimeuap10:HostRuntime Id 특성은 패키지의 특정 호스트 앱에 대 한 고유 식별자를 선언 합니다.The Id attribute declares the unique identifier of this specific host app in the package. 패키지에는 여러 호스트 앱이 있을 수 있으며, 각각 고유한 Id를 가진 uap10: HostRuntime 요소가 있어야 합니다.A package can have multiple host apps, and each must have a uap10:HostRuntime element with a unique Id.

호스팅된 앱 선언Declare a hosted app

호스트 된 호스트에 대 한 패키지 종속성을 선언 합니다.A hosted app declares a package dependency on a host. 호스팅된 앱은 자체 패키지에서 진입점 실행 파일을 지정 하는 대신 호스트의 ID (즉, 호스트 패키지에서 uap10: HostRuntime 확장의 id 특성)를 활성화 합니다.The hosted app leverages the host's ID (that is, the Id attribute of the uap10:HostRuntime extension in the host package) for activation instead of specifying an entry point executable in its own package. 호스팅된 응용 프로그램에는 일반적으로 호스트에서 액세스할 수 있는 콘텐츠, 시각적 자산, 스크립트 또는 이진 파일이 포함 되어 있습니다.The hosted app typically contains content, visual assets, scripts, or binaries that may be accessed by the host. 호스트 된 앱 패키지의 Targetdevicefamily 값은 호스트와 동일한 값을 대상으로 해야 합니다.The TargetDeviceFamily value in the hosted app package should target the same value as the host.

호스트 된 앱 패키지는 서명 되거나 서명 되지 않을 수 있습니다.Hosted app packages can be signed or unsigned:

  • 서명 된 패키지는 실행 파일을 포함할 수 있습니다.Signed packages may contain executable files. 이는 호스트가 호스트 된 앱 패키지에서 DLL 또는 등록 된 구성 요소를 로드할 수 있도록 하는 이진 확장 메커니즘이 있는 시나리오에서 유용 합니다.This is useful in scenarios that have a binary extension mechanism, which enables the host to load a DLL or registered component in the hosted app package.
  • 서명 되지 않은 패키지는 실행 파일이 아닌 파일만 포함할 수 있습니다.Unsigned packages can only contain non-executable files. 호스트에서 이미지, 자산, 콘텐츠 또는 스크립트 파일을 로드 하기만 하면 되는 시나리오에서 유용 합니다.This is useful in scenarios where the host only needs to load images, assets and content or script files. 서명 되지 않은 패키지는 OID id 요소에 특수 값을 포함 해야 합니다. 그렇지 않으면 등록할 수 없습니다.Unsigned packages must include a special OID value in their Identity element or they won’t be allowed to register. 이렇게 하면 서명 되지 않은 패키지가 서명 된 패키지의 id와 충돌 하거나이를 스푸핑 하는 것을 방지 합니다.This prevents unsigned packages from conflicting with or spoofing the identity of a signed package.

호스팅된 앱을 정의 하려면 패키지 매니페스트에서 다음 항목을 선언 합니다.To define a hosted app, declare the following items in the package manifest:

다음 예제에서는 서명 되지 않은 호스트 된 앱에 대 한 패키지 매니페스트의 관련 섹션을 보여 줍니다.The following example demonstrates the relevant sections of a package manifest for an unsigned hosted app.

<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>

다음 요소에 대 한 중요 한 세부 정보를 기록해 둡니다.Make note of these important details about the following elements.

요소Element 세부 정보Details
IDIdentity 이 예제의 호스팅된 응용 프로그램 패키지는 서명 되지 않으므로 게시자 특성에는 문자열을 포함 해야 합니다 OID.2.25.311729368913984317654407730594956997722=1 .Because the hosted app package in this example is unsigned, the Publisher attribute must include the OID.2.25.311729368913984317654407730594956997722=1 string. 이렇게 하면 서명 되지 않은 패키지가 서명 된 패키지의 id를 스푸핑할 수 없습니다.This ensures that the unsigned package cannot spoof the identity of a signed package.
TargetDeviceFamilyTargetDeviceFamily MinVersion 특성은 10.0.19041.0 이상 OS 버전을 지정 해야 합니다.The MinVersion attribute must specify 10.0.19041.0 or a later OS version.
uap10:HostRuntimeDependencyuap10:HostRuntimeDependency 이 요소 요소는 호스트 응용 프로그램 패키지에 대 한 종속성을 선언 합니다.This element element declares a dependency on the host app package. 이는 호스트 패키지의 이름게시자 와 종속 된 MinVersion 로 구성 됩니다.This consists of the Name and Publisher of the host package, and the MinVersion it depends on. 이러한 값은 호스트 패키지의 Identity 요소 아래에서 찾을 수 있습니다.These values can be found under the Identity element in the host package.
애플리케이션Application Uap10: HostId 특성은 호스트에 대 한 종속성을 나타냅니다.The uap10:HostId attribute expresses the dependency on the host. 호스팅된 앱 패키지는 응용 프로그램 또는 확장 요소에 대 한 일반적인 실행 파일EntryPoint 특성 대신이 특성을 선언 해야 합니다.The hosted app package must declare this attribute instead of the usual Executable and EntryPoint attributes for an Application or Extension element. 결과적으로 호스트 된 앱은 호스트에서 해당 HostId 값을 사용 하 여 실행 파일, EntryPoint 및 런타임 특성을 상속 합니다.As a result, the hosted app inherits the Executable, EntryPoint and runtime attributes from the host with the corresponding HostId value.

Uap10: parameters 특성은 호스트 실행 파일의 진입점 함수에 전달 되는 매개 변수를 지정 합니다.The uap10:Parameters attribute specifies parameters that are passed to the entry point function of the host executable. 호스트는 이러한 매개 변수를 사용 하 여 수행할 작업을 알고 있어야 하므로 호스트와 호스트 된 앱 간의 묵시적 계약이 있습니다.Because the host needs to know what to do with these parameters, there is an implied contract between the host and hosted app.

런타임에 서명 되지 않은 호스트 된 앱 패키지 등록Register an unsigned hosted app package at run time

Uap10: HostRuntime 확장의 장점 중 하나는 호스트가 런타임에 호스트 된 앱 패키지를 동적으로 생성 하 고이를 서명 하지 않고도 PackageManager API를 사용 하 여 등록할 수 있다는 것입니다.One benefit of the uap10:HostRuntime extension is that it enables a host to dynamically generate a hosted app package at runtime and register it by using the PackageManager API, without needing to sign it. 이렇게 하면 호스트에서 호스트 된 앱 패키지에 대 한 콘텐츠 및 매니페스트를 동적으로 생성 하 고 등록할 수 있습니다.This enables a host to dynamically generate the content and manifest for the hosted app package and then register it.

PackageManager 클래스의 다음 메서드를 사용 하 여 서명 되지 않은 호스트 된 앱 패키지를 등록 합니다.Use the following methods of the PackageManager class to register an unsigned hosted app package. 이러한 메서드는 Windows 10 버전 2004부터 사용할 수 있습니다.These methods are available starting in Windows 10, version 2004.

  • AddPackageByUriAsync: Options 매개 변수의 allowunsigned 속성을 사용 하 여 unsigned msix 패키지를 등록 합니다.AddPackageByUriAsync: Registers an unsigned MSIX package by using the AllowUnsigned property of the options parameter.
  • RegisterPackageByUriAsync: 느슨한 패키지 매니페스트 파일 등록을 수행 합니다.RegisterPackageByUriAsync: Performs a loose package manifest file registration. 패키지가 서명 된 경우 매니페스트를 포함 하는 폴더에는 따라서 appxsignature.p7x 파일 및 카탈로그가 포함 되어야 합니다.If the package is signed, the folder containing the manifest must include a .p7x file and catalog. 서명 되지 않은 경우 options 매개 변수의 allowunsigned 속성을 설정 해야 합니다.If unsigned, the AllowUnsigned property of the options parameter must be set.

서명 되지 않은 호스트 된 앱에 대 한 요구 사항Requirements for unsigned hosted apps

  • 패키지 매니페스트에 있는 응용 프로그램 또는 확장 요소는 실행 파일, EntryPoint또는 TrustLevel 특성과 같은 활성화 데이터를 포함할 수 없습니다.The Application or Extension elements in the package manifest cannot contain activation data such as the Executable, EntryPoint, or TrustLevel attributes. 대신 이러한 요소에는 호스트 및 uap10: Parameters 특성에 대 한 종속성을 표현 하는 uap10: HostId 특성만 포함 될 수 있습니다.Instead, these elements can only contain a uap10:HostId attribute that expresses the dependency on the host and a uap10:Parameters attribute.
  • 패키지는 주 패키지 여야 합니다.The package must be a main package. 번들, 프레임 워크 패키지, 리소스 또는 선택적 패키지가 될 수 없습니다.It cannot be a bundle, framework package, resource, or optional package.

서명 되지 않은 호스트 된 앱 패키지를 설치 하 고 등록 하는 호스트에 대 한 요구 사항Requirements for a host that installs and registers an unsigned hosted app package

예제Sample

자신을 호스트로 선언 하 고 런타임에 호스팅된 앱 패키지를 동적으로 등록 하는 완전 한 기능을 갖춘 샘플 앱은 호스팅된 앱 샘플을 참조 하세요.For a fully functional sample app that declares itself as a host and then dynamically registers a hosted app package at runtime, see the hosted app sample.

호스트The host

호스트 이름은 PyScriptEngine입니다.The host is named PyScriptEngine. Python 스크립트를 실행 하는 c #으로 작성 된 래퍼입니다.This is a wrapper written in C# that runs python scripts. 매개 변수를 사용 하 여 실행 하는 경우 -Register 스크립트 엔진은 python 스크립트를 포함 하는 호스트 된 앱을 설치 합니다.When run with the -Register parameter, the script engine installs a hosted app containing a python script. 사용자가 새로 설치한 호스팅된 앱을 시작 하려고 하면 호스트가 시작 되 고 NumberGuesser python 스크립트를 실행 합니다.When a user tries to launch the newly installed hosted app, the host is launched and executes the NumberGuesser python script.

호스트 앱에 대 한 패키지 매니페스트 (PyScriptEnginePackage 폴더의 appxmanifest.xml 파일)에는 앱을 ID PythonHost 및 실행 파일 PyScriptEngine.exe를 사용 하 여 호스트로 선언 하는 uap10: HostRuntime 확장이 포함 되어 있습니다.The package manifest for the host app (the Package.appxmanifest file in the PyScriptEnginePackage folder) contains a uap10:HostRuntime extension that declares the app as a host with the ID PythonHost and the executable PyScriptEngine.exe.

참고

이 샘플에서는 패키지 매니페스트의 이름이 appxmanifest.xml이 고 Windows 응용 프로그램 패키징 프로젝트의 일부입니다.In this sample, the package manifest is named Package.appxmanifest and it is part of a Windows Application Packaging Project. 이 프로젝트를 빌드할 때 AppxManifest.xml라는 매니페스트를 생성 하 고 호스트 앱에 대 한 msix 패키지를 빌드합니다.When this project is built, it generates a manifest named AppxManifest.xml and builds the MSIX package for the host app.

호스팅된 앱The hosted app

호스팅된 앱은 python 스크립트와 패키지 매니페스트 등의 패키지 아티팩트로 구성 됩니다.The hosted app consists of a python script and package artifacts such as the package manifest. PE 파일은 포함 되지 않습니다.It doesn’t contain any PE files.

호스트 된 앱에 대 한 패키지 매니페스트 (NumberGuesser/AppxManifest.xml 파일)에는 다음 항목이 포함 되어 있습니다.The package manifest for the hosted app (the NumberGuesser/AppxManifest.xml file) contains the following items:

  • Identity 요소의 Publisher 특성에는 OID.2.25.311729368913984317654407730594956997722=1 서명 되지 않은 패키지에 필요한 식별자가 포함 되어 있습니다.The Publisher attribute of the Identity element contains the OID.2.25.311729368913984317654407730594956997722=1 identifer, which is required for an unsigned package.
  • Application 요소의 uap10: HostId 특성은 PythonHost 를 호스트로 식별 합니다.The uap10:HostId attribute of the Application element identifies PythonHost as its host.

샘플 실행Run the sample

이 샘플을 사용 하려면 10.0.19041.0 이상 버전의 Windows 10 및 Windows SDK 필요 합니다.The sample requires version 10.0.19041.0 or later of Windows 10 and the Windows SDK.

  1. 개발 컴퓨터의 폴더에 샘플 을 다운로드 합니다.Download the sample to a folder on your development computer.

  2. Visual Studio에서 PyScriptEngine 솔루션을 열고 PyScriptEnginePackage 프로젝트를 시작 프로젝트로 설정 합니다.Open the PyScriptEngine.sln solution in Visual Studio and set the PyScriptEnginePackage project as the startup project.

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

  4. 솔루션 탐색기에서 PyScriptEnginePackage 프로젝트를 마우스 오른쪽 단추로 클릭 하 고 배포를 선택 합니다.In Solution Explorer, right-click the PyScriptEnginePackage project and choose Deploy.

  5. 샘플 파일을 복사한 디렉터리에서 명령 프롬프트 창을 열고 다음 명령을 실행 하 여 샘플 NumberGuesser 앱 (호스팅된 앱)을 등록 합니다.Open a Command Prompt window to the directory where you copied the sample files and run the following command to register the sample NumberGuesser app (the hosted app). D:\repos\HostedApps샘플 파일을 복사한 경로로 변경 합니다.Change D:\repos\HostedApps to the path where you copied the sample files.

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

    참고

    pyscriptengine샘플의 호스트가 Appexecutionalias를 선언 하기 때문에 명령줄에서를 실행할 수 있습니다.You can run pyscriptengine on the command line because the host in the sample declares an AppExecutionAlias.

  6. 시작 메뉴를 열고 NumberGuesser 를 클릭 하 여 호스팅된 앱을 실행 합니다.Open the Start menu and click NumberGuesser to run the hosted app.