Membuat dan menghosting ekstensi aplikasi

Artikel ini memperlihatkan kepada Anda cara membuat ekstensi aplikasi Windows 10 dan menghostingnya di aplikasi. Ekstensi aplikasi didukung di aplikasi UWP dan aplikasi desktop yang dipaketkan.

Untuk menunjukkan cara membuat ekstensi aplikasi, artikel ini menggunakan xml manifes paket dan cuplikan kode dari sampel kode Ekstensi Matematika. Sampel ini adalah aplikasi UWP, tetapi fitur yang ditunjukkan dalam sampel juga berlaku untuk aplikasi desktop yang dikemas. Ikuti petunjuk berikut untuk mulai menggunakan sampel:

  • Unduh dan buka zip sampel kode Ekstensi Matematika.
  • Di Visual Studio 2019, buka MathExtensionSample.sln. Atur jenis build ke x86 (Build>Configuration Manager, lalu ubah Platform ke x86 untuk kedua proyek).
  • Menyebarkan solusi: Membangun>Solusi Penyebaran.

Pengantar ekstensi aplikasi

Dalam Windows 10, ekstensi aplikasi menyediakan fungsionalitas yang mirip dengan plug-in, add-in, dan add-on apa yang dilakukan pada platform lain. Ekstensi aplikasi diperkenalkan dalam edisi Windows 10 Anniversary (versi 1607, build 10.0.14393).

Ekstensi aplikasi adalah aplikasi UWP atau aplikasi desktop kemasan yang memiliki deklarasi ekstensi yang memungkinkan mereka berbagi konten dan peristiwa penyebaran dengan aplikasi host. Aplikasi ekstensi dapat menyediakan beberapa ekstensi.

Karena ekstensi aplikasi hanyalah aplikasi UWP atau aplikasi desktop yang dipaketkan, ekstensi aplikasi juga dapat berfungsi penuh, ekstensi host, dan menyediakan ekstensi ke aplikasi lain--semua tanpa membuat paket aplikasi terpisah.

Saat membuat host ekstensi aplikasi, Anda membuat kesempatan untuk mengembangkan ekosistem di sekitar aplikasi tempat pengembang lain dapat menyempurnakan aplikasi Dengan cara yang mungkin tidak Anda harapkan atau memiliki sumber daya. Pertimbangkan ekstensi Microsoft Office, ekstensi Visual Studio, ekstensi browser, dll. Ini menciptakan pengalaman yang lebih kaya untuk aplikasi yang melampaui fungsionalitas yang dikirimkan. Ekstensi dapat menambahkan nilai dan umur panjang ke aplikasi Anda.

Pada tingkat tinggi, untuk menyiapkan hubungan ekstensi aplikasi, kita perlu:

  1. Nyatakan aplikasi untuk menjadi host ekstensi.
  2. Nyatakan aplikasi sebagai ekstensi.
  3. Putuskan apakah akan menerapkan ekstensi sebagai layanan aplikasi, tugas latar belakang, atau cara lain.
  4. Tentukan bagaimana host dan ekstensinya akan berkomunikasi.
  5. Gunakan API Windows.ApplicationModel.AppExtensions di aplikasi host untuk mengakses ekstensi.

Mari kita lihat bagaimana hal ini dilakukan dengan memeriksa sampel kode Ekstensi Matematika yang mengimplementasikan kalkulator hipotetis yang dapat Anda tambahkan fungsi baru dengan menggunakan ekstensi. Di Microsoft Visual Studio 2019, muat MathExtensionSample.sln dari sampel kode.

Sampel kode Ekstensi Matematika

Mendeklarasikan aplikasi untuk menjadi host ekstensi

Aplikasi mengidentifikasi dirinya sebagai host ekstensi aplikasi dengan mendeklarasikan <AppExtensionHost> elemen dalam file Package.appxmanifest. Lihat file Package.appxmanifest di proyek MathExtensionHost untuk melihat bagaimana hal ini dilakukan.

