Membuat aplikasi yang dihosting

Mulai dari Windows 10, versi 2004, Anda dapat membuat aplikasi yang dihosting. Aplikasi yang dihosting berbagi executable dan definisi yang sama dengan aplikasi host induk, tetapi terlihat dan berperilaku seperti aplikasi terpisah pada sistem.

Aplikasi yang dihosting berguna untuk skenario di mana Anda ingin komponen (seperti file yang dapat dieksekusi atau file skrip) berperilaku seperti aplikasi Windows 10 mandiri, tetapi komponen memerlukan proses host untuk mengeksekusi. Misalnya, skrip PowerShell atau Python dapat dikirimkan sebagai aplikasi yang dihosting yang mengharuskan host diinstal untuk dijalankan. Aplikasi yang dihosting dapat memiliki petak peta awal, identitas, dan integrasi mendalam sendiri dengan fitur Windows 10 seperti tugas latar belakang, pemberitahuan, petak peta, dan target berbagi.

Fitur aplikasi yang dihosting didukung oleh beberapa elemen dan atribut dalam manifes paket yang memungkinkan aplikasi yang dihosting untuk menggunakan executable dan definisi dalam paket aplikasi host. Saat pengguna menjalankan aplikasi yang dihosting, OS secara otomatis meluncurkan host yang dapat dieksekusi di bawah identitas aplikasi yang dihosting. Host kemudian dapat memuat aset visual, konten, atau memanggil API sebagai aplikasi yang dihosting. Aplikasi yang dihosting mendapatkan persimpangan kemampuan yang dideklarasikan antara host dan aplikasi yang dihosting. Ini berarti bahwa aplikasi yang dihosting tidak dapat meminta lebih banyak kemampuan daripada yang disediakan host.

Menentukan host

Host adalah proses executable atau runtime utama untuk aplikasi yang dihosting. Saat ini, satu-satunya host yang didukung adalah aplikasi desktop (.NET atau desktop C++) yang memiliki identitas paket. Ada beberapa cara agar aplikasi desktop memiliki identitas paket:

Host dideklarasikan dalam manifes paketnya oleh ekstensi uap10:HostRuntime . Ekstensi ini memiliki atribut Id yang harus diberi nilai yang juga direferensikan oleh manifes paket untuk aplikasi yang dihosting. Saat aplikasi yang dihosting diaktifkan, host diluncurkan di bawah identitas aplikasi yang dihosting dan dapat memuat konten atau biner dari paket aplikasi yang dihosting.

Contoh berikut menunjukkan cara menentukan host dalam manifes paket. Ekstensi uap10:HostRuntime di seluruh paket dan oleh karena itu dinyatakan sebagai anak dari elemen Paket .

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

Catat detail penting ini tentang elemen-elemen berikut.

Elemen Detail
uap10:Extension windows.hostRuntime Kategori mendeklarasikan ekstensi di seluruh paket yang menentukan informasi runtime yang akan digunakan saat mengaktifkan aplikasi yang dihosting. Aplikasi yang dihosting akan berjalan dengan definisi yang dideklarasikan dalam ekstensi. Saat menggunakan aplikasi host yang dideklarasikan dalam contoh sebelumnya, aplikasi yang dihosting akan berjalan sebagai PyScriptEngine.exe yang dapat dieksekusi pada tingkat kepercayaan mediumIL .

Atribut Executable, uap10:RuntimeBehavior, dan uap10:TrustLevel menentukan nama biner proses host dalam paket dan bagaimana aplikasi yang dihosting akan berjalan. Misalnya, aplikasi yang dihosting menggunakan atribut dalam contoh sebelumnya akan berjalan sebagai PyScriptEngine.exe yang dapat dieksekusi pada tingkat kepercayaan mediumIL.
uap10:HostRuntime Atribut Id mendeklarasikan pengidentifikasi unik aplikasi host khusus ini dalam paket. Paket dapat memiliki beberapa aplikasi host, dan masing-masing harus memiliki elemen uap10:HostRuntime dengan Id unik.

Mendeklarasikan aplikasi yang dihosting

