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.
Bu makalede, bir Windows 10 uygulama uzantısının nasıl oluşturulacağı ve bir uygulamada nasıl barındıracağınız gösterilmektedir. Uygulama uzantıları UWP uygulamalarında ve paketlenmiş masaüstü uygulamalarındadesteklenir.
Uygulama uzantısının nasıl oluşturulacağını göstermek için, bu makalede Matematik Uzantısı kod örneğipaket bildirimi XML'i ve kod parçacıkları kullanılmaktadır. Bu örnek bir UWP uygulamasıdır, ancak örnekte sunulan özellikler paketlenmiş masaüstü uygulamaları için de geçerlidir. Örneği kullanmaya başlamak için şu yönergeleri izleyin:
Matematik Uzantısı kod örneğini indirin ve sıkıştırmasını açın. - Visual Studio 2019'da MathExtensionSample.sln açın. Derleme türünü x86 (
Derleme Configuration Manager olarak ayarlayın, ardındanPlatform 'ni her iki proje için de x86olarak değiştirin). - Çözümü dağıt: >Çözümü Dağıt.
Uygulama uzantılarına giriş
Windows 10'da uygulama uzantıları, diğer platformlardaki; eklenti, ek bileşen ve ilavelerle benzer işlevler sağlar. Uygulama uzantıları Windows 10 Yıldönümü sürümünde (sürüm 1607, derleme 10.0.14393) kullanıma sunulmuştur.
Uygulama uzantıları, içerik ve dağıtım olaylarını bir konak uygulamasıyla paylaşmalarına olanak tanıyan bir uzantı bildirimine sahip UWP uygulamaları veya paketlenmiş masaüstü uygulamalarıdır. Bir uzantı uygulaması birden çok uzantı sağlayabilir.
Uygulama uzantıları yalnızca UWP uygulamaları veya paketlenmiş masaüstü uygulamaları olduğundan, ayrı uygulama paketleri oluşturmadan tamamen işlevsel uygulamalar, konak uzantıları olabilir ve diğer uygulamalara uzantılar sağlayabilirler.
Bir uygulama uzantısı konağı oluşturduğunuzda, diğer geliştiricilerin uygulamanızı beklediğiniz veya kaynaklarına sahip olmadığınız yollarla geliştirebileceği bir ekosistem geliştirme fırsatı oluşturursunuz. Microsoft Office uzantılarını, Visual Studio uzantılarını, tarayıcı uzantılarını vb. göz önünde bulundurun. Bunlar, birlikte gönderildikleri işlevselliğin ötesine giden uygulamalar için daha zengin deneyimler oluşturur. Uzantılar, uygulamanıza değer ve uzun ömür ekleyebilir.
Üst düzeyde bir uygulama uzantısı ilişkisi ayarlamak için şunları yapmamız gerekir:
- Bir uygulamayı uzantı konağı olarak bildirin.
- Bir uygulamayı uzantı olarak bildirin.
- Uzantıyı bir uygulama hizmeti, arka plan görevi veya başka bir şekilde uygulamaya karar verin.
- Hostlar ve uzantılarının nasıl iletişim kuracağını tanımlayın.
- Uzantılara erişmek için konak uygulamasında Windows.ApplicationModel.AppExtensions API'sini kullanın.
Şimdi uzantıları kullanarak yeni işlevler ekleyebileceğiniz varsayımsal bir hesap makinesi uygulayan
matematik uzantısı kod örneği
Uygulamayı uzantı konağı olarak bildirme
Uygulama, Package.appxmanifest dosyasında <AppExtensionHost> öğesini bildirerek kendisini bir uygulama uzantısı konağı olarak tanımlar. Bunun nasıl yapıldığını görmek için MathExtensionHost projesindeki Package.appxmanifest dosyasına bakın.
MathExtensionHost projesinde Package.appxmanifest dosyası
<Package
...
xmlns:uap3="http://schemas.microsoft.com/appx/manifest/uap/windows10/3"
IgnorableNamespaces="uap uap3 mp">
...
<Applications>
<Application Id="App" ... >
...
<Extensions>
<uap3:Extension Category="windows.appExtensionHost">
<uap3:AppExtensionHost>
<uap3:Name>com.microsoft.mathext</uap3:Name>
</uap3:AppExtensionHost>
</uap3:Extension>
</Extensions>
</Application>
</Applications>
...
</Package>
xmlns:uap3="http://..."'a ve uap3'de IgnorableNamespaces varlığına dikkat edin. uap3 ad alanını kullandığımız için bunlar gereklidir.
<uap3:Extension Category="windows.appExtensionHost"> bu uygulamayı bir uzantı konağı olarak tanımlar.
içindeki <uap3:AppExtensionHost> öğesi, uzantı sözleşmesi adıdır. Bir uzantı aynı uzantı sözleşmesi adını belirttiğinde, konak bu uzantıyı bulabilir. Kural gereği, diğer uzantı sözleşmesi adlarıyla olası çakışmaları önlemek için uygulamanızı veya yayımcı adınızı kullanarak uzantı sözleşmesi adını oluşturmanızı öneririz.
Aynı uygulamada birden çok konak ve birden çok uzantı tanımlayabilirsiniz. Bu örnekte, bir konağı tanımlıyoruz. Uzantı başka bir uygulamada tanımlanır.
Uygulamayı uzantı olarak bildirme
Uygulama, <uap3:AppExtension> dosyasında öğesini bildirerek kendisini bir uygulama uzantısı olarak tanımlar. Bunun nasıl yapıldığını görmek için MathExtension projesinde Package.appxmanifest dosyasını açın.
MathExtension projesindeki Package.appxmanifest dosyası:
<Package
...
xmlns:uap3="http://schemas.microsoft.com/appx/manifest/uap/windows10/3"
IgnorableNamespaces="uap uap3 mp">
...
<Applications>
<Application Id="App" ... >
...
<Extensions>
...
<uap3:Extension Category="windows.appExtension">
<uap3:AppExtension Name="com.microsoft.mathext"
Id="power"
DisplayName="x^y"
Description="Exponent"
PublicFolder="Public">
<uap3:Properties>
<Service>com.microsoft.powservice</Service>
</uap3:Properties>
</uap3:AppExtension>
</uap3:Extension>
</Extensions>
</Application>
</Applications>
...
</Package>
xmlns:uap3="http://..." satırına ve uap3'de IgnorableNamespaces varlığına dikkat edin.
uap3 ad alanını kullandığımız için bunlar gereklidir.
<uap3:Extension Category="windows.appExtension"> bu uygulamayı bir uzantı olarak tanımlar.
<uap3:AppExtension> özniteliklerinin anlamı aşağıdaki gibidir:
| Özellik | Açıklama | Gerekli |
|---|---|---|
| İsim | Bu, uzantı sözleşmesi adıdır. Bir ana bilgisayarda bildirilen Adı eşleştiğinde, bu ana bilgisayar bu uzantıyı bulabilir. | ✔️ |
| KİMLİK | Bu uzantıyı benzersiz bir şekilde tanımlar. Aynı uzantı sözleşmesi adını kullanan birden çok uzantı olabileceğinden (birkaç uzantıyı destekleyen bir paint uygulaması düşünün), bunları ayırt etmek için kimliğini kullanabilirsiniz. Uygulama uzantısı konakları, uzantı türüyle ilgili bir şey çıkarsamak için kimliği kullanabilir. Örneğin, masaüstü için tasarlanmış bir Uzantınız ve mobil cihazlar için tasarlanmış başka bir Uzantınız olabilir ve ID bu iki uzantıyı ayırt edici unsur olabilir. Bunun için aşağıda açıklanan Özellikleri öğesini de kullanabilirsiniz. | ✔️ |
| Ekran Adı | Kullanıcıya uzantıyı tanıtmak için konak uygulamanızdan kullanılabilir. Yerelleştirme için, yeni kaynak yönetim sistemi (ms-resource:TokenName) üzerinden sorgulanabilir ve kullanılabilir. Yerelleştirilmiş içerik, konak uygulamadan değil uygulama uzantısı paketinden yüklenir. |
|
| Açıklama | Uzantıyı kullanıcıya açıklamak için konak uygulamanızdan kullanılabilir. Yerelleştirme için, yeni kaynak yönetim sistemi (ms-resource:TokenName) üzerinden sorgulanabilir ve kullanılabilir. Yerelleştirilmiş içerik, konak uygulamadan değil uygulama uzantısı paketinden yüklenir. |
|
| Ortak Klasör | Uzantı konağıyla içerik paylaşabileceğiniz paket köküne göre bir klasörün adı. Kural gereği ad "Genel" olur, ancak uzantınızdaki bir klasörle eşleşen herhangi bir adı kullanabilirsiniz. | ✔️ |
<uap3:Properties>, sunucuların çalışma zamanı sırasında okuyabileceği özel meta verileri içeren isteğe bağlı bir öğedir. Kod örneğinde uzantı bir uygulama hizmeti olarak uygulandığından, konağın bu hizmeti çağırabilmesi için adını alacağı bir yönteme ihtiyacı vardır. Uygulama hizmetinin adı, tanımladığımız <Service> öğesinde tanımlanır (istediğimiz her şeyi adlandırabilirdik). Kod örneğindeki host, uygulama hizmetinin adını öğrenmek için çalışma esnasında bu property'yi arar.
Uzantıyı nasıl uygulayacağınız konusunda karar verin.
Uygulama uzantıları hakkında Build 2016 oturumu, konak ve uzantılar arasında paylaşılan genel klasörün nasıl kullanılacağını gösterir. Bu örnekte uzantı, konağın çağırdığı ortak klasörde depolanan bir JavaScript dosyası tarafından uygulanır. Bu yaklaşım basit olmanın avantajına sahiptir, derleme gerektirmez ve uzantıya yönelik yönergeler ve konak uygulamasının Microsoft Store sayfasına bağlantı sağlayan varsayılan giriş sayfası oluşturmayı destekleyebilir. Ayrıntılar için Derleme 2016 uygulama uzantısı kod örneği bakınız. Özellikle InvertImageExtension projesine ve InvokeLoad() projesindeki ExtensionManager.cs dosyasına bakın.
Bu örnekte, uzantıyı uygulamak için bir uygulama hizmeti kullanacağız. Uygulama hizmetleri aşağıdaki avantajlara sahiptir:
- Eklenti kilitlenirse, konak uygulaması kendi işleminde çalıştığı için çökmez.
- Hizmeti uygulamak için tercih ettiğiniz dili kullanabilirsiniz. Ana uygulamayı geliştirmek için kullanılan dille eşleşmesi gerekmez.
- Uygulama hizmetinin, kendi uygulama kapsayıcısına erişimi vardır. Bu kapsayıcı, konak sunucudan farklı özelliklere sahip olabilir.
- Hizmetteki veriler ile konak uygulaması arasında yalıtım vardır.
Ana uygulama hizmeti kodu
Uzantının uygulama hizmetini çağıran konak kodu aşağıdadır:
MathExtensionHost projesindeki ExtensionManager.cs
public async Task<double> Invoke(ValueSet message)
{
if (Loaded)
{
try
{
// make the app service call
using (var connection = new AppServiceConnection())
{
// service name is defined in appxmanifest properties
connection.AppServiceName = _serviceName;
// package Family Name is provided by the extension
connection.PackageFamilyName = AppExtension.Package.Id.FamilyName;
// open the app service connection
AppServiceConnectionStatus status = await connection.OpenAsync();
if (status != AppServiceConnectionStatus.Success)
{
Debug.WriteLine("Failed App Service Connection");
}
else
{
// Call the app service
AppServiceResponse response = await connection.SendMessageAsync(message);
if (response.Status == AppServiceResponseStatus.Success)
{
ValueSet answer = response.Message as ValueSet;
if (answer.ContainsKey("Result")) // When our app service returns "Result", it means it succeeded
{
return (double)answer["Result"];
}
}
}
}
}
catch (Exception)
{
Debug.WriteLine("Calling the App Service failed");
}
}
return double.NaN; // indicates an error from the app service
}
Bu, bir uygulama hizmetini çağırmaya yönelik tipik bir koddur. Uygulama hizmetini oluşturma ve kullanma hakkında ayrıntılı bilgi için bkz. uygulama hizmeti oluşturma ve kullanma.
Dikkate değer bir nokta, çağrılacak uygulama hizmetinin adının nasıl belirlendiğidir. Sunucu, uzantının uygulanması hakkında bilgi sahibi olmadığından, uzantının uygulama hizmetinin adını belirtmesi gerekir. Kod örneğinde uzantı, <uap3:Properties> öğesindeki dosyasındaki uygulama hizmetinin adını bildirir:
MathExtension projesindeki Package.appxmanifest
...
<uap3:Extension Category="windows.appExtension">
<uap3:AppExtension ...>
<uap3:Properties>
<Service>com.microsoft.powservice</Service>
</uap3:Properties>
</uap3:AppExtension>
</uap3:Extension>
<uap3:Properties> öğesinde kendi XML'nizi tanımlayabilirsiniz. Bu durumda, konağın uzantıyı çağırdığı zaman kullanabilmesi için uygulama hizmetinin adını tanımlarız.
Sunucu bir uzantı yüklediğinde, aşağıdaki gibi bir kod, uzantının Package.appxmanifest dosyasında tanımlanan özelliklerden hizmetin adını çıkarır:
ExtensionManager.cs içinde Update(), MathExtensionHost projesi içinde
...
var properties = await ext.GetExtensionPropertiesAsync() as PropertySet;
...
#region Update Properties
// update app service information
_serviceName = null;
if (_properties != null)
{
if (_properties.ContainsKey("Service"))
{
PropertySet serviceProperty = _properties["Service"] as PropertySet;
this._serviceName = serviceProperty["#text"].ToString();
}
}
#endregion
Uygulama hizmetinin adı _serviceNameiçinde depolandığında, konak bu adı kullanarak uygulama hizmetini çağırabilir.
Bir uygulama hizmetini çağırmak için app service'i içeren paketin aile adı da gerekir. Neyse ki uygulama uzantısı API'si şu satırda elde edilen bilgileri sağlar: connection.PackageFamilyName = AppExtension.Package.Id.FamilyName;
Konağın ve uzantının nasıl iletişim kuracağını tanımlayın
Uygulama hizmetleri, bilgi alışverişinde bulunmak için ValueSet kullanır. Ev sahibi olarak, uzantılarla esnek bir iletişim protokolü geliştirmeniz gerekir. Kod örneğinde bu, gelecekte 1, 2 veya daha fazla bağımsız değişken alabilen uzantıların hesaplandığını gösterir.
Bu örnekte bağımsız değişkenlerin protokolü, 'Arg' adlı anahtar değer çiftlerini ve bağımsız değişken numarasını içeren bir ValueSet, örneğin Arg1 ve Arg2. Sunucu, ValueSetiçindeki tüm bağımsız değişkenleri geçirir ve uzantı, ihtiyaç duyduğu bağımsız değişkenleri kullanır. Eğer uzantı bir sonuç hesaplayabiliyorsa, konak, uzantı tarafından döndürülen ValueSet'in, hesaplamanın değerini içeren Result isimli bir anahtar bulundurmasını bekler. Bu anahtar yoksa, ana bilgisayar uzantının hesaplamayı tamamlayamadığını varsayar.
Uzantı uygulaması servis kodu
Kod örneğinde uzantının uygulama hizmeti arka plan görevi olarak uygulanmaz. Bunun yerine, uygulama servisinin onu barındıran uzantı uygulamasıyla aynı işlemde çalıştığı tek süreçli uygulama servis modelini kullanır. Bu, ana bilgisayar uygulamasından farklı bir işlemdir ve süreç ayrımının avantajlarını sağlarken, uzantı işlemi ile uygulama hizmetini uygulayan arka plan işlemi arasında işlemler arası iletişimden kaçınarak bazı performans avantajları elde eder. Bir uygulama hizmetinin arka plan görevi olarak çalışmasıyla aynı işlemde çalışması arasındaki farkı görmek için bkz. Bir uygulama hizmetini konak uygulamasıyla aynı işlemde çalışacak şekilde dönüştürme.
Uygulama hizmeti etkinleştirildiğinde sistem OnBackgroundActivate()'a geçer. Bu kod, olay işleyicilerini, (OnAppServiceRequestReceived()) geldiğinde gerçek uygulama hizmeti çağrısını işlemek ve iptal veya kapatma gibi olayları işleyen bir erteleme nesnesi alma gibi temizlik olaylarıyla ilgilenmek için ayarlar.
MathExtension projesinde App.xaml.cs.
protected override void OnBackgroundActivated(BackgroundActivatedEventArgs args)
{
base.OnBackgroundActivated(args);
if ( _appServiceInitialized == false ) // Only need to setup the handlers once
{
_appServiceInitialized = true;
IBackgroundTaskInstance taskInstance = args.TaskInstance;
taskInstance.Canceled += OnAppServicesCanceled;
AppServiceTriggerDetails appService = taskInstance.TriggerDetails as AppServiceTriggerDetails;
_appServiceDeferral = taskInstance.GetDeferral();
_appServiceConnection = appService.AppServiceConnection;
_appServiceConnection.RequestReceived += OnAppServiceRequestReceived;
_appServiceConnection.ServiceClosed += AppServiceConnection_ServiceClosed;
}
}
Uzantının çalışmasını sağlayan kod OnAppServiceRequestReceived()içindedir. Bu işlev, bir hesaplama yapmak için uygulama hizmeti çağrıldığında çağrılır.
ValueSetihtiyaç duyduğu değerleri ayıklar. Hesaplamayı gerçekleştirebiliyorsa, sonucu, anahtar adı Resultolan alana konarak konağa döndürülen ValueSet içinde yerleştirir. Bu ana bilgisayarın ve uzantılarının nasıl iletişim kuracağı için tanımlanan protokole göre, Sonuç anahtarının varlığının başarıyı göstereceğini hatırlayın; aksi takdirde başarısızlık gösterecektir.
MathExtension projesinde App.xaml.cs.
private async void OnAppServiceRequestReceived(AppServiceConnection sender, AppServiceRequestReceivedEventArgs args)
{
// Get a deferral because we use an awaitable API below (SendResponseAsync()) to respond to the message
// and we don't want this call to get cancelled while we are waiting.
AppServiceDeferral messageDeferral = args.GetDeferral();
ValueSet message = args.Request.Message;
ValueSet returnMessage = new ValueSet();
double? arg1 = Convert.ToDouble(message["arg1"]);
double? arg2 = Convert.ToDouble(message["arg2"]);
if (arg1.HasValue && arg2.HasValue)
{
returnMessage.Add("Result", Math.Pow(arg1.Value, arg2.Value)); // For this sample, the presence of a "Result" key will mean the call succeeded
}
await args.Request.SendResponseAsync(returnMessage);
messageDeferral.Complete();
}
Uzantıları yönetme
Artık bir konak ile uzantıları arasındaki ilişkiyi nasıl uygulayacağımızı gördüğümüze göre, bir konağın sistemde yüklü uzantıları nasıl bulduğunu ve uzantılar içeren paketlerin eklenmesine ve kaldırılmasına nasıl tepki verdiğine bakalım.
Microsoft Store, uzantıları paket olarak sunar. AppExtensionCatalog, konağın uzantı sözleşmesi adıyla eşleşen uzantılar içeren yüklü paketleri bulur ve konağa ilişkin bir uygulama uzantısı paketi yüklendiğinde veya kaldırıldığında tetiklenen olaylar sağlar.
Kod örneğinde, ExtensionManager sınıfı (MathExtensionHost projesinde ExtensionManager.cs tanımlanan), uzantıları yükleme ve uzantı paketi yükleme ve kaldırma işlemlerine yanıt verme mantığını sarmalar.
ExtensionManager oluşturucu, sistemdeki ana bilgisayarla aynı uzantı sözleşmesi adına sahip uygulama uzantılarını bulmak için AppExtensionCatalog kullanır:
MathExtensionHost projesinde ExtensionManager.cs.
public ExtensionManager(string extensionContractName)
{
// catalog & contract
ExtensionContractName = extensionContractName;
_catalog = AppExtensionCatalog.Open(ExtensionContractName);
...
}
Bir uzantı paketi yüklendiğinde ExtensionManager, paketteki ana bilgisayarla aynı uzantı sözleşmesi adına sahip uzantılar hakkında bilgi toplar. Yükleme, etkilenen uzantının bilgilerinin güncelleştirildiği bir güncelleştirmeyi temsil edebilir. Bir uzantı paketi kaldırıldığında, ExtensionManager etkilenen uzantılarla ilgili bilgileri kaldırır, böylece kullanıcı artık hangi uzantıların kullanılamadığını bilir.
Extension sınıfı (MathExtensionHost projesinde ExtensionManager.cs'de tanımlanır) bir uzantının kimliğine, açıklamasına, logosuna ve kullanıcının uzantıyı etkinleştirip etkinleştirmediği gibi uygulamaya özgü bilgilere erişmek için kod örneği için oluşturulmuştur.
Uzantının yüklendiğini söylemek için (bkz. Load()), paket durumunun iyi olduğu ve kimliğini, logosunu, açıklamasını ve genel klasörünü edindiğimiz anlamına gelir (bu örnekte kullanmayız, yalnızca nasıl elde ettiğinizi göstermek amacıyla). Uzantı paketinin kendisi yüklenmiyor.
Kaldırma kavramı, hangi uzantıların artık kullanıcıya sunulmaması gerektiğini izlemek için kullanılır.
ExtensionManager, uzantıların, adlarının, açıklamalarının ve logolarının kullanıcı arabirimine data bağlanabilmesi için Extension örnekler koleksiyonu sağlar.
ExtensionsTab sayfası bu koleksiyona bağlanır ve uzantıları etkinleştirmek/devre dışı bırakmak ve kaldırmak için kullanıcı arabirimi sağlar.
Bir uzantı kaldırıldığında, sistem kullanıcıdan uzantıyı içeren paketi kaldırmak istediğini (ve muhtemelen başka uzantılar içerdiğini) doğrulamasını ister. Kullanıcı kabul ederse, paket kaldırılır ve ExtensionManager kaldırılan paketteki uzantıları konak uygulamanın kullanabileceği uzantılar listesinden kaldırır.
Uygulama uzantıları ve konaklarında hata ayıklama
Genellikle, uzantı konağı ve uzantısı aynı çözümün bir parçası değildir. Bu durumda, ana bilgisayarda ve uzantıda hata ayıklamak için:
- Konak projenizi Visual Studio'nun tek bir oturumuna yükleyin.
- Uzantınızı Visual Studio'nun başka bir örneğine yükleyin.
- Hata ayıklama aracında ana uygulamanızı başlatın.
- Hata ayıklayıcıda uzantı uygulamasını başlatın. (Uzantıyı hata ayıklamak yerine dağıtmak istiyorsanız, konağın paket yükleme olayını test etmek için Derleme > Dağıtma Çözümüyapın).
Artık ana bilgisayarda ve uzantıda kesme noktalarına isabet edebileceksiniz. Uzantı uygulamasının kendisinde hata ayıklamaya başlarsanız, uygulama için boş bir pencere görürsünüz. Boş pencereyi görmek istemiyorsanız, uzantı projesinin hata ayıklama ayarlarını uygulamayı başlatmayacak şekilde değiştirebilir, bunun yerine uzantı projesi başlatıldığında hata ayıklayabilirsiniz (uzantı projesine sağ tıklayın, Özellikler>Hata Ayıkla>Başlatmayın'ı seçin, ancakbaşlatıldığında kodumda hata ayıklayın) uzantı projesinde hata ayıklamaya (F5) başlamanız gerekir, ancak ana bilgisayar uzantıyı etkinleştirene kadar bekler ve ardından uzantıdaki kesme noktalarınız isabet alır.
Kod örneğinde hata ayıklama
Kod örneğinde ana bilgisayar ve uzantı aynı çözümde yer alır. Hata ayıklamak için aşağıdakileri yapın:
- Başlangıç projesinin MathExtensionHost
olduğundan emin olun (MathExtensionHost projesi sağ tıklayın, StartUp projesi olarak ayarla ) öğesine tıklayın. -
Invokeprojesindeki ExtensionManager.cs üzerinde bir kesme noktası koyun. - tuşuna basarak MathExtensionHost projesini çalıştırın.
- App.xaml.cs'de
OnAppServiceRequestReceivedüzerinde kesme noktası ekleyin, MathExtension projesinde. - MathExtension projesinin
hata ayıklamasını başlatın (MathExtension projesine sağ tıklayın, Hata Ayıkla ), bu da projenin dağıtılmasını ve konakta paket yükleme olayını tetiklemesini sağlayacaktır.Yeni örneği başlat MathExtensionHost uygulamasında,Hesaplama sayfasına gidin ve uzantıyı etkinleştirmek için x^ytıklayın. ilk olarak Invoke()kesme noktasına ulaşılır ve uzantılar uygulama hizmeti çağrısının yapıldığını görebilirsiniz. Ardından uzantıdakiOnAppServiceRequestReceived()yöntemi tetiklenir ve uygulama hizmetinin sonucu hesaplayıp döndürdüğünü görebilirsiniz.
Bir uygulama hizmeti olarak uygulanan uzantıların sorunlarını giderme
Uzantı ana bilgisayarınız uzantınızın uygulama hizmetine bağlanmakta sorun yaşıyorsa, <uap:AppService Name="..."> özniteliğinin <Service> öğesine koyduğunuz değerle eşleştiğinden emin olun. Bunlar eşleşmiyorsa, uzantınızın ana bilgisayara sağladığı hizmet adı uyguladığınız uygulama hizmeti adıyla eşleşmez ve ana bilgisayar uzantınızı etkinleştiremez.
MathExtension projesindeki Package.appxmanifest dosyası:
<Extensions>
<uap:Extension Category="windows.appService">
<uap:AppService Name="com.microsoft.sqrtservice" /> <!-- This must match the contents of <Service>...</Service> -->
</uap:Extension>
<uap3:Extension Category="windows.appExtension">
<uap3:AppExtension Name="com.microsoft.mathext" Id="sqrt" DisplayName="Sqrt(x)" Description="Square root" PublicFolder="Public">
<uap3:Properties>
<Service>com.microsoft.powservice</Service> <!-- this must match <uap:AppService Name=...> -->
</uap3:Properties>
</uap3:AppExtension>
</uap3:Extension>
</Extensions>
Test etmek için temel senaryoların denetim listesi
Bir uzantı konağı oluşturduğunuzda ve uzantıları ne kadar iyi desteklediğini test etmeye hazır olduğunuzda deneyebileceğiniz bazı temel senaryolar şunlardır:
- Konağı çalıştırın ve ardından bir uzantı uygulaması dağıtın
- Ana bilgisayar çalışırken kullanılabilir hale gelen yeni uzantıları algılıyor mu?
- Uzantı uygulamasını dağıtın ve ardından sunucuyu dağıtıp yürütün.
- Sunucu daha önce mevcut olan uzantıları algılar mı?
- Konağı çalıştırın ve ardından uzantı uygulamasını kaldırın.
- Konak kaldırma işlemini doğru algılar mı?
- Konağı çalıştırın ve ardından uzantı uygulamasını daha yeni bir sürüme güncelleştirin.
- Sunucu değişiklikleri algılayıp uzantının eski sürümlerini düzgün bir şekilde devre dışı bırakıyor mu?
Test edilecek gelişmiş senaryolar:
- Konağı çalıştırın, uzantı uygulamasını çıkarılabilir medyaya taşıyın, medyayı kaldırın
- Ana bilgisayar, paket durumundaki değişikliği algılar ve uzantıyı devre dışı bırakıyor mu?
- Konağı çalıştırın, ardından uzantı uygulamasını bozarak geçersiz hale getirin ya da farklı şekilde imzalayın.
- Ana bilgisayar, üzerinde oynanmış uzantıyı algılayıp doğru şekilde işleyebilir mi?
- Konağı çalıştırın, ardından geçersiz içeriğe veya özelliklere sahip bir uzantı uygulaması dağıtın
- Sunucu geçersiz içeriği algılayıp doğru şekilde işliyor mu?
Tasarımla ilgili dikkat edilecek noktalar
- Kullanıcıya hangi uzantıların kullanılabilir olduğunu gösteren ve bunları etkinleştirmesine/devre dışı bırakmasına izin veren kullanıcı arabirimini sağlayın. Paket çevrimdışı olduğu için kullanılamayan uzantılar için glifler eklemeyi de düşünebilirsiniz.
- Kullanıcıyı uzantıları alabileceği yere yönlendirin. Uzantı sayfanız, uygulamanızla birlikte kullanılabilecek uzantıların listesini getiren bir Microsoft Store arama sorgusu sağlayabilir.
- Uzantı ekleme ve kaldırma işlemini kullanıcıya bildirmeyi düşünün. Yeni bir uzantının ne zaman yükleneceğine ilişkin bir bildirim oluşturabilir ve kullanıcıyı etkinleştirmeye davet edebilirsiniz. Kullanıcıların denetime sahip olması için uzantılar varsayılan olarak devre dışı bırakılmalıdır.
Uygulama uzantılarının isteğe bağlı paketlerden farkı
İsteğe bağlı paketler ve uygulama uzantıları arasındaki temel fark, açık ekosisteme karşı kapalı ekosistem ve bağımlı paket ile bağımsız pakettir.
Uygulama uzantıları açık bir ekosisteme katılır. Uygulamanız uygulama uzantılarını barındırabiliyorsa, uzantıdan bilgi geçirme/alma yönteminizle uyumlu olduğu sürece herkes konağınız için bir uzantı yazabilir. Bu, yayımcının, uygulamayla kullanılabilecek isteğe bağlı bir paketi kimin oluşturmasına izin verileceğini belirlediği kapalı bir ekosisteme katılan isteğe bağlı paketlerden farklıdır.
Uygulama uzantıları bağımsız paketlerdir ve tek başına uygulamalar olabilir. Başka bir uygulamada dağıtım bağımlılığı olamaz. İsteğe bağlı paketler birincil paketi gerektirir ve bu paket olmadan çalıştırılamaz.
Bir oyun için genişletme paketi isteğe bağlı bir paket için iyi bir aday olabilir çünkü oyuna sıkı sıkıya bağlıdır, oyundan bağımsız olarak çalıştırılamaz ve genişletme paketlerinin yalnızca ekosistemdeki herhangi bir geliştirici tarafından oluşturulmasını istemeyebilirsiniz.
Aynı oyunun özelleştirilebilir kullanıcı arabirimi eklentileri veya temalı uygulamaları varsa, uzantıyı sağlayan uygulama kendi başına çalışabileceğinden ve herhangi bir 3. taraf bunları gerçekleştirebileceğinden uygulama uzantısı iyi bir seçim olabilir.
Açıklamalar
Bu konu, uygulama uzantılarına giriş niteliğindedir. Sunucunun oluşturulması ve Package.appxmanifest dosyasında bu şekilde etiketlenmesi, uzantının Package.appxmanifest dosyasında aynı şekilde oluşturulması ve etiketlenmesi, uzantının nasıl uygulanacağının belirlenmesi (uygulama hizmeti, arka plan görevi veya diğer yöntemler gibi), sunucunun uzantılarla nasıl iletişim kuracağının tanımlanması ve uzantılara erişmek ve uzantıları yönetmek için AppExtensions API'sinin kullanılması.