Package.appxmanifest dalam proyek MathExtensionHost

<Package
  ...
  xmlns:uap3="http://schemas.microsoft.com/appx/manifest/uap/windows10/3"
  IgnorableNamespaces="uap uap3 mp">
  ...
    <Applications>
      <Application Id="App" ... >
        ...
        <Extensions>
            <uap3:Extension Category="windows.appExtensionHost">
                <uap3:AppExtensionHost>
                  <uap3:Name>com.microsoft.mathext</uap3:Name>
                </uap3:AppExtensionHost>
          </uap3:Extension>
        </Extensions>
      </Application>
    </Applications>
    ...
</Package>

xmlns:uap3="http://..." Perhatikan dan keberadaan uap3 di IgnorableNamespaces. Ini diperlukan karena kita menggunakan namespace uap3.

<uap3:Extension Category="windows.appExtensionHost"> mengidentifikasi aplikasi ini sebagai host ekstensi.

Elemen Name di <uap3:AppExtensionHost> adalah nama kontrak ekstensi . Ketika ekstensi menentukan nama kontrak ekstensi yang sama, host akan dapat menemukannya. Berdasarkan konvensi, sebaiknya buat nama kontrak ekstensi menggunakan nama aplikasi atau penerbit Anda untuk menghindari potensi tabrakan dengan nama kontrak ekstensi lainnya.

Anda dapat menentukan beberapa host dan beberapa ekstensi di aplikasi yang sama. Dalam contoh ini, kami mendeklarasikan satu host. Ekstensi didefinisikan di aplikasi lain.

Mendeklarasikan aplikasi sebagai ekstensi

Aplikasi mengidentifikasi dirinya sebagai ekstensi aplikasi dengan mendeklarasikan <uap3:AppExtension> elemen dalam file Package.appxmanifest-nya . Buka file Package.appxmanifest di proyek MathExtension untuk melihat bagaimana hal ini dilakukan.

Package.appxmanifest dalam proyek MathExtension:

<Package
  ...
  xmlns:uap3="http://schemas.microsoft.com/appx/manifest/uap/windows10/3"
  IgnorableNamespaces="uap uap3 mp">
  ...
    <Applications>
      <Application Id="App" ... >
        ...
        <Extensions>
          ...
          <uap3:Extension Category="windows.appExtension">
            <uap3:AppExtension Name="com.microsoft.mathext"
                               Id="power"
                               DisplayName="x^y"
                               Description="Exponent"
                               PublicFolder="Public">
              <uap3:Properties>
                <Service>com.microsoft.powservice</Service>
              </uap3:Properties>
              </uap3:AppExtension>
          </uap3:Extension>
        </Extensions>
      </Application>
    </Applications>
    ...
</Package>

Sekali lagi, perhatikan xmlns:uap3="http://..." baris , dan kehadiran uap3 di IgnorableNamespaces. Ini diperlukan karena kita menggunakan uap3 namespace.

<uap3:Extension Category="windows.appExtension"> mengidentifikasi aplikasi ini sebagai ekstensi.

Arti atribut <uap3:AppExtension> adalah sebagai berikut:

