Paketlenmemiş Win32 Uygulamalarının Kimliği, Kaydı ve Etkinleştirilmesi

  • History |
  • |
  • 0 Yorum

Arka Plan Görevleri, Bildirimler, LiveTiles, Paylaşım ve daha fazlası gibi birçok yeni ve aranan Windows API'si ve özelliği, paketlenmemiş Win32 uygulamalarından kolayca çağrılamaz veya kullanılamaz. Bunun nedeni, sistemle tümleşen ve aşağıdaki kavramlara bağımlılığı olan UWP API'leri için programlama modelidir:

  • Kimlik – Arayanı tanımlamak için paket veya uygulama kimliği ve kapsam verileri ve kaynakları için bir tanımlayıcı gereksinimi.
  • Kayıt – API tarafından gerekli olan ve paket veya uygulama kimliği tarafından dizine eklenen uygulama dağıtımı sırasında makine durumunun yapılandırılması gereksinimi.
Paketlenmiş uygulamalar için, Appxmanifest.xml ve Registration'da bildirilen Kimlik, AppxManifest.xml'teki bilgilere dayanarak MSIX dağıtım işlem hattı tarafından işlenir. Bu, uygulama kodunun yalnızca bir API kullandığı UWP API'leri için basitleştirilmiş bir arama deseni sağlar. Bunu, geri aramayı yönetmek için kayıt-kullanım-kayıt silme deseni gerektiren tipik bir Win32 API'si ile karşılaştırın.
Geri bildirimlerinizi duyduk ve yanıt olarak Win32 uygulamaları ve yeni Windows API'leri ve özellikleri arasındaki ayrımı dolduruyoruz, böylece bu yeni API'lerden ve özelliklerden yararlanabilir ve uygulamalarınızı geliştirebilirsiniz. Windows Build 10.0.19000.0 itibariyle, Win32 uygulamanıza işletim sistemine daha derin bir entegrasyon sağlamak için aşağıdaki yeni AppModel kavramlarını sunuyoruz:
  • Seyrek Paket

    kaydı İmzalı MSIX paketleri bugün Windows'a yüklenebilir, ancak paketin Appxmanifest.xml'sinde başvurulan tüm içerik paketin içinde bulunmalıdır. 'Seyrek' Paket bir AppxManifest içerir.xml ancak normal /tam bir paketin aksine, bildirim önceden belirlenmiş bir 'harici konumda' paketinin dışındaki dosyalara başvuru yapabilir. Bu, henüz tam MSIX ambalajını benimseyemeyen uygulamaların Kimlik kazanmasına, UWP API'lerinin gerektirdiği şekilde durumu (Kayıt) yapılandırmasına ve ardından bu API'lerden yararlanmasına olanak tanır.
  • Paket 'Harici

    Konum' 
    Seyrek Paketi desteklemek için, paket tanımı artık yeni bir <allowExternalContent>element'e sahiptir. Bu, paketinizin AppxManifest.xml'in paketinin dışındaki içeriğe diskte belirli bir konumda başvurmasına izin verir. Örneğin, mevcut Win32 uygulamanız C:\Program Files\MyWin32App\ içine içerik yüklüyorsa, <allowExternalContent>element'i bildiren bir Seyrek Paket oluşturabilir ve uygulamanızın yüklenmesi veya ilk çalışması sırasında Seyrek Paketi kaydedebilir ve uygulamanızın kullanılacağı dış konum olarak C:\Program Files\MyWin32App\ bildirebilirsiniz. Bu şekilde Seyrek Paket'in avantajlarından yararlanırken diğer tüm uygulama yapıtlarınızı bugün yaptığınız konumlarda dağıtmaya devam edebilirsiniz.
  • Win32 türü RuntimeBehavior

    Seyrek Paket kullanırken mevcut Win32 uygulamanızın uyumluluğuna yardımcı olmak için, uygulama uygulama işleminin mümkün olduğunca paketlenmemiş bir Win32 uygulaması gibi çalıştırılması için kaydolabilir. Bu, dosya sistemi + kayıt defteri sanallaştırmasına, sistem tarafından yaşam boyu yönetime ve tam paketlenmiş uygulamaların diğer çalışma zamanı özniteliklerine tabi olmaması nedeniyle tamamen paketlenmiş bir Win32 uygulamasından farklıdır. Böyle bir uygulama ile tamamen paketlenmiş bir uygulama arasındaki ana çalışma zamanı benzerliği, çalışan işlemde uygulama / paket kimliğinin varlığıdır.
  • CreateProcess
    ile etkinleştirme Bugün UWP uygulamaları için etkinleştirme yolu, uygulamanın işlem belirtecinde PackageIdentity olmasını sağlar. Bu, UWP API'leri tarafından arayanı tanımlamak ve daha sonra başvurmak için kullanılır - geri arama gerçekleştirmek veya dağıtım sırasında yapılandırılan durumu aramak için. Bu gereksinim nedeniyle, CreateProcess() işlem hattı Identity hakkında aydınlatılmadığından, bir UWP exe üzerinde CreateProcess() çağrısı başarısız olur. Harici Konuma Sahip Seyrek Paketleri desteklemek için, CreateProcess() senaryolarında Kimlik sağlamak için klasik Win32 application.manifest uygulamasından yararlanıyoruz.
