Rilevare identità del pacchetto e contesto di runtimeDetect package identity and runtime context

È possibile che alcune versioni della tua app non siano state distribuite in un pacchetto MSIX.You may have some versions of your app that were not distributed in an MSIX package. In fase di esecuzione l'app può rilevare se è stata distribuita come pacchetto MSIX usando l'API Windows Package Manager o il programma di installazione personalizzato.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. Potresti avere la necessità di modificare il comportamento dell'app, ad esempio le impostazioni di aggiornamento, o di sfruttare le funzionalità disponibili solo per i pacchetti 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.

Per determinare se l'applicazione è in esecuzione come pacchetto MSIX in una versione di Windows che supporta il set completo di funzionalità MSIX, puoi usare la funzione nativa GetCurrentPackageFullName in 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. Quando un'applicazione desktop è in esecuzione non in pacchetto senza un'identità del pacchetto, questa funzione restituisce un errore che può aiutarti a dedurre il contesto in cui l'app viene eseguita.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.

Se la funzione ha esito positivo, significa che:If the function succeeds, it means:

  • L'app è inclusa in un pacchetto MSIX.Your app is packaged in an MSIX package.
  • L'app è in esecuzione in Windows 10, versione 1709 (build 16299) o versioni successive, con supporto MSIX completo.Your app is running on Windows 10, version 1709 (build 16299) or later with full MSIX support.

Usare GetCurrentPackageFullName in codice nativoUse GetCurrentPackageFullName in native code

L'esempio di codice seguente illustra come usare GetCurrentPackageFullName per determinare il contesto di un'app.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;
}

Usare la funzione GetCurrentPackageFullName in codice gestitoUse GetCurrentPackageFullName function in managed code

Per chiamare GetCurrentPackageFullName in un'app .NET Framework gestita, dovrai usare Platform Invoke (P/Invoke) o qualche altro tipo di interoperabilità.To call GetCurrentPackageFullName in a managed .NET Framework app, you'll need to use Platform Invoke (P/Invoke) or some other form of interop.

Per semplificare il processo, puoi usare la libreria DesktopBridgeHelpers.To simplify this process, you can use the DesktopBridgeHelpers library. Questa libreria supporta .NET Framework 4 e versioni successive e usa P/Invoke internamente per fornire una classe helper che possa determinare se l'app è in esecuzione in una versione di Windows che supporta il set completo di funzionalità 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. La libreria è disponibile anche come pacchetto NuGet.This library is also available as a NuGet Package.

Dopo aver installato il pacchetto nel progetto, puoi creare una nuova istanza della classe DesktopBridge.Helpers e chiamare il metodo 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. Questo metodo restituisce true se l'app è in esecuzione come pacchetto MSIX in Windows 10, versione 1709 (build 16299) o versioni successive, e false in caso contrario.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. L'esempio seguente illustra come chiamare questo metodo.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";
   }
}