Aplikasi yang dihosting mendeklarasikan dependensi paket pada host. Aplikasi yang dihosting memanfaatkan ID host (yaitu, atribut Id dari ekstensi uap10:HostRuntime dalam paket host) untuk aktivasi alih-alih menentukan titik entri yang dapat dieksekusi dalam paketnya sendiri. Aplikasi yang dihosting biasanya berisi konten, aset visual, skrip, atau biner yang dapat diakses oleh host. Nilai TargetDeviceFamily dalam paket aplikasi yang dihosting harus menargetkan nilai yang sama dengan host.

Paket aplikasi yang dihosting dapat ditandatangani atau tidak ditandatangani:

  • Paket yang ditandatangani mungkin berisi file yang dapat dieksekusi. Ini berguna dalam skenario yang memiliki mekanisme ekstensi biner, yang memungkinkan host memuat DLL atau komponen terdaftar dalam paket aplikasi yang dihosting.
  • Dalam sebagian besar skenario, paket yang tidak ditandatangani akan berisi konten yang dapat dieksekusi. Tetapi paket yang tidak ditandatangani yang hanya berisi file yang tidak dapat dieksekusi berguna dalam skenario di mana host hanya perlu memuat gambar, aset, dan konten atau file skrip. Paket yang tidak ditandatangani harus menyertakan nilai khusus OID dalam elemen Identitas mereka atau tidak akan diizinkan untuk mendaftar. Ini mencegah paket yang tidak ditandatangani bertentangan dengan atau spoofing identitas paket yang ditandatangani.

Untuk menentukan aplikasi yang dihosting, deklarasikan item berikut dalam manifes paket:

Contoh berikut menunjukkan bagian yang relevan dari manifes paket untuk aplikasi yang dihosting yang tidak ditandatangani.

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

Catat detail penting ini tentang elemen-elemen berikut.

Elemen Detail
Identitas Karena paket aplikasi yang dihosting dalam contoh ini tidak ditandatangani, atribut Publisher harus menyertakan OID.2.25.311729368913984317654407730594956997722=1 string. Ini memastikan bahwa paket yang tidak ditandatangani tidak dapat memalsukan identitas paket yang ditandatangani.
TargetDeviceFamily Atribut MinVersion harus menentukan 10.0.19041.0 atau versi OS yang lebih baru.
uap10:HostRuntimeDependency Elemen elemen ini mendeklarasikan dependensi pada paket aplikasi host. Ini terdiri dari Nama dan Penerbit paket host, dan MinVersion yang bergantung padanya. Nilai-nilai ini dapat ditemukan di bawah elemen Identitas dalam paket host.
Aplikasi Atribut uap10:HostId mengekspresikan dependensi pada host. Paket aplikasi yang dihosting harus mendeklarasikan atribut ini alih-alih atribut Executable dan EntryPoint biasa untuk elemen Aplikasi atau Ekstensi . Akibatnya, aplikasi yang dihosting mewarisi atribut Executable, EntryPoint , dan runtime dari host dengan nilai HostId yang sesuai.

Atribut uap10:Parameters menentukan parameter yang diteruskan ke fungsi titik masuk host yang dapat dieksekusi. Karena host perlu tahu apa yang harus dilakukan dengan parameter ini, ada kontrak tersirat antara host dan aplikasi yang dihosting.

Mendaftarkan paket aplikasi yang dihosting yang tidak ditandatangani pada durasi

Salah satu manfaat ekstensi uap10:HostRuntime adalah memungkinkan host untuk secara dinamis menghasilkan paket aplikasi yang dihosting pada runtime dan mendaftarkannya dengan menggunakan PACKAGEManager API, tanpa perlu menandatanganinya. Ini memungkinkan host untuk secara dinamis menghasilkan konten dan manifes untuk paket aplikasi yang dihosting lalu mendaftarkannya.

Gunakan metode kelas PackageManager berikut untuk mendaftarkan paket aplikasi yang dihosting yang tidak ditandatangani. Metode ini tersedia mulai dari Windows 10, versi 2004.

  • AddPackageByUriAsync: Mendaftarkan paket MSIX yang tidak ditandatangani dengan menggunakan properti AllowUnsigned dari parameter opsi .
  • RegisterPackageByUriAsync: Melakukan pendaftaran file manifes paket longgar. Jika paket ditandatangani, folder yang berisi manifes harus menyertakan file dan katalog .p7x . Jika tidak ditandatangani, properti AllowUnsigned dari parameter opsi harus diatur.

