Alkalmazásbővítmények létrehozása Windows App SDK alkalmazásokhoz

Az alkalmazásbővítmények lehetővé teszik, hogy az alkalmazás más csomagokból származó bővítménytartalmakat és funkciókat üzemeltetjön. Ez a beépülő modulmodell Windows megfelelője. A bővítményszolgáltató deklarálja a tartalmat vagy szolgáltatásokat, és a gazdaalkalmazás futásidőben észleli és betölti őket.

Important

Az alkalmazásbővítményekhez mind a gazdaalkalmazás, mind a bővítményalkalmazások esetében MSIX-csomagidentitás szükséges. A bővítmények felderítése a csomagkatalóguson keresztül történik.

Az alkalmazásbővítmények működése

Az alkalmazásbővítmény-modell két szerepkörrel rendelkezik:

  • Bővítménygazda – Az alkalmazás deklarálja, hogy milyen bővítménytípusokat fogad el, és felderíti a telepített bővítményeket.
  • Bővítményszolgáltató – Egy másik alkalmazás (vagy ugyanaz az alkalmazás) deklarálja, hogy egy adott típusú bővítményt biztosít.

A bővítmények nem kódon keresztül, hanem a csomagjegyzék-deklarációkon keresztül kommunikálnak. A gazdaalkalmazás az AppExtensionCatalog API-t használja a telepített bővítmények megkereséséhez és kezeléséhez.

Bővítménygazda deklarálása

Adjon hozzá egy AppExtensionHost deklarációt az alkalmazás Package.appxmanifest részéhez:

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

Bővítményszolgáltató deklarálása

A bővítményalkalmazásban 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>

A PublicFolder a bővítménycsomag egy olyan mappájára mutat, amelyet a gazdaalkalmazás olvasni tud.

Bővítmények felderítése és betöltése

A gazdaalkalmazásban a telepített bővítmények felderítésére használhatja AppExtensionCatalog :

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) { }

Bővítmény életciklus-eseményeinek kezelése

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);
    }
}