Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Você pode ter algumas versões do seu aplicativo que não foram distribuídas em um pacote MSIX. Em runtime, seu aplicativo pode detectar se ele foi implantado como um pacote MSIX usando a API do Gerenciador de Pacotes do Windows ou seu próprio instalador personalizado. Talvez você queira alterar o comportamento do aplicativo, como configurações de atualização ou pode querer aproveitar a funcionalidade disponível apenas para pacotes MSIX.
Para determinar se seu aplicativo está em execução como um pacote MSIX em uma versão do Windows que dá suporte ao conjunto de recursos MSIX completo, você pode usar a função nativa GetCurrentPackageFullName no kernel32.dll. Quando um aplicativo da área de trabalho está em execução como um aplicativo não empacotado sem identidade de pacote, essa função retorna um erro que pode ajudá-lo a inferir o contexto no qual o aplicativo está em execução.
Se a função for bem-sucedida, isso significa:
- Seu aplicativo é empacotado em um pacote MSIX.
- Seu aplicativo está em execução no Windows 10, versão 1709 (build 16299) ou posterior com suporte completo do 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 gerenciado do .NET Framework, você precisará usar a Invocação de Plataforma (P/Invoke) ou alguma outra forma de interoperabilidade.
Para simplificar esse processo, você pode usar a biblioteca DesktopBridgeHelpers . Essa 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á em execução em uma versão do Windows que dá suporte ao conjunto de recursos MSIX completo. Essa biblioteca também está disponível como um Pacote NuGet.
Depois de instalar o pacote em seu projeto, você pode criar uma nova instância da DesktopBridge.Helpers classe e chamar o IsRunningAsUwp método. Esse método retornará true se o aplicativo estiver em execução como um pacote MSIX no Windows 10, versão 1709 (build 16299) ou posterior e false se qualquer um deles não for verdadeiro. O exemplo a seguir demonstra 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";
}
}