Atribut Deskripsi Diperlukan
Nama Ini adalah nama kontrak ekstensi. Ketika cocok dengan Nama yang dideklarasikan dalam host, host tersebut akan dapat menemukan ekstensi ini. ✔️
ID Secara unik mengidentifikasi ekstensi ini. Karena mungkin ada beberapa ekstensi yang menggunakan nama kontrak ekstensi yang sama (bayangkan aplikasi cat yang mendukung beberapa ekstensi), Anda dapat menggunakan ID untuk membedakannya. Host ekstensi aplikasi dapat menggunakan ID untuk menyimpulkan sesuatu tentang jenis ekstensi. Misalnya, Anda dapat memiliki satu Ekstensi yang dirancang untuk desktop dan yang lain untuk seluler, dengan ID menjadi pembferensi. Anda juga dapat menggunakan elemen Properti , yang dibahas di bawah ini, untuk itu. ✔️
DisplayName Dapat digunakan dari aplikasi host Anda untuk mengidentifikasi ekstensi kepada pengguna. Ini dapat dikueri dari, dan dapat menggunakan, sistem manajemen sumber daya baru (ms-resource:TokenName) untuk pelokalan. Konten yang dilokalkan dimuat dari paket ekstensi aplikasi, bukan aplikasi host.
Deskripsi Dapat digunakan dari aplikasi host Anda untuk menjelaskan ekstensi kepada pengguna. Ini dapat dikueri dari, dan dapat menggunakan, sistem manajemen sumber daya baru (ms-resource:TokenName) untuk pelokalan. Konten yang dilokalkan dimuat dari paket ekstensi aplikasi, bukan aplikasi host.
PublicFolder Nama folder, relatif terhadap akar paket, tempat Anda dapat berbagi konten dengan host ekstensi. Menurut konvensi, namanya adalah "Publik", tetapi Anda dapat menggunakan nama apa pun yang cocok dengan folder di ekstensi Anda. ✔️

<uap3:Properties> adalah elemen opsional yang berisi metadata kustom yang dapat dibaca host saat runtime. Dalam sampel kode, ekstensi diimplementasikan sebagai layanan aplikasi sehingga host memerlukan cara untuk mendapatkan nama layanan aplikasi tersebut sehingga dapat memanggilnya. Nama layanan aplikasi didefinisikan dalam <elemen Layanan> , yang kami tentukan (kami bisa menyebutnya apa pun yang kami inginkan). Host dalam sampel kode mencari properti ini pada runtime untuk mempelajari nama layanan aplikasi.

Tentukan bagaimana Anda akan mengimplementasikan ekstensi.

Sesi Build 2016 tentang ekstensi aplikasi menunjukkan cara menggunakan folder publik yang dibagikan antara host dan ekstensi. Dalam contoh itu, ekstensi diimplementasikan oleh file JavaScript yang disimpan di folder publik, yang dipanggil host. Pendekatan itu memiliki keuntungan ringan, tidak memerlukan kompilasi, dan dapat mendukung pembuatan halaman arahan default yang menyediakan instruksi untuk ekstensi dan tautan ke halaman Microsoft Store aplikasi host. Lihat sampel kode ekstensi aplikasi Build 2016 untuk detailnya. Secara khusus, lihat proyek InvertImageExtension dan InvokeLoad() di ExtensionManager.cs dalam proyek ExtensibilitySample .

Dalam contoh ini, kita akan menggunakan layanan aplikasi untuk mengimplementasikan ekstensi. Layanan aplikasi memiliki keuntungan berikut:

  • Jika ekstensi crash, ekstensi tidak akan menurunkan aplikasi host karena aplikasi host berjalan dalam prosesnya sendiri.
  • Anda dapat menggunakan bahasa pilihan Anda untuk mengimplementasikan layanan. Tidak harus mencocokkan bahasa yang digunakan untuk mengimplementasikan aplikasi host.
  • Layanan aplikasi memiliki akses ke kontainer aplikasinya sendiri--yang mungkin memiliki kemampuan yang berbeda dari yang dimiliki host.
  • Ada isolasi antara data dalam layanan dan aplikasi host.

Kode layanan aplikasi host

Berikut adalah kode host yang memanggil layanan aplikasi ekstensi:

ExtensionManager.cs dalam proyek MathExtensionHost

