Mendeteksi identitas paket dan konteks runtime

Anda mungkin memiliki beberapa versi aplikasi yang tidak didistribusikan dalam paket MSIX. Pada runtime aplikasi Anda dapat mendeteksi apakah aplikasi disebarkan sebagai paket MSIX dengan menggunakan API Pengelola Paket Windows, atau alat penginstal kustom Anda sendiri. Anda mungkin ingin mengubah perilaku aplikasi seperti pengaturan pembaruan atau Anda mungkin ingin memanfaatkan fungsionalitas yang hanya tersedia untuk paket MSIX.

Untuk menentukan apakah aplikasi Anda berjalan sebagai paket MSIX pada versi Windows yang mendukung set fitur MSIX lengkap, Anda dapat menggunakan fungsi asli GetCurrentPackageFullName di kernel32.dll. Ketika aplikasi desktop berjalan sebagai aplikasi yang tidak dikemas tanpa identitas paket, fungsi ini mengembalikan kesalahan yang dapat membantu Anda menyimpulkan konteks tempat aplikasi berjalan.

Jika fungsi berhasil, itu berarti:

  • Aplikasi Anda dipaketkan dalam paket MSIX.
  • Aplikasi Anda berjalan di Windows 10, versi 1709 (build 16299) atau yang lebih baru dengan dukungan MSIX penuh.

Menggunakan GetCurrentPackageFullName dalam kode asli

Contoh kode berikut menunjukkan cara menggunakan GetCurrentPackageFullName untuk menentukan konteks aplikasi.

#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;
}

Menggunakan fungsi GetCurrentPackageFullName dalam kode terkelola

Untuk memanggil GetCurrentPackageFullName di aplikasi .NET Framework terkelola, Anda harus menggunakan Platform Invoke (P/Invoke) atau beberapa bentuk interop lainnya.

Untuk menyederhanakan proses ini, Anda dapat menggunakan pustaka DesktopBridgeHelpers . Pustaka ini mendukung .NET Framework 4 dan yang lebih baru, dan menggunakan P/Invoke secara internal untuk menyediakan kelas pembantu yang menentukan apakah aplikasi berjalan pada versi Windows yang mendukung set fitur MSIX lengkap. Pustaka ini juga tersedia sebagai Paket NuGet.

Setelah menginstal paket di proyek, Anda dapat membuat instans DesktopBridge.Helpers baru kelas dan memanggil IsRunningAsUwp metode . Metode ini mengembalikan true jika aplikasi Anda berjalan sebagai paket MSIX pada Windows 10, versi 1709 (build 16299) atau yang lebih baru dan salah jika salah satunya tidak benar. Sampel berikut menunjukkan cara memanggil metode ini.

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";
   }
}