Определение идентификатора пакета и контекста среды выполненияDetect package identity and runtime context

Возможно, у вас есть некоторые версии приложения, которые не были распространены в MSIX-пакете.You may have some versions of your app that were not distributed in an MSIX package. Во время выполнения приложение можно определить, было ли оно развернуто как пакет MSIX с помощью API диспетчера пакетов Windows или собственного пользовательского установщика.At runtime your app can detect whether it was deployed as an MSIX package by using the Windows Package Manager API, or your own custom installer. Вам может потребоваться изменить поведение приложения, например параметры обновления, или воспользоваться преимуществами функций, доступных только для пакетов MSIX.You may want to change the app behavior such as update settings or you may want to take advantage of functionality only available to MSIX packages.

Чтобы определить, запущено ли ваше приложение в виде MSIX-пакета на версии Windows, поддерживающей полный набор возможностей MSIX, можно использовать собственную функцию GetCurrentPackageFullName в kernel32.dll.To determine whether your application is running as an MSIX package on a version of Windows that supports the full MSIX feature set, you can use the GetCurrentPackageFullName native function in kernel32.dll. Если классическое приложение выполняется как неупакованное приложение без удостоверения пакета, эта функция возвращает ошибку, которая может помочь определить контекст, в котором выполняется приложение.When a desktop application is running as a non-packaged application without package identity, this function returns an error which can help you infer the context in which the app is running.

Если функция выполнена, это означает:If the function succeeds, it means:

  • Приложение упаковывается в пакет MSIX.Your app is packaged in an MSIX package.
  • Ваше приложение работает в Windows 10, версии 1709 (сборка 16299) или более поздней версии с полной поддержкой MSIX.Your app is running on Windows 10, version 1709 (build 16299) or later with full MSIX support.

Использование GetCurrentPackageFullName в машинном кодеUse GetCurrentPackageFullName in native code

В следующем примере кода показано, как использовать GetCurrentPackageFullName для определения контекста приложения.The following code example demonstrates how to use GetCurrentPackageFullName to determine the context of an app.

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

Использование функции GetCurrentPackageFullName в управляемом кодеUse GetCurrentPackageFullName function in managed code

Чтобы вызвать GetCurrentPackageFullName в управляемом приложении .NET Framework, необходимо использовать Вызов неуправляемого кода (P/Invoke) или другую форму взаимодействия.To call GetCurrentPackageFullName in a managed .NET Framework app, you'll need to use Platform Invoke (P/Invoke) or some other form of interop.

Чтобы упростить этот процесс, можно использовать библиотеку DesktopBridgeHelpers.To simplify this process, you can use the DesktopBridgeHelpers library. Эта библиотека поддерживает .NET Framework 4 и более поздних версий и использует P/Invoke внутри для предоставления вспомогательного класса, который определяет, выполняется ли приложение в версии Windows, поддерживающей полный набор функций MSIX.This library supports .NET Framework 4 and later, and it uses P/Invoke internally to provide a helper class that determines whether the app is running on a version of Windows that supports the full MSIX feature set. Эта библиотека также доступна в качестве пакета NuGet.This library is also available as a NuGet Package.

После установки пакета в проекте можно создать новый экземпляр класса DesktopBridge.Helpers и вызвать метод IsRunningAsUwp.After you install the package in your project, you can create a new instance of the DesktopBridge.Helpers class and call the IsRunningAsUwp method. Этот метод возвращает значение true, если приложение выполняется как пакет MSIX в Windows 10, версии 1709 (сборка 16299) или более поздней, и false, если это не так.This method returns true if your app is running as an MSIX package on Windows 10, version 1709 (build 16299) or later and false if either of those are not true. В следующем примере показан вызов этого метода.The following sample demonstrates how to call this method.

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