public async Task<double> Invoke(ValueSet message)
{
    if (Loaded)
    {
        try
        {
            // make the app service call
            using (var connection = new AppServiceConnection())
            {
                // service name is defined in appxmanifest properties
                connection.AppServiceName = _serviceName;
                // package Family Name is provided by the extension
                connection.PackageFamilyName = AppExtension.Package.Id.FamilyName;

                // open the app service connection
                AppServiceConnectionStatus status = await connection.OpenAsync();
                if (status != AppServiceConnectionStatus.Success)
                {
                    Debug.WriteLine("Failed App Service Connection");
                }
                else
                {
                    // Call the app service
                    AppServiceResponse response = await connection.SendMessageAsync(message);
                    if (response.Status == AppServiceResponseStatus.Success)
                    {
                        ValueSet answer = response.Message as ValueSet;
                        if (answer.ContainsKey("Result")) // When our app service returns "Result", it means it succeeded
                        {
                            return (double)answer["Result"];
                        }
                    }
                }
            }
        }
        catch (Exception)
        {
             Debug.WriteLine("Calling the App Service failed");
        }
    }
    return double.NaN; // indicates an error from the app service
}

Ini adalah kode khas untuk memanggil layanan aplikasi. Untuk detail tentang cara menerapkan dan memanggil layanan aplikasi, lihat Cara membuat dan menggunakan layanan aplikasi.

Satu hal yang perlu diperhatikan adalah bagaimana nama layanan aplikasi yang akan dipanggil ditentukan. Karena host tidak memiliki informasi tentang implementasi ekstensi, ekstensi perlu memberikan nama layanan aplikasinya. Dalam sampel kode, ekstensi mendeklarasikan nama layanan aplikasi dalam filenya dalam <uap3:Properties> elemen :

Package.appxmanifest dalam proyek MathExtension

    ...
    <uap3:Extension Category="windows.appExtension">
      <uap3:AppExtension ...>
        <uap3:Properties>
          <Service>com.microsoft.powservice</Service>
        </uap3:Properties>
        </uap3:AppExtension>
    </uap3:Extension>

Anda dapat menentukan XML Anda sendiri dalam <uap3:Properties> elemen . Dalam hal ini, kami mendefinisikan nama layanan aplikasi sehingga host dapat melakukannya saat memanggil ekstensi.

Saat host memuat ekstensi, kode seperti ini mengekstrak nama layanan dari properti yang ditentukan dalam Package.appxmanifest ekstensi:

Update() di ExtensionManager.cs, dalam proyek MathExtensionHost

...
var properties = await ext.GetExtensionPropertiesAsync() as PropertySet;

...
#region Update Properties
// update app service information
_serviceName = null;
if (_properties != null)
{
   if (_properties.ContainsKey("Service"))
   {
       PropertySet serviceProperty = _properties["Service"] as PropertySet;
       this._serviceName = serviceProperty["#text"].ToString();
   }
}
#endregion

Dengan nama layanan aplikasi yang disimpan di _serviceName, host dapat menggunakannya untuk memanggil layanan aplikasi.

Memanggil layanan aplikasi juga memerlukan nama keluarga paket yang berisi layanan aplikasi. Untungnya, API ekstensi aplikasi menyediakan informasi ini yang diperoleh di baris: connection.PackageFamilyName = AppExtension.Package.Id.FamilyName;

Tentukan bagaimana host dan ekstensi akan berkomunikasi

Layanan aplikasi menggunakan ValueSet untuk bertukar informasi. Sebagai penulis host, Anda perlu membuat protokol untuk berkomunikasi dengan ekstensi yang fleksibel. Dalam sampel kode, itu berarti akuntansi untuk ekstensi yang mungkin memakan waktu 1, 2, atau lebih argumen di masa mendatang.

Untuk contoh ini, protokol untuk argumen adalah ValueSet yang berisi pasangan nilai kunci bernama 'Arg' + nomor argumen, misalnya, Arg1 dan Arg2. Host meneruskan semua argumen dalam ValueSet, dan ekstensi menggunakan argumen yang dibutuhkan. Jika ekstensi dapat menghitung hasil, maka host mengharapkan ValueSet yang dikembalikan dari ekstensi untuk memiliki kunci bernama Result yang berisi nilai perhitungan. Jika kunci tersebut tidak ada, host mengasumsikan bahwa ekstensi tidak dapat menyelesaikan perhitungan.

Kode layanan aplikasi ekstensi

