パッケージ ID とランタイム コンテキストの検出

アプリのバージョンによっては、MSIX パッケージで配布されなかったものもあります。 実行時に、アプリは、そのアプリ自体が Windows パッケージ マネージャー API または独自のカスタム インストーラーを使用して MSIX パッケージとして展開されているかどうかを検出できます。 更新設定などのアプリの動作を変更したい場合や、MSIX パッケージでのみ使用できる機能を利用したい場合があります。

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

関数が成功した場合、次のことを意味します。

  • アプリは MSIX パッケージにパッケージ化されている。
  • アプリは、MSIX を完全サポートしている Windows 10 バージョン 1709 (ビルド 16299) 以降で実行されている。

ネイティブ コードで GetCurrentPackageFullName を使用する

次のコード例は、GetCurrentPackageFullName を使用してアプリのコンテキストを判別する方法を示しています。

#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 関数を使用する

マネージド .NET Framework アプリで GetCurrentPackageFullName を呼び出すには、プラットフォーム呼び出し (P/Invoke) またその他の形式の相互運用を使用する必要があります。

このプロセスを簡略化するために、DesktopBridgeHelpers ライブラリを使用できます。 このライブラリは .NET Framework 4 以降をサポートしており、内部で P/Invoke を使用して、完全な MSIX 機能セットをサポートするバージョンの Windows でアプリが実行されているかどうかを判別するヘルパー クラスを提供します。 このライブラリは NuGet パッケージとしても利用できます。

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

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";
   }
}