Membuat ekstensi aplikasi untuk aplikasi SDK Aplikasi Windows

Ekstensi aplikasi memungkinkan aplikasi Anda meng-host konten dan fungsionalitas add-in dari paket lain. Ini adalah padanan model plug-in di Windows. Penyedia ekstensi mendeklarasikan konten atau layanan, dan aplikasi host Anda menemukan dan memuatnya saat runtime.

Important

Ekstensi aplikasi memerlukan identitas paket MSIX untuk aplikasi host dan ekstensi. Ekstensi ditemukan melalui katalog paket.

Cara kerja ekstensi aplikasi

Model ekstensi aplikasi memiliki dua peran:

  • Host ekstensi — Aplikasi Anda menyatakan jenis ekstensi mana yang diterimanya dan menemukan ekstensi yang diinstal.
  • Penyedia ekstensi — Aplikasi lain (atau aplikasi yang sama) menyatakan bahwa aplikasi tersebut menyediakan ekstensi jenis tertentu.

Ekstensi berkomunikasi melalui deklarasi manifes paket, bukan melalui kode. Aplikasi host menggunakan API AppExtensionCatalog untuk menemukan dan mengelola ekstensi yang diinstal.

Deklarasikan host ekstensi

AppExtensionHost Tambahkan deklarasi ke aplikasi Package.appxmanifestAnda:

<Package xmlns:uap3="http://schemas.microsoft.com/appx/manifest/uap/windows10/3" ...>
  <Applications>
    <Application ...>
      <Extensions>
        <uap3:Extension Category="windows.appExtensionHost">
          <uap3:AppExtensionHost>
            <uap3:Name>com.example.myapp.extensions</uap3:Name>
          </uap3:AppExtensionHost>
        </uap3:Extension>
      </Extensions>
    </Application>
  </Applications>
</Package>

Mendeklarasikan penyedia ekstensi

Di aplikasi ekstensi Package.appxmanifest:

<Package xmlns:uap3="http://schemas.microsoft.com/appx/manifest/uap/windows10/3" ...>
  <Applications>
    <Application ...>
      <Extensions>
        <uap3:Extension Category="windows.appExtension">
          <uap3:AppExtension Name="com.example.myapp.extensions"
                             Id="MathExtension"
                             DisplayName="Math Functions"
                             Description="Provides math operations"
                             PublicFolder="Public">
          </uap3:AppExtension>
        </uap3:Extension>
      </Extensions>
    </Application>
  </Applications>
</Package>

PublicFolder menunjuk ke folder dalam paket ekstensi yang dapat dibaca oleh aplikasi host.

Menemukan dan memuat ekstensi

Di aplikasi host Anda, gunakan AppExtensionCatalog untuk menemukan ekstensi yang terinstal:

private AppExtensionCatalog? _catalog;

private async Task InitializeExtensionsAsync()
{
    _catalog = AppExtensionCatalog.Open("com.example.myapp.extensions");

    _catalog.PackageInstalled += OnExtensionInstalled;
    _catalog.PackageUpdated += OnExtensionUpdated;
    _catalog.PackageUninstalling += OnExtensionRemoved;

    var extensions = await _catalog.FindAllAsync();
    foreach (var extension in extensions)
    {
        await LoadExtensionAsync(extension);
    }
}

private async Task LoadExtensionAsync(AppExtension extension)
{
    string extensionId = extension.Id;
    string displayName = extension.DisplayName;

    // Get the extension's public folder
    var folder = await extension.GetPublicFolderAsync();
    if (folder != null)
    {
        // Read configuration, content, or scripts from the folder
        var configFile = await folder.TryGetItemAsync("config.json");
        if (configFile != null)
        {
            // Parse and use the extension configuration
        }
    }
}

// See "Handle extension lifecycle events" below for the
// OnExtensionInstalled, OnExtensionUpdated, and OnExtensionRemoved handlers.
private async void OnExtensionInstalled(AppExtensionCatalog sender,
    AppExtensionPackageInstalledEventArgs args) { }
private async void OnExtensionUpdated(AppExtensionCatalog sender,
    AppExtensionPackageUpdatedEventArgs args) { }
private void OnExtensionRemoved(AppExtensionCatalog sender,
    AppExtensionPackageUninstallingEventArgs args) { }

Menangani kejadian siklus hidup ekstensi

private async Task LoadExtensionAsync(AppExtension extension) => await Task.CompletedTask;
// (See "Discover and load extensions" above for the real implementation.)

private async void OnExtensionInstalled(AppExtensionCatalog sender,
    AppExtensionPackageInstalledEventArgs args)
{
    // Re-query the catalog to get the AppExtension instances added by this package
    var extensions = await sender.FindAllAsync();
    foreach (var extension in extensions.Where(e => e.Package.Id.FamilyName == args.Package.Id.FamilyName))
    {
        await LoadExtensionAsync(extension);
    }
}

private void OnExtensionRemoved(AppExtensionCatalog sender,
    AppExtensionPackageUninstallingEventArgs args)
{
    // args.Package identifies the package that is uninstalling
    string familyName = args.Package.Id.FamilyName;
    // Remove any extensions from that package from your app
}

private async void OnExtensionUpdated(AppExtensionCatalog sender,
    AppExtensionPackageUpdatedEventArgs args)
{
    // Re-query the catalog to get the refreshed AppExtension instances
    var extensions = await sender.FindAllAsync();
    foreach (var extension in extensions.Where(e => e.Package.Id.FamilyName == args.Package.Id.FamilyName))
    {
        // Reload with updated content
        await LoadExtensionAsync(extension);
    }
}