Dalam sampel kode, layanan aplikasi ekstensi tidak diimplementasikan sebagai tugas latar belakang. Sebaliknya, ia menggunakan model layanan aplikasi proc tunggal tempat layanan aplikasi berjalan dalam proses yang sama dengan aplikasi ekstensi yang menghostingnya. Ini masih merupakan proses yang berbeda dari aplikasi host, memberikan manfaat pemisahan proses, sambil mendapatkan beberapa manfaat performa dengan menghindari komunikasi lintas proses antara proses ekstensi dan proses latar belakang yang mengimplementasikan layanan aplikasi. Lihat Mengonversi layanan aplikasi untuk dijalankan dalam proses yang sama dengan aplikasi hostnya untuk melihat perbedaan antara layanan aplikasi yang berjalan sebagai tugas latar belakang versus dalam proses yang sama.

Sistem membuat OnBackgroundActivate() ketika layanan aplikasi diaktifkan. Kode itu menyiapkan penanganan aktivitas untuk menangani panggilan layanan aplikasi aktual ketika datang (OnAppServiceRequestReceived()) serta menangani peristiwa housekeeping seperti mendapatkan objek penangguhan yang menangani peristiwa batal atau tertutup.

App.xaml.cs dalam proyek MathExtension.

protected override void OnBackgroundActivated(BackgroundActivatedEventArgs args)
{
    base.OnBackgroundActivated(args);

    if ( _appServiceInitialized == false ) // Only need to setup the handlers once
    {
        _appServiceInitialized = true;

        IBackgroundTaskInstance taskInstance = args.TaskInstance;
        taskInstance.Canceled += OnAppServicesCanceled;

        AppServiceTriggerDetails appService = taskInstance.TriggerDetails as AppServiceTriggerDetails;
        _appServiceDeferral = taskInstance.GetDeferral();
        _appServiceConnection = appService.AppServiceConnection;
        _appServiceConnection.RequestReceived += OnAppServiceRequestReceived;
        _appServiceConnection.ServiceClosed += AppServiceConnection_ServiceClosed;
    }
}

Kode yang melakukan pekerjaan ekstensi ada di OnAppServiceRequestReceived(). Fungsi ini dipanggil ketika layanan aplikasi dipanggil untuk melakukan penghitungan. Ini mengekstrak nilai yang dibutuhkan dari ValueSet. Jika dapat melakukan penghitungan, itu menempatkan hasilnya, di bawah kunci bernama Result, di ValueSet yang dikembalikan ke host. Ingat bahwa sesuai dengan protokol yang ditentukan untuk bagaimana host ini dan ekstensinya akan berkomunikasi, kehadiran kunci Hasil akan menunjukkan keberhasilan; jika tidak, gagal.

App.xaml.cs dalam proyek MathExtension.

private async void OnAppServiceRequestReceived(AppServiceConnection sender, AppServiceRequestReceivedEventArgs args)
{
    // Get a deferral because we use an awaitable API below (SendResponseAsync()) to respond to the message
    // and we don't want this call to get cancelled while we are waiting.
    AppServiceDeferral messageDeferral = args.GetDeferral();
    ValueSet message = args.Request.Message;
    ValueSet returnMessage = new ValueSet();

    double? arg1 = Convert.ToDouble(message["arg1"]);
    double? arg2 = Convert.ToDouble(message["arg2"]);
    if (arg1.HasValue && arg2.HasValue)
    {
        returnMessage.Add("Result", Math.Pow(arg1.Value, arg2.Value)); // For this sample, the presence of a "Result" key will mean the call succeeded
    }

    await args.Request.SendResponseAsync(returnMessage);
    messageDeferral.Complete();
}

Mengelola ekstensi

Sekarang setelah kita melihat cara mengimplementasikan hubungan antara host dan ekstensinya, mari kita lihat bagaimana host menemukan ekstensi yang diinstal pada sistem dan bereaksi terhadap penambahan dan penghapusan paket yang berisi ekstensi.

