Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
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
PublicFoldergerekir.
İ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:
- Ana uygulamanız, yüklü uzantıları keşfetmek için
AppExtensionCatalogkullanır. - Her uzantı, özelliklerini açıklayan özellikleri bildirir.
- 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:
- Ana uygulama, uzantıları
AppExtensionCatalogaracılığıyla keşfeder. - Uzantının
PublicFolderiçinden dosyaları okur. - 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.
İlgili içerik
Windows developer