Persyaratan untuk aplikasi yang dihosting yang tidak ditandatangani

  • Elemen Aplikasi atau Ekstensi dalam manifes paket tidak boleh berisi data aktivasi seperti atribut Executable, EntryPoint, atau TrustLevel . Sebaliknya, elemen-elemen ini hanya dapat berisi atribut uap10:HostId yang mengekspresikan dependensi pada host dan atribut uap10:Parameters .
  • Paket harus berupa paket utama. Ini tidak boleh berupa paket bundel, paket kerangka kerja, sumber daya, atau paket opsional.

Persyaratan untuk host yang menginstal dan mendaftarkan paket aplikasi yang dihosting yang tidak ditandatangani

  • Host harus memiliki identitas paket.
  • Host harus memiliki kemampuan packageManagementyang dibatasi.
    <rescap:Capability Name="packageManagement" />
    

Sampel

Untuk aplikasi sampel yang berfungsi penuh yang mendeklarasikan dirinya sebagai host dan kemudian secara dinamis mendaftarkan paket aplikasi yang dihosting saat runtime, lihat sampel aplikasi yang dihosting.

Host

Host diberi nama PyScriptEngine. Ini adalah pembungkus yang ditulis dalam C# yang menjalankan skrip python. Saat dijalankan dengan -Register parameter , mesin skrip menginstal aplikasi yang dihosting yang berisi skrip python. Ketika pengguna mencoba meluncurkan aplikasi yang dihosting yang baru diinstal, host diluncurkan dan menjalankan skrip python NumberGuesser .

Manifes paket untuk aplikasi host (file Package.appxmanifest di folder PyScriptEnginePackage) berisi ekstensi uap10:HostRuntime yang mendeklarasikan aplikasi sebagai host dengan ID PythonHost dan PyScriptEngine.exeyang dapat dieksekusi.

Catatan

Dalam sampel ini, manifes paket diberi nama Package.appxmanifest dan merupakan bagian dari Proyek Pengemasan Aplikasi Windows. Ketika proyek ini dibangun, proyek ini menghasilkan manifes bernama AppxManifest.xml dan membangun paket MSIX untuk aplikasi host.

Aplikasi yang dihosting

Aplikasi yang dihosting terdiri dari skrip python dan artefak paket seperti manifes paket. Ini tidak berisi file PE apa pun.

Manifes paket untuk aplikasi yang dihosting (file NumberGuesser/AppxManifest.xml) berisi item berikut:

  • Atribut Publisher dari elemen Identity berisi OID.2.25.311729368913984317654407730594956997722=1 pengidentifikasi, yang diperlukan untuk paket yang tidak ditandatangani.
  • Atribut uap10:HostId dari elemen Aplikasi mengidentifikasi PythonHost sebagai host-nya.

Menjalankan sampel

Sampel memerlukan Windows 10 dan Windows SDK versi 10.0.19041.0 atau yang lebih baru.

  1. Unduh sampel ke folder di komputer pengembangan Anda.

  2. Buka solusi PyScriptEngine.sln di Visual Studio dan atur proyek PyScriptEnginePackage sebagai proyek startup.

  3. Bangun proyek PyScriptEnginePackage .

  4. Di Penjelajah Solusi, klik kanan proyek PyScriptEnginePackage dan pilih Sebarkan.

  5. Buka jendela Prompt Perintah ke direktori tempat Anda menyalin file sampel dan jalankan perintah berikut untuk mendaftarkan sampel aplikasi NumberGuesser (aplikasi yang dihosting). Ubah D:\repos\HostedApps ke jalur tempat Anda menyalin file sampel.

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

    Catatan

    Anda dapat berjalan pyscriptengine pada baris perintah karena host dalam sampel mendeklarasikan AppExecutionAlias.

  6. Buka menu Mulai dan klik NumberGuesser untuk menjalankan aplikasi yang dihosting.