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.
Paket kimliği , alan ve zaman arasında benzersiz bir tanımlayıcıdır. DNA'nız sizi benzersiz olarak tanımladıkça paket kimliği de bir paketi benzersiz olarak tanımlar.
Pakette ilişkili bir bit kümesi (dosyalar vb.) vardır. İki paket aynı kimliğe sahip değildir ve bir paketle ilişkili bitlerde yapılan değişiklikler farklı bir kimlik gerektirir.
Paket kimliği nedir?
Paket kimliği, bir paketi benzersiz olarak tanımlayan mantıksal bir yapıdır. Kimliğin 5 bölümü vardır:
- Ad: Bu, uygulama geliştiricisi tarafından seçilen bir addır. Microsoft Store, Mağaza'daki tüm uygulama geliştiricileri genelinde tüm uygulama adlarının benzersiz olmasını zorunlu kılabilir, ancak adların genel ekosistemde benzersiz olacağı garanti edilmemektedir.
- Sürüm: Paketin sürüm numarası. Uygulama geliştiricisi rastgele sürüm numaraları seçebilir ancak güncelleştirmelerle sürüm numaralarının artmasını sağlamalıdır.
- Mimarlık: Paket tarafından hedeflenen işlemci mimarisi. Aynı uygulama, her bir derlemenin kendi paketinde bulunduğu ve farklı işlemci mimarilerini hedefleyen şekilde oluşturulabilir.
-
ResourceId: Farklı diller veya farklı görüntü ölçekleri gibi kaynak paketlerini benzersiz bir şekilde tanımlamak için uygulama geliştiricisi tarafından seçilen bir dize. Kaynak paketleri genellikle mimariden bağımsızdır. Paketler için ResourceId her zaman
~. - Publisher: Uygulama geliştiricisinin, imzalama sertifikası ile tanımlanan konu adı. Saygın sertifika yetkilileri sertifikanın konu adı alanını doldurmak için benzersiz gerçek adlar ve kimlikler kullandığından bu, her uygulama geliştiricisi için teorik olarak benzersizdir.
Bu yapı bazen 5 parça demetolarak adlandırılır.
Uyarı
İmzasız paketler (1) için hala bir Yayımcı gerekir, (2) Yayımcı İmzasız işaretçiyi içermelidir (OID.2.25.311729368913984317654407730594956997722=1), (3) İmzasız işaretçi Publisher dizesindeki son alan olmalıdır ve (4) İmzasız paket için sertifika veya imza yoktur.
Paket kimliği alanlarının sınırları
| Alan | Veri türü | Sınırlar | Yorumlar |
|---|---|---|---|
| İsim | Paket Dizesi | Dakika: 3 Maksimum: 50 |
Validate API başına izin verilen değerler (bkz . Paket Dizesi) |
| Sürüm | DotQuad | Dk: 0.0.0.0 Maksimum: 65535.65535.65535.65535 |
Dize formu base-10 noktalı gösterimini kullanır, "Major.Minor.Build.Revision" |
| Mimarlık | Numaralandırma | Min: Yok Maksimum: Yok |
İzin verilen değerler şunlardır: "nötr", "x86", "x64", "arm", "arm64", "x86a64" |
| ResourceId (Kaynak Kimliği) | Paket Dizesi | Min: 0 Maksimum: 30 |
Validate API başına izin verilen değerler (bkz . Paket Dizesi) |
| Yayınevi | Dize | Dakika: 1 Maksimum: 8192 |
X.509 başına izin verilen değerler |
| YayıncıID | Dize | Dk: 13 Maksimum: 13 |
Base32 kodlanmış, Crockford varyantı, örneğin [a-hjkmnp-tv-z0-9] |
'Paket Dizesi' nedir?
Paket dizesi, aşağıdaki karakterlere izin veren bir dizedir:
- İzin Verilen Giriş Karakterleri (ASCII alt kümesi)
- Büyük harfler (U+0041 ile U+005A arasında)
- Küçük harfler (U+0061 ile U+007A)
- Sayılar (U+0030 ile U+0039 arasında)
- Nokta (U+002E)
- Kısa çizgi (U+002D)
Aşağıdaki değerlerin paket dizeleri olarak kullanılması yasaktır:
| Koşul | Yasaklanmış değerler |
|---|---|
| Eşitlenemiyor | ".", "..", "con", "prn", "aux", "nul", "com1", "com2", "com3", "com4", "com5", "com6", "com7", "com8", "com9", "lpt1", "lpt2", "lpt3", "lpt4", "lpt5", "lpt6", "lpt7", "lpt8", "lpt9" |
| Ile başlanamaz | "con.", "prn.", "aux.", "nul.", "com1.", "com2.", "com3.", "com4.", "com5.", "com6.", "com7.", "com8.", "com9.", "lpt1.", "lpt2.", "lpt3.", "lpt4.", "lpt5.", "lpt6.", "lpt7.", "lpt8.", "lpt9.", "xn--" |
| Bu ile bitemez | "." |
| Içeremez | .xn-- |
paket dizesi sıralı sayıma dayalı, büyük/küçük harfe duyarsız dize karşılaştırma API'leri (örneğin _wcsicmp) kullanılarak karşılaştırılmalıdır.
Paket Kimliği'nin name ve resourceid alanları paket dizeleridir.
PackageId nesnesi
PackageId, 5 parçalı tanımlama kümesini bireysel alanlar olarak (Name, Version, Architecture, ResourceId, Publisher) içeren bir nesnedir.
Paket Tam Adı
Paket Tam Adı, paketin kimliğinin 5 parçasından (ad, sürüm, mimari, resourceid, yayımcı) türetilmiş opak bir dizedir
<Name>_<Version>_<Architecture>_<ResourceId>_<PublisherId>
Örneğin, Windows Fotoğraflar uygulamasının bir paket tam adı "Microsoft.Windows.Photos_2020.20090.1002.0_x64__8wekyb3d8bbwe", burada "Microsoft.Windows.Photos", "2020.20090.1002.0" sürüm numarası, "x64" hedef işlemci mimarisi, kaynak kimliği boş (son iki alt çizgi arasında içerik yok) ve "8wekyb3d8bbwe" Microsoft'un yayımcı kimliğidir.
Paketin Tam Adı, bir MSIX paketini veya paketini benzersiz olarak tanımlar. Farklı içeriklere sahip ancak aynı Paket Tam Adına sahip iki paket veya paket olması bir hatadır.
Uyarı
MSIX, önceki terim APPX'in yeni adıdır. Daha fazla bilgi için bkz. MSIX nedir?
Paket Aile Adı
Paket Aile Adı, paket kimliğinin yalnızca iki bölümünden türetilmiş opak bir dizedir: ad ve yayımcı:
<Name>_<PublisherId>
Örneğin, Windows Fotoğraflar uygulamasının Paket Aile Adı "Microsoft.Windows.Photos_8wekyb3d8bbwe", burada "Microsoft.Windows.Photos" adı, "8wekyb3d8bbwe" ise Microsoft'un yayımcı kimliğidir.
Paket Aile Adı, genellikle 'sürüm içermeyen Paket Tam Adı' olarak adlandırılır.
Uyarı
Paket Aile Adı'nın mimarisi ve Kaynak Kimliği de olmadığından bu tamamen doğru değildir.
Uyarı
Veriler ve güvenlik genellikle bir paket ailesiyle sınırlıdır. Örneğin, Wordwrap'ı etkinleştirmek için Not Defteri sürüm 1.0.0.0 paketinden yüklenen Not Defteri uygulamasını yapılandırdıysanız bu kötü bir deneyim olacaktır. Ardından Not Defteri 1.0.0.1'e güncelleştirildi ve yapılandırma verileriniz paketin daha yeni sürümüne taşınmadı.
Yayımcı Kimliği
Paket Aile Adı, şu biçime sahip bir dizedir:
<name>_<publisherid>
Burada Publisher Kimliği'nin bazı çok özel özellikleri vardır:
- Publisher'dan türetildi
- MinLength = MaxLength = 13 karakter [sabit boyutlu]
- İzin Verilen Karakterler (regex olarak) = a-hj-km-np-tv-z0-9
- Base-32, Crockford Variant, yani alfasayısal (A-Z0-9), I (göz), L (ell), O (oh) veya U (siz) hariç
- ABCDEFABCDEFG == abcdefabcdefg --- karşılaştırmalar için sıralı büyük/küçük harfe duyarsız
Yani % hiç görmeyeceksiniz: \ / " ? veya Yayımcı Kimliğindeki diğer karakterler.
Diğer ayrıntılar için bkz. PackageFamilyNameFromId ve PackageNameAndPublisherIdFromFamilyName.
Yayımcı Kimliği genellikle PublisherId olarak adlandırılır.
Publisher Kimliği neden var?
Yayımlayıcının kimliğinin sertifikanızın X.509 adı/imzalayıcısıyla eşleşmesi gerektiği için Yayımlayıcı Kimliği bulunmaktadır, bu nedenle:
- Çok büyük olabilir (uzunluk <= 8192 karakter)
- Garip veya kısıtlanmış karakterler içerebilir (ters eğik çizgi vb.)
Bu sorunlar bazı X.509 dizelerinin dosya sisteminde, kayıt defterinde, URL'lerde ve diğer bağlamlarda kullanılmasını garip veya imkansız hale getirebilir.
PublisherId'i nasıl oluşturabilirim?
Bir 'ten PublisherId çıkarmak için PackageFamilyName kullanın.
'yi bir PublisherId'ten ayıklamak için PackageFullName kullanın.
Bir PublisherId ile Publisher oluşturmak nadiren gereklidir, ancak mevcut API'lerin kullanımıyla yapılabilir.
#include <appmodel.h>
HRESULT PublisherIdFromPublisher(
_In_ PCWSTR publisher,
_Out_writes_(PACKAGE_PUBLISHERID_MAX_LENGTH + 1) PWSTR publisherId)
{
PCWSTR name{ L"xyz" };
const size_t nameLength{ ARRAYSIZE(L"xyz") - 1 };
const size_t offsetToPublisherId{ name + 1 }; // xyz_...publisherid...
PACKAGE_ID id{};
id.name = name;
id.publisher = publisher;
WCHAR familyName[PACKAGE_PUBLISHERID_MAX_LENGTH + 1]{};
UINT32 n{ ARRAYSIZE(familyName) };
RETURN_IF_WIN32_ERROR(PackageFamilyNameFromId(&id, &n, familyName);
RETURN_IF_FAILED(StringCchCopyW(publisherId, PACKAGE_PUBLISHERID_MAX_LENGTH + 1, familyName + offsetToPublisherId));
return S_OK;
}
Aynı işlemin klasik bir Windows C uygulaması aşağıdadır:
#include <appmodel.h>
HRESULT PublisherIdFromPublisher(
_In_ PCWSTR publisher,
_Out_writes_(PACKAGE_PUBLISHERID_MAX_LENGTH + 1) PWSTR publisherId)
{
const WCHAR c_name[]{ L"xyz" };
const UINT32 c_nameLength{ ARRAYSIZE(c_nameForPublisherToPublisherId) - 1 };
PACKAGE_ID id{};
id.name = c_name;
id.publisher = publisher;
WCHAR familyName[PACKAGE_PUBLISHERID_MAX_LENGTH + 1]{};
UINT32 n{ ARRAYSIZE(familyName) };
RETURN_IF_WIN32_ERROR(PackageFamilyNameFromId(&id, &n, familyName));
RETURN_IF_FAILED(StringCchCopyW(publisherId, PACKAGE_PUBLISHERID_MAX_LENGTH + 1, familyName + c_nameLength + 1);
return S_OK;
}
Bu, bir Paket Kimliği'ni xyz_<publisherid>biçiminde bir Paket Aile Adı'na dönüştürerek PublisherId'yi oluşturur. Bu tarif kararlı ve güvenilirdir.
Bunun için yalnızca SDK'dan appmodel.h ile derlemeniz ve kernel32.lib (veya kernelbase.lib, onecore.lib veya APIIsets kullanıyorsanız api-ms-win-appmodel-runtime-l1.lib) ile bağlantı oluşturmanız gerekir.
Paket kimliğinde işlemci mimarisini anlama
Yaygın bir yanlış anlama, paketin Architecture=x64 yalnızca x64 kodu içerebileceği anlamına gelir. Bu doğru değil. Bu, paketin x64 kodunu destekleyen sistemlerde çalıştığı ve x64 uygulamaları tarafından kullanılabildiği anlamına gelir. Yalnızca PDF dosyaları içeren bir paket oluşturabilirsiniz ancak bunu ile <Identity Architecture=x64...> bildirebilirsiniz çünkü yalnızca x64 uyumlu sistemlere yüklenmesi amaçlanmıştır (örneğin x64 paketleri yalnızca x64 ve (Windows 11 itibarıyla) Arm64 sistemlerine yüklenebilir, çünkü x86, Arm ve Windows 10 Arm64 sistemleri x64'ü desteklemez).
Daha da yanlış anlaşılan bir konu, Architecture=neutral paketin yürütülebilir kod içermemesi anlamına gelmez. Bu, paketin tüm mimarilerde çalıştığı anlamına gelir. Örneğin JavaScript, Python, C# vb. dilinde yazılmış bir AES şifreleme API'si içeren bir paket yapabilirsiniz, ancak Arm64 sistemlerinde performans kabul edilemez. Bu nedenle, iyileştirilmiş bir Arm64 ikili dosyası ekler ve bunu işlemek için API'yi uygularsınız:
void Encrypt(...)
{
HANDLE h{};
if (GetCpu() == arm64)
{
h = LoadLibrary(GetCurrentPackagePath() + "\bin\encrypt-arm64.dll")
p = GetProcAddress(h, "Encrypt")
return (*p)(...)
}
else
{
// ...call other implementation...
}
}
Alternatif olarak, birden çok değişken içeren nötr bir paket de oluşturabilirsiniz:
\
bin\
encrypt-x86.dll
encrypt-x64.dll
encrypt-arm.dll
encrypt-arm64.dll
Geliştiriciler, daha sonra çalışma zamanında işlemleri için uygun olan ikili dosyayı almak amacıyla LoadLibrary("bin\encrypt-" + cpu + ".dll") kullanabilirler.
Genellikle, nötr paketlerin mimari başına içeriği yoktur, ancak bunlar olabilir. Yapabileceklerinize belirli sınırlar vardır (örneğin, x86 + x64 + arm + arm64 için derlenmiş notepad.exe içeren bir Not Defteri paketi oluşturabilirsiniz, ancak appxmanifest.xml bunlardan yalnızca birine işaret edebilir <Application Executable=...> ). Yalnızca gerekli bitleri yüklemenize olanak sağlayan paketler olduğu göz önüne alındığında, bu çok nadir bir işlemdir. Yasa dışı değil, sadece gelişmiş ve egzotik.
Ayrıca ( Architecture=x86 veya x64|arm|arm64), paketin yalnızca belirtilen mimari için yürütülebilir kod içerdiği anlamına gelmez. Bu sadece aşırı derecede yaygın bir durum.
Uyarı
Bu bağlamda "kod" veya "yürütülebilir kod" konusunu ele alırken taşınabilir yürütülebilir (PE) dosyalara başvuruyoruz.
Paket kimliği büyük/küçük harfe duyarlı mı?
Çoğunlukla hayır, ama Publisher büyük/küçük harfe duyarlıdır.
Kalan alanlar (Name, ResourceId, PublisherIdPackageFullName ve PackageFamilyName) değildir. Bu alanlar büyük/küçük harf durumunu korur ancak büyük/küçük harfe duyarlı olmadan karşılaştırır.
Ayrıca bakınız
Windows developer