Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Возможно, у вас есть некоторые версии приложения, которые не были распределены в пакете MSIX. Во время выполнения приложение может определить, был ли он развернут в виде пакета MSIX с помощью API диспетчера пакетов Windows или собственного пользовательского установщика. Возможно, вы хотите изменить поведение приложения, например параметры обновления, или вы можете воспользоваться преимуществами функциональных возможностей, доступных только для пакетов MSIX.
Чтобы определить, работает ли приложение в качестве пакета MSIX в версии Windows, поддерживающей полный набор компонентов MSIX, можно использовать встроенную функцию GetCurrentPackageFullName в kernel32.dll. Если настольное приложение выполняется как распакованное приложение без удостоверения пакета, эта функция возвращает ошибку, которая поможет определить контекст, в котором выполняется приложение.
Если функция выполнена успешно, это означает:
- Приложение упаковается в пакет MSIX.
- Ваше приложение работает в Windows 10 версии 1709 (сборка 16299) или более поздней версии с полной поддержкой MSIX.
Используйте GetCurrentPackageFullName в родном коде
В следующем примере кода показано, как использовать GetCurrentPackageFullName для определения контекста приложения.
#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 в управляемом коде
Чтобы вызвать GetCurrentPackageFullName в управляемом приложении .NET Framework, необходимо использовать platform Invoke (P/Invoke) или другую форму взаимодействия.
Чтобы упростить этот процесс, можно использовать библиотеку DesktopBridgeHelpers . Эта библиотека поддерживает .NET Framework 4 и более поздних версий, и она использует P/Invoke внутренне для предоставления вспомогательного класса, который определяет, работает ли приложение в версии Windows, поддерживающей полный набор функций MSIX. Эта библиотека также доступна как пакет NuGet.
После установки пакета в проекте можно создать новый экземпляр DesktopBridge.Helpers класса и вызвать IsRunningAsUwp метод. Этот метод возвращает значение true, если ваше приложение запущено как пакет MSIX на Windows 10 версии 1709 (сборка 16299) или более поздней версии, и false, если любое из этих условий не выполнено. В следующем примере показано, как вызвать этот метод.
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";
}
}