パッケージ ID とランタイム コンテキストの検出Detect package identity and runtime context

アプリのバージョンによっては、MSIX パッケージで配布されなかったものもあります。You may have some versions of your app that were not distributed in an MSIX package. 実行時に、アプリは、そのアプリ自体が Windows パッケージ マネージャー API または独自のカスタム インストーラーを使用して MSIX パッケージとして展開されているかどうかを検出できます。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. 更新設定などのアプリの動作を変更したい場合や、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.

MSIX の完全な機能セットをサポートするバージョンの Windows で、アプリケーションが MSIX パッケージとして実行されているかどうかを確認するには、kernel32.dll の GetCurrentPackageFullName ネイティブ関数を使用できます。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. デスクトップ アプリケーションがパッケージ ID を持たないパッケージ化されていないアプリケーションとして実行されている場合、この関数はエラーを返します。これは、アプリが実行されているコンテキストを推測するのに役立ちます。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.

関数が成功した場合、次のことを意味します。If the function succeeds, it means:

  • アプリは MSIX パッケージにパッケージ化されている。Your app is packaged in an MSIX package.
  • アプリは、MSIX を完全サポートしている Windows 10 バージョン 1709 (ビルド 16299) 以降で実行されている。Your app is running on Windows 10, version 1709 (build 16299) or later with full MSIX support.

ネイティブ コードで GetCurrentPackageFullName を使用するUse GetCurrentPackageFullName in native code

次のコード例は、GetCurrentPackageFullName を使用してアプリのコンテキストを判別する方法を示しています。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;
}

マネージド コードで GetCurrentPackageFullName 関数を使用するUse GetCurrentPackageFullName function in managed code

マネージド .NET Framework アプリで GetCurrentPackageFullName を呼び出すには、プラットフォーム呼び出し (P/Invoke) またその他の形式の相互運用を使用する必要があります。To call GetCurrentPackageFullName in a managed .NET Framework app, you'll need to use Platform Invoke (P/Invoke) or some other form of interop.

このプロセスを簡略化するために、DesktopBridgeHelpers ライブラリを使用できます。To simplify this process, you can use the DesktopBridgeHelpers library. このライブラリは .NET Framework 4 以降をサポートしており、内部で P/Invoke を使用して、完全な MSIX 機能セットをサポートするバージョンの Windows でアプリが実行されているかどうかを判別するヘルパー クラスを提供します。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. このライブラリは NuGet パッケージとしても利用できます。This library is also available as a NuGet Package.

プロジェクトにパッケージをインストールした後、DesktopBridge.Helpers クラスの新しいインスタンスを作成し、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. このメソッドは、アプリが Windows 10 バージョン 1709 (ビルド 16299) 以降で MSIX パッケージとして実行されている場合は true を返し、それらの条件のどちらかが true でない場合は false を返します。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. 次の例は、このメソッドを呼び出す方法を示しています。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";
   }
}