Partilhar via


Detetar a identidade do pacote e o contexto do tempo de execução

Você pode ter algumas versões do seu aplicativo que não foram distribuídas em um pacote MSIX. No tempo de execução, seu aplicativo pode detetar se foi implantado como um pacote MSIX usando a API do Gerenciador de Pacotes do Windows ou seu próprio instalador personalizado. Você pode querer alterar o comportamento do aplicativo, como configurações de atualização, ou aproveitar a funcionalidade disponível apenas para pacotes MSIX.

Para determinar se seu aplicativo está sendo executado como um pacote MSIX em uma versão do Windows que ofereça 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á sendo executado 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á sendo executado.

Se a função for bem-sucedida, isso significa:

  • Seu aplicativo é empacotado em um pacote MSIX.
  • Seu aplicativo está sendo executado no Windows 10, versão 1709 (compilação 16299) ou posterior com suporte total para 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;
}

Use a função GetCurrentPackageFullName no código gerenciado

Para chamar GetCurrentPackageFullName em um aplicativo .NET Framework gerenciado, você precisará usar Platform Invoke (P/Invoke) ou alguma outra forma de interoperabilidade.

Para simplificar esse processo, você pode usar a biblioteca DesktopBridgeHelpers . Esta biblioteca suporta o .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 suporta o conjunto de recursos MSIX completo. Esta 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 retorna true se seu aplicativo estiver sendo executado como um pacote MSIX no Windows 10, versão 1709 (compilação 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";
   }
}