Özünde, bu özellikler en son API'lerimizi ve özelliklerimizi kullanmak için paketlenmemiş Win32 işlemleri için bir temel sağlamakla ilgilidir.
*Bunların henüz tam Visual Studio entegrasyonuna sahip olmayan yeni ve biraz gelişmiş geliştirme özellikleri olduğunu, yani Visual Studio dışında seyrek bir Paket oluşturmak zorunda kalmak gibi sondan sona yazma deneyiminde hala bazı boşluklar olduğunu lütfen unutmayın.

Demo Uygulaması

Seyrek Paket yazma ve kullanımının farklı yönleriyle dolaşmak için Seyrek Paketten yararlanarak örnek bir uygulama kullanacağız. Demo uygulaması https://aka.ms/sparsepkgsample
Fotoğrafları depolayan ve görüntüleyen paketlenmemiş bir WPF uygulaması PhotoStoreDemo'ya sahibiz. Tamamen paketlenmemiş durumunda, yeni Windows API'lerinden ve özelliklerinden yararlanmak zor olabilir. Amacımız, seyrek bir Paket oluşturarak ve daha önce mevcut Win32 uygulama yapıtlarımızı kullanmaya devam ederek bunu değiştirmektir.

Seyrek Paketin Anatomisi

Seyrek Paket.xml dağıtmak için bir AppxManifest'e ve en az sayıda gerekli görsel varlığa sahip olmalıdır.
[kod lang="xml"]
<Package



xmlns:uap10="http://schemas.microsoft.com/appx/manifest/uap/windows10/10" IgnorableNamespaces="uap10">

<Identity Name="PhotoStoreDemo" Publisher="CN=Contoso" ... />



<Properties>...
<Logo>Assets\storelogo.png</Logo>

<uap10:AllowExternalContent>true</uap10:AllowExternalContent>





</Properties><Dependencies><TarGetDeviceFamily Name="Windows.Desktop"

MinVersion="10.0.19000.0"

MaxVersionTested="10.0.19000.0" />





</Bağımlılıklar><Kadınlar><rescap:Yetenek Adı=" runFullTrust" />

<rescap:Capability Name="unvirtualizedResources"/>



</Capabilities>...








<Applications><Application Id="PhotoStoreDemo" Executable="PhotoStoreDemo.exe" uap10:TrustLevel="mediumIL" uap10:RuntimeBehavior="win32App"> ...









[/kod]
Seyrek Paketin anatomisine bakmak için yukarıdaki örnek kodumuzdan AppxManifest.xml kullanalım.

Paket Harici Konumu

İlk olarak, AppxManifest <AllowExternalContent>package özelliğini bildirmelidir. Bu, bildirimin paket içinde olmayan içeriğe başvurmasını sağlar. Seyrek Pakette başvurulan ve doğrudan pakette yer alan herhangi bir içerik, Seyrek Paket kaydedildiğinde belirtilen 'harici' konumda olmalıdır. Örneğin, yükleme sırasında veya ilk çalıştırmada paketimin dış konumunu C:\Program Files\MyDesktopApp\ olarak bildirirsem, <Logo.png için tanımlanan resim storelogo>property C:\Program Files\MyDesktopApp\Assets\storelogo.png adresinden ve ana uygulama yürütülebilir PhotoStoreDemo.exe C:\Program Files\MyDesktopApp\PhotoStoreDemo.exe adresinde yüklenmelidir. Buna ek olarak, MinVersion işletim sistemi yapısı 10.0.19000.0 veya daha büyük olmalıdır, Seyrek paketler şu anda bundan önceki işletim sistemi sürümlerinde desteklenmemektedir.
Tam olarak paketlenmiş bir uygulamanın aksine, Seyrek Paket + 'Harici Konum' kullanan bir uygulamanın dağıtım, çalışma zamanı ve kaldırmada işletim sistemi tarafından tam olarak yönetilmediğini unutmayın. Bugün Win32 uygulamalarında olduğu gibi, uygulamanız Seyrek Paket ve 'harici konumdaki' herhangi bir içerik de dahil olmak üzere tüm yapıtlarının yüklenmesinden ve kaldırılmasından sorumludur. Bu aynı zamanda uygulamanızın, tamamen paketlenmiş uygulamaların Sistem'de kilitli bir konuma yüklenmesinden aldığı ömür boyu yönetim ve kurcalama koruması almadığı anlamına gelir.