Microsoft Store memberikan ekstensi sebagai paket. AppExtensionCatalog menemukan paket terinstal yang berisi ekstensi yang cocok dengan nama kontrak ekstensi host, dan menyediakan peristiwa yang diaktifkan ketika paket ekstensi aplikasi yang relevan dengan host diinstal atau dihapus.

Dalam sampel kode, ExtensionManager kelas (didefinisikan dalam ExtensionManager.cs dalam proyek MathExtensionHost ) membungkus logika untuk memuat ekstensi dan menanggapi penginstalan dan penghapusan instalasi paket ekstensi.

ExtensionManager Konstruktor menggunakan AppExtensionCatalog untuk menemukan ekstensi aplikasi pada sistem yang memiliki nama kontrak ekstensi yang sama dengan host:

ExtensionManager.cs dalam proyek MathExtensionHost.

public ExtensionManager(string extensionContractName)
{
   // catalog & contract
   ExtensionContractName = extensionContractName;
   _catalog = AppExtensionCatalog.Open(ExtensionContractName);
   ...
}

Ketika paket ekstensi diinstal, mengumpulkan ExtensionManager informasi tentang ekstensi dalam paket yang memiliki nama kontrak ekstensi yang sama dengan host. Penginstalan dapat mewakili pembaruan dalam hal ini informasi ekstensi yang terpengaruh diperbarui. Ketika paket ekstensi dihapus, ExtensionManager menghapus informasi tentang ekstensi yang terpengaruh sehingga pengguna tahu ekstensi mana yang tidak lagi tersedia.

Kelas Extension (didefinisikan dalam ExtensionManager.cs dalam proyek MathExtensionHost ) dibuat untuk sampel kode untuk mengakses ID ekstensi, deskripsi, logo, dan informasi spesifik aplikasi seperti apakah pengguna telah mengaktifkan ekstensi.

Untuk mengatakan bahwa ekstensi dimuat (lihat Load() di ExtensionManager.cs) berarti bahwa status paket baik-baik saja dan bahwa kami telah mendapatkan ID, logo, deskripsi, dan folder publiknya (yang tidak kami gunakan dalam sampel ini hanya untuk menunjukkan bagaimana Anda mendapatkannya). Paket ekstensi itu sendiri tidak sedang dimuat.

Konsep pembongkaran digunakan untuk melacak ekstensi mana yang tidak boleh lagi disajikan kepada pengguna.

ExtensionManager menyediakan instans koleksi Extension sehingga ekstensi, nama, deskripsi, dan logonya dapat terikat dengan data ke UI. Halaman ExtensionsTab mengikat koleksi ini dan menyediakan UI untuk mengaktifkan/menonaktifkan ekstensi serta menghapusnya.

UI contoh tab Ekstensi

Ketika ekstensi dihapus, sistem meminta pengguna untuk memverifikasi bahwa mereka ingin menghapus instalan paket yang berisi ekstensi (dan mungkin berisi ekstensi lain). Jika pengguna setuju, paket dihapus instalannya dan ExtensionManager menghapus ekstensi dalam paket yang dihapus dari daftar ekstensi yang tersedia untuk aplikasi host.

Menghapus instalan UI

Men-debug ekstensi dan host aplikasi

Seringkali, host ekstensi dan ekstensi bukan bagian dari solusi yang sama. Dalam hal ini, untuk men-debug host dan ekstensi:

  1. Muat proyek host Anda dalam satu instans Visual Studio.
  2. Muat ekstensi Anda di instans lain dari Visual Studio.
  3. Luncurkan aplikasi host Anda di debugger.
  4. Luncurkan aplikasi ekstensi di debugger. (Jika Anda ingin menyebarkan ekstensi, daripada men-debugnya, untuk menguji peristiwa penginstalan paket host, lakukan Build > Deploy Solution, sebagai gantinya).

