Uygulamanızı hizmetler, uzantılar ve paketler ile genişletme

Windows, uygulamanızın diğer uygulamalara işlevsellik sağlamasına veya üçüncü taraf eklentileri kullanmasına olanak sağlayan çeşitli teknolojiler sağlar. Bu makalede, Windows Uygulama SDK'sı masaüstü uygulamaları için kullanılabilir genişletilebilirlik seçenekleri karşılaştırılır.

Genişletilebilirlik seçeneklerine genel bakış

Teknoloji Description Paket kimliği gerekiyor En düşük işletim sistemi
Uygulama hizmetleri Aracılığıyla uygulamalar arasında istek/yanıt iletişimi AppServiceConnection Yes Windows 10 1607
Uygulama uzantıları Eklenti modeli — konak uygulaması uzantı paketlerinden içerik bulur Yes Windows 10 1607
Paket uzantıları uap17:PackageExtension ile daha geniş paket düzeyinde genişletilebilirlik Yes Windows 11
İsteğe bağlı paketler Bir ana uygulamayı destekleyen ek içerik paketleri Yes Windows 10 1709
Kaynak paketleri Pazara göre ayrılmış dil, ölçek ve erişilebilirlik varlıkları Yes Windows 10

Doğru teknolojiyi seçme

Şu durumlarda uygulama hizmetlerini kullanma:

  • Ayrı uygulamalar arasında iki yönlü iletişime ihtiyacınız vardır.
  • Tüketici uygulaması bir istek gönderir ve yanıt bekler.
  • API benzeri bir arabirimi diğer uygulamalarda kullanıma açmak istiyorsunuz.

Örnek: Diğer uygulamaların metin çevirmek için çağırabileceği bir çeviri hizmeti.

Şu durumlarda uygulama uzantılarını kullanma:

  • Uygulamanız, üçüncü tarafların içerik, tema veya eklenti sağladığı bir eklenti modeline ihtiyaç duyar.
  • Uzantılar, çalışma zamanında yüklü paketlerden algılanır.
  • Uzantılar yürütülebilir kod değil veri veya yapılandırma sağlar (kod yürütme uygulama hizmetlerini kullanmalıdır).

Örnek: Yüklü uzantı paketlerinden filtre paketlerini bulan bir görüntü düzenleyicisi.

Şu durumlarda paket uzantılarını kullanın:

  • Windows 11 daha geniş paket düzeyinde genişletilebilirlik gerekir.
  • Uzantıların, modelin izin verdiğinden daha fazla paket içeriğine erişmesi PublicFolder gerekir.

İsteğe bağlı paketleri şu durumlarda kullanın:

  • Ayrı paketler olarak dağıtılmış ek içeriğiniz (DLC, premium özellikler) vardır.
  • İçerik aynı yayımcı tarafından yazılır.

Mimari desenleri

Uzantı bulma ile App Service

Tam eklenti mimarisi için uygulama uzantılarını uygulama hizmetleriyle birleştirin:

  1. Ana uygulamanız, yüklü uzantıları keşfetmek için AppExtensionCatalog kullanır.
  2. Her uzantı, özelliklerini açıklayan özellikleri bildirir.
  3. Kullanıcı bir uzantıyı etkinleştirdiğinde, konak uygulaması iki yönlü iletişim için uzantının uygulama hizmetine bağlanır.
┌─────────────────┐      ┌──────────────────┐
│   Host app       │      │  Extension app    │
│                  │      │                   │
│ AppExtension     │◄────►│ AppExtension      │
│   Catalog        │      │   declaration     │
│                  │      │                   │
│ AppService       │◄────►│ AppService        │
│   Connection     │      │   provider        │
└─────────────────┘      └──────────────────┘

Yalnızca içerik uzantısı

Uzantıların statik içerik (temalar, şablonlar, veri dosyaları) sağladığı daha basit senaryolar için:

  1. Ana uygulama, uzantıları AppExtensionCatalog aracılığıyla keşfeder.
  2. Uzantının PublicFolderiçinden dosyaları okur.
  3. Uygulama hizmeti gerekmez.

UWP genişletilebilirliğinden farklar

Burada açıklanan genişletilebilirlik teknolojileri, Windows Uygulama SDK'sı masaüstü uygulamalarında UWP'de olduğu gibi çalışır ve tek bir gereksinim vardır: MSIX paket kimliği. Tüm genişletilebilirlik özellikleri, bildirimler için paket bildirimini ve bulma için paket kataloğunu kullanır.

Masaüstü uygulamanız paketten çıkarılmışsa, bu genişletilebilirlik teknolojilerini kullanamazsınız. Aşağıdaki gibi alternatif yaklaşımları göz önünde bulundurun:

  • COM tabanlı eklenti arabirimleri
  • Dosya sistemi tabanlı uzantı bulma
  • Adlandırılmış kanallar veya diğer IPC mekanizmaları

Paketlenmemiş uygulamalar için dosya tabanlı eklenti bulma

Paketlenmemiş WinUI 3 uygulamaları için, bilinen bir klasörden uzantı yüklemek için .NET AssemblyLoadContext kullanarak bir eklenti sistemi uygulayabilirsiniz:

public class PluginLoader
{
    private readonly string _pluginDirectory;

    public PluginLoader(string pluginDirectory)
    {
        _pluginDirectory = pluginDirectory;
    }

    public IEnumerable<T> LoadPlugins<T>() where T : class
    {
        if (!Directory.Exists(_pluginDirectory))
            yield break;

        foreach (var dll in Directory.GetFiles(_pluginDirectory, "*.dll"))
        {
            var context = new PluginLoadContext(dll);
            var assembly = context.LoadFromAssemblyPath(Path.GetFullPath(dll));

            foreach (var type in assembly.GetTypes()
                .Where(t => typeof(T).IsAssignableFrom(t) && !t.IsAbstract))
            {
                if (Activator.CreateInstance(type) is T plugin)
                    yield return plugin;
            }
        }
    }
}

// Custom AssemblyLoadContext to isolate plugin dependencies
public class PluginLoadContext : AssemblyLoadContext
{
    private readonly AssemblyDependencyResolver _resolver;

    public PluginLoadContext(string pluginPath) : base(isCollectible: true)
    {
        _resolver = new AssemblyDependencyResolver(pluginPath);
    }

    protected override Assembly? Load(AssemblyName assemblyName)
    {
        var path = _resolver.ResolveAssemblyToPath(assemblyName);
        return path != null ? LoadFromAssemblyPath(path) : null;
    }
}

Warning

Derlemelerin doğrulama olmadan diskten yüklenmesi bir güvenlik riskidir. Üretimde yüklemeden önce derleme imzalarını (Authenticode gibi) doğrulayın, eklenti dizininin ACL izinlerini kısıtlayın ve eklentileri azaltılmış ayrıcalıklarla ayrı bir işlemde çalıştırmayı göz önünde bulundurun.

Hem konağın hem de eklentilerin başvurduğu ayrı bir derlemede paylaşılan bir arabirim sözleşmesi tanımlayın:

// Contoso.App.Contracts (shared assembly)
public interface IPluginExtension
{
    string Name { get; }
    string Description { get; }
    void Execute(IServiceProvider services);
}

Note

AssemblyLoadContext içinde isCollectible: true kullanmak, eklentileri çalışma zamanında kaldırmanıza olanak tanır. Bu yaklaşım, (Yönetilen Genişletilebilirlik Çerçevesi) masaüstü uygulamalarında ortaya konabilecek sürüm oluşturma sorunlarını MEF önler.