Win32 Çalışma Zamanı Davranışı

<Application>element'teki yeni tanıtılan TrustLevel=mediumIL ve RuntimeBehavior=Win32App öznitelikleri, bu Seyrek Paketle ilişkili uygulamanın kayıt defteri + dosya sistemi sanallaştırması ve diğer çalışma zamanı değişiklikleri olmadan bir Win32 uygulaması gibi çalışacağını bildirmek için kullanılır.

Seyrek Paket Yazma

Seyrek Paket yazmada gereken adımlar şunlardır:
  1. AppxManifest.xml + Görsel Varlıklar oluşturun ve paketlenin
  2. Seyrek Paketi İmzalayın
  3. Win32 uygulamanızda klasik bir Win32 uygulaması.manifest oluşturma
  4. Seyrek Paketi Kaydedin

AppxManifest Oluşturma ve Paketleme.xml + Görsel Varlıklar

Seyrek Paket oluşturmanın ilk adımı AppxManifest.xml oluşturmaktır. AppxManifest'in yukarıda listelenen özellikleri içermesi gerekir, bu şablonu başlangıç noktası olarak kullanabilirsiniz. AppxManifest'e ek olarak, bildirim dosyasına başvurulan görsel varlıkları da eklemeniz gerekir. Görsel varlıkları oluşturmak için Visual Studio Uygulama Paketleme Projesi'nin package.manifest düzenleyicislerindeki "Visual Assets" düğümünü kullanabilirsiniz.
AppxManifest.xml ve görsel varlıklarınızı edindikten sonra Seyrek Paket oluşturmak için App Packager'ı (MakeAppx.exe) kullanabilirsiniz. Seyrek paket AppxManifest.xml başvurulan tüm dosyaları içermediği için /nv komutunu belirtmeniz gerekir.
VS Geliştirici Komut İstemi'nden yalnızca bir AppxManifest.xml içeren seyrek bir Paket oluşturmak için örnek bir komut aşağıda verilmiştir:
AppxManifest.exe /p <Output Path>\mypackage.msix /nv ile dizine <Appx.xml> paketi /d
Uygulama paketleyici (MakeAppx.exe) hakkında daha fazla bilgiyi burada bulabilirsiniz.

Seyrek paket imzalama

Bir makineye başarıyla yüklemek için Seyrek Paketinizin o makinede güvenilen bir sertifikayla imzalanması gerekir. Bu durum günümüzde normal MSIX paketleri için de geçerli. Geliştirme amacıyla kendinden imzalı yeni bir sertifika oluşturabilir ve Windows SDK ve MSIX Araç Seti'nde bulunan SignTool 'u kullanarak Seyrek Paketinizi imzalayabilirsiniz. Yeni duyurulan Device Guard Signing özelliğinden de yararlanabilirsiniz.
İmza Aracı'nı kullanarak VS Geliştirici Komut İstemi'nden Seyrek Paketin nasıl imzalayacağına ilişkin bir örnek aşağıda verilmiştir:

SignTool.exe işareti /fd SHA256 /a /f <tep>\mycert.pfx /p <sayılı parola> <>\mypackage.msix yolu

Klasik bir Win32 uygulaması oluşturma.manifest

UWP etkinleştirme ardışık düzeninden geçmeyen CreateProcess() senaryolarını desteklemek için, uygulamanızın yeni <msix>element altında kimlik özniteliklerini bildirmek için klasik Win32 stili application.manifest'i kullanması gerekir. Bildirimde tanımlanan değerler, yürütülebilir dosyası başlatıldığında uygulamanızın kimliğini belirler ve Seyrek Paketinizin AppxManifest.xml'inde bildirilenlerle eşleşmelidir.
[kod lang="xml"]
<?xml

sürümü="1.0" kodlaması="utf-8"?> <birlikle manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1">

<assemblyIdentity version="0.0 .0.1" name="PhotoStoreDemo.app"/>

<msix xmlns="urn:schemas-microsoft-com:msix.v1"

publisher="CN=Contoso"

packageName="PhotoStoreDemo"

applicationId="PhotoStoreDemo"



/></assembly>

[/kod]
packageName (yukarıda) Ad'a karşılık gelir ve publisher Seyrek paketinizin <Identity>element'inde Publisher'a karşılık gelir:
(Seyrek Paket)
[kod lang="xml"]