Sekarang Anda akan dapat mencapai titik henti di host dan ekstensi. Jika Anda mulai men-debug aplikasi ekstensi itu sendiri, Anda akan melihat jendela kosong untuk aplikasi. Jika Anda tidak ingin melihat jendela kosong, Anda dapat mengubah pengaturan penelusuran kesalahan untuk proyek ekstensi untuk tidak meluncurkan aplikasi tetapi sebaliknya men-debugnya saat dimulai (klik kanan proyek ekstensi, Properti>Debug> pilih Jangan luncurkan, tetapi debug kode saya saat dimulai) Anda masih perlu memulai debugging (F5) proyek ekstensi, tetapi akan menunggu sampai host mengaktifkan ekstensi dan kemudian titik henti Anda di ekstensi akan terpukul.

Debug sampel kode

Dalam sampel kode, host dan ekstensi berada dalam solusi yang sama. Lakukan hal berikut untuk men-debug:

  1. Pastikan bahwa MathExtensionHost adalah proyek startup (klik kanan proyek MathExtensionHost , klik Atur sebagai proyek StartUp).
  2. Tempatkan titik henti di Invoke ExtensionManager.cs, dalam proyek MathExtensionHost .
  3. F5 untuk menjalankan proyek MathExtensionHost .
  4. Tempatkan titik henti di OnAppServiceRequestReceived App.xaml.cs di proyek MathExtension .
  5. Mulai debugging proyek MathExtension (klik kanan proyek MathExtension , Debug > Mulai instans baru) yang akan menyebarkannya dan memicu peristiwa penginstalan paket di host.
  6. Di aplikasi MathExtensionHost , navigasikan ke halaman Perhitungan , dan klik x^y untuk mengaktifkan ekstensi. Titik Invoke() henti dipukul terlebih dahulu dan Anda dapat melihat panggilan layanan aplikasi ekstensi yang dilakukan. OnAppServiceRequestReceived() Kemudian metode dalam ekstensi terpukul, dan Anda dapat melihat layanan aplikasi menghitung hasilnya dan mengembalikannya.

Pemecahan masalah ekstensi yang diterapkan sebagai layanan aplikasi

Jika host ekstensi Anda mengalami masalah saat menyambungkan ke layanan aplikasi untuk ekstensi Anda, pastikan atribut <uap:AppService Name="..."> cocok dengan apa yang Anda masukkan ke dalam elemen Anda <Service> . Jika tidak cocok, nama layanan yang disediakan ekstensi Anda tidak akan cocok dengan nama layanan aplikasi yang Anda terapkan, dan host tidak akan dapat mengaktifkan ekstensi Anda.

Package.appxmanifest dalam proyek MathExtension:

<Extensions>
   <uap:Extension Category="windows.appService">
     <uap:AppService Name="com.microsoft.sqrtservice" />      <!-- This must match the contents of <Service>...</Service> -->
   </uap:Extension>
   <uap3:Extension Category="windows.appExtension">
     <uap3:AppExtension Name="com.microsoft.mathext" Id="sqrt" DisplayName="Sqrt(x)" Description="Square root" PublicFolder="Public">
       <uap3:Properties>
         <Service>com.microsoft.powservice</Service>   <!-- this must match <uap:AppService Name=...> -->
       </uap3:Properties>
     </uap3:AppExtension>
   </uap3:Extension>
</Extensions>   

Daftar periksa skenario dasar untuk diuji

Ketika Anda membangun host ekstensi dan siap untuk menguji seberapa baik ia mendukung ekstensi, berikut adalah beberapa skenario dasar untuk dicoba:

  • Jalankan host lalu sebarkan aplikasi ekstensi
    • Apakah host mengambil ekstensi baru yang datang saat berjalan?
  • Sebarkan aplikasi ekstensi lalu sebarkan dan jalankan host.
    • Apakah host mengambil ekstensi yang sudah ada sebelumnya?
  • Jalankan host lalu hapus aplikasi ekstensi.
    • Apakah host mendeteksi penghapusan dengan benar?
  • Jalankan host lalu perbarui aplikasi ekstensi ke versi yang lebih baru.
    • Apakah host mengambil perubahan dan membongkar versi lama ekstensi dengan benar?

