Windows Uygulama SDK'sı uygulamaları için uygulama uzantıları oluşturma

Uygulama uzantıları, uygulamanızın eklenti içeriğini ve işlevlerini diğer paketlerden barındırmasına olanak sağlar. Bu, eklenti modelinin Windows eşdeğeridir. Uzantı sağlayıcısı içeriği veya hizmetleri bildirir ve konak uygulamanız bunları çalışma zamanında bulur ve yükler.

Important

Uygulama uzantıları, hem konak hem de uzantı uygulamaları için MSIX paket kimliği gerektirir. Uzantılar paket kataloğu aracılığıyla bulunur.

Uygulama uzantıları nasıl çalışır?

Uygulama uzantısı modelinin iki rolü vardır:

  • Uzantı konağı — Uygulamanız hangi uzantı türlerini kabul ettiğini bildirir ve yüklü uzantıları bulur.
  • Uzantı sağlayıcısı — Başka bir uygulama (veya aynı uygulama), belirli bir türde bir uzantı sağladığını bildirir.

Uzantılar kod aracılığıyla değil paket bildirimi bildirimleriyle iletişim kurar. Konak uygulaması yüklü uzantıları bulmak ve yönetmek için AppExtensionCatalog API'sini kullanır.

Uzantı konağı bildirme

Uygulamanızın AppExtensionHostuygulamasına bir Package.appxmanifest bildirim ekleyin:

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

Uzantı sağlayıcısı bildirme

Uzantı uygulamasının Package.appxmanifestiçinde:

<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, ana uygulamanın okuyabildiği uzantı paketindeki bir klasörü işaret eder.

Uzantıları bulma ve yükleme

Ana uygulamanızda, yüklü uzantıları keşfetmek için AppExtensionCatalog kullanın:

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

Uzantı yaşam döngüsü olaylarını işleme

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