Detectar la identidad del paquete y el contexto en tiempo de ejecuciónDetect package identity and runtime context

Puede que tengas algunas versiones de la aplicación que no se distribuyeron en un paquete MSIX.You may have some versions of your app that were not distributed in an MSIX package. En tiempo de ejecución, la aplicación puede detectar si se implementó como paquete MSIX mediante la API del Administrador de paquetes de Windows o tu propio instalador personalizado.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. Puede que quieras cambiar el comportamiento de la aplicación, como la configuración de actualización, o aprovechar las ventajas de una funcionalidad que solo está disponible para los paquetes 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.

Para determinar si la aplicación se ejecuta como un paquete MSIX en una versión de Windows que admite el conjunto completo de características de MSIX, puedes usar la función nativa GetCurrentPackageFullName en 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. Cuando una aplicación de escritorio se ejecuta como una aplicación no empaquetada sin identidad de paquete, esta función devuelve un error que puede ayudarte a deducir el contexto en el que se ejecuta la aplicación.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.

Si la función se realiza correctamente, significa que:If the function succeeds, it means:

  • La aplicación está empaquetada en un paquete MSIX.Your app is packaged in an MSIX package.
  • La aplicación se ejecuta en Windows 10, versión 1709 (compilación 16299) o posterior con compatibilidad completa con MSIX.Your app is running on Windows 10, version 1709 (build 16299) or later with full MSIX support.

Uso de GetCurrentPackageFullName en código nativoUse GetCurrentPackageFullName in native code

En el ejemplo de código siguiente se muestra cómo usar GetCurrentPackageFullName para determinar el contexto de una aplicación.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;
}

Uso de la función GetCurrentPackageFullName en código administradoUse GetCurrentPackageFullName function in managed code

Para llamar a GetCurrentPackageFullName en una aplicación de .NET Framework administrada, tienes que usar Invocación de plataforma (P/Invoke) o alguna otra forma de interoperabilidad.To call GetCurrentPackageFullName in a managed .NET Framework app, you'll need to use Platform Invoke (P/Invoke) or some other form of interop.

Para simplificar este proceso, puedes usar la biblioteca DesktopBridgeHelpers.To simplify this process, you can use the DesktopBridgeHelpers library. Esta biblioteca admite .NET Framework 4 y versiones posteriores, y usa internamente P/Invoke para proporcionar una clase auxiliar que determina si la aplicación se ejecuta en una versión de Windows que admite el conjunto completo de características de 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. Esta biblioteca también está disponible como paquete NuGet.This library is also available as a NuGet Package.

Después de instalar el paquete en el proyecto, puedes crear una nueva instancia de la clase DesktopBridge.Helpers y llamar al método 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. Este método devuelve true si la aplicación se ejecuta como un paquete MSIX en Windows 10, versión 1709 (compilación 16299) o posterior, y false si alguno de estos datos no es cierto.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. En el ejemplo siguiente se muestra cómo llamar a este método.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";
   }
}