Skenario tingkat lanjut untuk menguji:

  • Jalankan host, pindahkan aplikasi ekstensi ke media yang dapat dilepas, hapus media
    • Apakah host mendeteksi perubahan status paket dan menonaktifkan ekstensi?
  • Jalankan host, lalu rusak aplikasi ekstensi (buat tidak valid, ditandatangani secara berbeda, dll.)
    • Apakah host mendeteksi ekstensi yang dirusak dan menanganinya dengan benar?
  • Jalankan host, lalu sebarkan aplikasi ekstensi yang memiliki konten atau properti yang tidak valid
    • Apakah host mendeteksi konten yang tidak valid dan menanganinya dengan benar?

Mempertimbangkan rancangan

  • Berikan UI yang menunjukkan kepada pengguna ekstensi mana yang tersedia dan memungkinkan mereka mengaktifkan/menonaktifkannya. Anda mungkin juga mempertimbangkan untuk menambahkan glyph untuk ekstensi yang menjadi tidak tersedia karena paket offline, dll.
  • Arahkan pengguna ke tempat mereka bisa mendapatkan ekstensi. Mungkin halaman ekstensi Anda dapat menyediakan kueri pencarian Microsoft Store yang memunculkan daftar ekstensi yang dapat digunakan dengan aplikasi Anda.
  • Pertimbangkan cara memberi tahu pengguna tentang penambahan dan penghapusan ekstensi. Anda dapat membuat pemberitahuan saat ekstensi baru diinstal dan mengundang pengguna untuk mengaktifkannya. Ekstensi harus dinonaktifkan secara default sehingga pengguna memegang kendali.

Perbedaan ekstensi aplikasi dengan paket opsional

Pembferensi utama antara paket opsional dan ekstensi aplikasi adalah ekosistem terbuka versus ekosistem tertutup, dan paket dependen versus paket independen.

Ekstensi aplikasi berpartisipasi dalam ekosistem terbuka. Jika aplikasi Anda dapat menghosting ekstensi aplikasi, siapa pun dapat menulis ekstensi untuk host Anda selama mereka mematuhi metode Anda untuk meneruskan/menerima informasi dari ekstensi. Ini berbeda dari paket opsional yang berpartisipasi dalam ekosistem tertutup di mana penerbit memutuskan siapa yang diizinkan untuk membuat paket opsional yang dapat digunakan dengan aplikasi.

Ekstensi aplikasi adalah paket independen dan dapat menjadi aplikasi mandiri. Mereka tidak dapat memiliki dependensi penyebaran pada aplikasi lain. Paket opsional memerlukan paket utama dan tidak dapat berjalan tanpanya.

Paket ekspansi untuk game akan menjadi kandidat yang baik untuk paket opsional karena terikat erat dengan game, itu tidak dapat berjalan secara independen dari game, dan Anda mungkin tidak ingin paket ekspansi dibuat oleh pengembang mana pun di ekosistem.

Jika game yang sama memiliki add-on atau tema UI yang dapat disesuaikan, maka ekstensi aplikasi bisa menjadi pilihan yang baik karena aplikasi yang menyediakan ekstensi dapat berjalan sendiri, dan pihak ke-3 mana pun dapat membuatnya.

Keterangan

Topik ini menyediakan pengantar ekstensi aplikasi. Hal-hal utama yang perlu diperhatikan adalah pembuatan host dan menandainya seperti dalam file Package.appxmanifest, membuat ekstensi dan menandainya seperti dalam file Package.appxmanifest, menentukan cara mengimplementasikan ekstensi (seperti layanan aplikasi, tugas latar belakang, atau cara lain), menentukan bagaimana host akan berkomunikasi dengan ekstensi, dan menggunakan API AppExtensions untuk mengakses dan mengelola ekstensi.