Aracılığıyla paylaş


Paket kimliğini ve çalışma zamanı bağlamı algılama

Uygulamanızın msix paketinde dağıtılmayan bazı sürümleri olabilir. Çalışma zamanında uygulamanız, Windows Paket Yöneticisi API'sini veya kendi özel yükleyicinizi kullanarak bir MSIX paketi olarak dağıtılıp dağıtılmadığını algılayabilir. Güncelleştirme ayarları gibi uygulama davranışını değiştirmek veya yalnızca MSIX paketleri için kullanılabilen işlevlerden yararlanmak isteyebilirsiniz.

Uygulamanızın tam MSIX özellik kümesini destekleyen bir Windows sürümünde MSIX paketi olarak çalışıp çalışmadığını belirlemek için, kernel32.dll'de GetCurrentPackageFullName yerel işlevini kullanabilirsiniz. Bir masaüstü uygulaması paket kimliği olmadan paketlenmemiş bir uygulama olarak çalıştığında, bu işlev uygulamanın çalıştığı bağlamı çıkarmanıza yardımcı olabilecek bir hata döndürür.

İşlev başarılı olursa, şu anlama gelir:

  • Uygulamanız bir MSIX paketinde paketlenmiş.
  • Uygulamanız Windows 10, sürüm 1709 (derleme 16299) veya sonraki bir sürümde çalışıyor ve tam MSIX desteğine sahip.

Yerel kodda GetCurrentPackageFullName'ı kullanın

Aşağıdaki kod örneği, bir uygulamanın bağlamını belirlemek için GetCurrentPackageFullName'in nasıl kullanılacağını gösterir.

#define _UNICODE 1
#define UNICODE 1

#include <Windows.h>
#include <appmodel.h>
#include <malloc.h>
#include <stdio.h>

int __cdecl wmain()
{
    UINT32 length = 0;
    LONG rc = GetCurrentPackageFullName(&length, NULL);
    if (rc != ERROR_INSUFFICIENT_BUFFER)
    {
        if (rc == APPMODEL_ERROR_NO_PACKAGE)
            wprintf(L"Process has no package identity\n");
        else
            wprintf(L"Error %d in GetCurrentPackageFullName\n", rc);
        return 1;
    }

    PWSTR fullName = (PWSTR) malloc(length * sizeof(*fullName));
    if (fullName == NULL)
    {
        wprintf(L"Error allocating memory\n");
        return 2;
    }

    rc = GetCurrentPackageFullName(&length, fullName);
    if (rc != ERROR_SUCCESS)
    {
        wprintf(L"Error %d retrieving PackageFullName\n", rc);
        return 3;
    }
    wprintf(L"%s\n", fullName);

    free(fullName);

    return 0;
}

Yönetilen kodda GetCurrentPackageFullName işlevini kullanma

Yönetilen bir .NET Framework uygulamasında GetCurrentPackageFullName'i çağırmak için Platform Çağırma (P/Invoke) veya başka bir birlikte çalışma biçimi kullanmanız gerekir.

Bu işlemi basitleştirmek için DesktopBridgeHelpers kitaplığını kullanabilirsiniz. Bu kitaplık .NET Framework 4 ve üzerini destekler ve uygulamanın tam MSIX özellik kümesini destekleyen bir Windows sürümünde çalışıp çalışmadığını belirleyen bir yardımcı sınıf sağlamak için dahili olarak P/Invoke kullanır. Bu kitaplık nuget paketi olarak da kullanılabilir.

Paketi projenize yükledikten sonra sınıfının yeni bir örneğini DesktopBridge.Helpers oluşturabilir ve yöntemini çağırabilirsiniz IsRunningAsUwp . Uygulamanız, Windows 10 sürüm 1709 (derleme 16299) veya daha yenisinde bir MSIX paketi olarak çalışıyorsa, bu yöntem true döndürür; aksi takdirde false döndürür. Aşağıdaki örnek bu yöntemin nasıl çağrıldığını göstermektedir.

private bool IsRunningAsUwp()
{
   UwpHelpers helpers = new UwpHelpers();
   return helpers.IsRunningAsUwp();
}

private void Form1_Load(object sender, EventArgs e)
{
   if (IsRunningAsUwp())
   {
       txtUwp.Text = "I'm running as MSIX";
   }
   else
   {
       txtUwp.Text = "I'm running as a native desktop app";
   }
}