Detectar a identidade do pacote e o contexto do runtime
Você poderá ter algumas versões do aplicativo que não foram distribuídas em um pacote MSIX. Em runtime, o aplicativo pode detectar se foi implantado como um pacote MSIX usando a API do Gerenciador de Pacotes do Windows ou o próprio instalador personalizado. O ideal é alterar o comportamento do aplicativo, como as configurações de atualização, ou aproveitar a funcionalidade disponível somente para pacotes MSIX.
Para determinar se o seu aplicativo está sendo executado como um pacote MSIX em uma versão do Windows que dê suporte ao conjunto completo de recursos do MSIX, use a função nativa GetCurrentPackageFullName na kernel32.dll. Quando um aplicativo da área de trabalho está sendo executado como um aplicativo não empacotado sem a identidade do pacote, essa função retorna um erro que pode ajudar você a inferir o contexto no qual o aplicativo está sendo executado.
Se a função for bem-sucedida, isso indicará que:
- O aplicativo está empacotado em um pacote MSIX.
- O aplicativo está em execução no Windows 10, versão 1709 (build 16299) ou posterior com suporte completo a MSIX.
Usar GetCurrentPackageFullName no código nativo
O exemplo de código a seguir demonstra como usar GetCurrentPackageFullName para determinar o contexto de um aplicativo.
#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;
}
Usar a função GetCurrentPackageFullName no código gerenciado
Para chamar GetCurrentPackageFullName em um aplicativo .NET Framework gerenciado, você precisará usar P/Invoke (invocação de plataforma) ou alguma outra forma de interoperabilidade.
Para simplificar esse processo, use a biblioteca DesktopBridgeHelpers. Esta biblioteca dá suporte ao .NET Framework 4 e posterior e usa P/Invoke internamente para fornecer uma classe auxiliar que determina se o aplicativo está sendo executado em uma versão do Windows que dá suporte ao conjunto completo de recursos MSIX. Essa biblioteca também está disponível como um pacote NuGet.
Depois de instalar o pacote no projeto, crie uma instância da classe DesktopBridge.Helpers
e chame o método IsRunningAsUwp
. Esse método retornará true se o aplicativo estiver sendo executado como um pacote MSIX no Windows 10, versão 1709 (build 16299) ou posterior e false se um desses requisitos não for true. A amostra a seguir descreve como chamar esse método.
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";
}
}