次の方法で共有


パッケージ化されていないアプリを Windows Share と統合する

この記事では、パッケージ化されていないアプリを Windows Share 機能と統合する方法について説明します。 Share 機能を使用すると、ユーザーは Windows アプリ間でコンテンツを共有できます。 パッケージ化されていないアプリには、パッケージ ID があり、これにより、共有対象として登録できます。 登録されると、アプリは共有ファイルを受信して処理できます。

パッケージ化されていないアプリを共有対象としてオンボードする方法:

  • アプリでパッケージ ID を指定する
  • Share コントラクトを実装する

パッケージ化されていないアプリにパッケージ ID を指定する

アプリは、次の 2 つの方法でパッケージ ID を取得できます。

  • 新しい MSIX インストール パッケージを作成する (推奨される方法) または
  • 外部の場所でパッケージ化されたアプリを現在のインストーラーと互換性のあるものにします。 これは、既存のインストーラーがあり、MSIX インストールに切り替えることができないアプリにのみ推奨されます。

新しい MSIX インストール パッケージを作成する

Visual Studio の Windows Application Packaging Project テンプレートを使用して、MSIX でアプリをパッケージ化することをお勧めします。 これには、MSIX パッケージ内のすべてのバイナリが含まれており、明瞭で信頼できるインストール エクスペリエンスが提供されます。

デスクトップ アプリをパッケージ化する前の注意事項: デスクトップ アプリケーション (MSIX) のパッケージ化の準備をします

「Visual Studio で MSIX パッケージ用のデスクトップ アプリケーションを設定する」の手順に従って、既存のアプリ プロジェクトのパッケージを生成します。

Note

パッケージ プロジェクトを作成するときに、Windows 10、バージョン 2004 (10.0; Build 19041) 以降を最小バージョンとして選択します。

これが完了したら、Visual Studio の [デスクトップまたは UWP アプリのパッケージ] に従 ってパッケージを作成します。

外部の場所のパッケージを現在のインストーラーと互換性のあるものにします。

アプリ パッケージ ID を付与する 2 つ目の方法は、外部の場所を持つパッケージをアプリケーションに追加し、既存のインストーラーに登録することです。 外部の場所を持つパッケージは、ID、共有対象登録、およびビジュアル資産を持つ .appxmanifest を含む空の MSIX パッケージです。 アプリのバイナリは、アプリの既存のインストーラーによって引き続き管理されます。 パッケージを登録するときは、API でアプリのインストール場所を指定する必要があります。 MSIX パッケージ マニフェストと Win32 アプリ マニフェストの ID は、アプリの署名に使用される認定資格証と同期しておくことが重要です。

パッケージ化されていないアプリにパッケージ ID を付与する手順

外部の場所でパッケージを作成する方法に関するドキュメントを参照してください。これには、使用するテンプレートに関する情報を含みます。外部の場所を使用してパッケージ化し、パッケージ ID を付与します

完全なサンプル アプリは、GitHub: SparsePackages (外部の場所とでパッケージ化) で入手できます。

共有対象として登録する

アプリにパッケージ ID が設定されたら、次の手順で Share コントラクトを実装します。 Share コントラクトを使用すると、アプリは別のアプリからデータを受信できます。

パッケージ アプリを Share Sheet と統合するためのドキュメントの「共有対象として登録する」セクションと同じ手順に従うことができます。

サンプル PhotoStore アプリのチュートリアル

パッケージ ID、登録、およびパッケージ化されていない Win32 アプリケーションの & Share のアクティブ化に関するこのチュートリアルでは外部の場所を持つパッケージを作成することで、パッケージ化されていない Win32 アプリケーションにパッケージ ID を付与する方法について説明します。 アプリがパッケージ ID を取得したら、アクティブ化を共有対象として登録して処理できます。 PhotoStoreDemo サンプルを使用して、次の手順を実行します。

  • AppxManifest.xml ファイルを生成する
  • パッケージを作成する
  • パッケージに署名する
  • パッケージを登録する
  • アプリのアクティブ化の処理

まず、<AllowExternalContent>、ID、機能、& 共有対象拡張機能などの必要なプロパティを含む AppxManifest.xml ファイルを作成します。 AppxManifest.xml ファイルの PublisherPackageName & ApplicationId 値が、PhotoStoreDemo.exe.manifest ファイルの値と一致することを確認します。 Publisher 値は、パッケージに再任する際に使用する認定資格証の値とも一致する必要があります。 必要に応じてビジュアルアセットを追加し、AppxManifest.xml で参照します。 Visual Studio では、アプリケーション パッケージ プロジェクトで package.manifest 編集するときに [Visual Assets] ノードを使用して、必要なビジュアル アセットを生成できます。

これは、外部コンテンツが許可されているサンプル AppxManifest.xml スニペットです。

<Identity Name="PhotoStoreDemo" ProcessorArchitecture="neutral" Publisher="CN=YourPubNameHere" Version="1.0.0.0" />
  <Properties>
    <DisplayName>PhotoStoreDemo</DisplayName>
    <PublisherDisplayName>Sparse Package</PublisherDisplayName>
    <Logo>Assets\storelogo.png</Logo>
    <uap10:AllowExternalContent>true</uap10:AllowExternalContent>
  </Properties>
  <Resources>
    <Resource Language="en-us" />
  </Resources>
  <Dependencies>
    <TargetDeviceFamily Name="Windows.Desktop" MinVersion="10.0.19041.0" MaxVersionTested="10.0.19041.0" />
  </Dependencies>
  <Capabilities>
    <rescap:Capability Name="runFullTrust" />
    <rescap:Capability Name="unvirtualizedResources"/>
  </Capabilities>
  <Applications>
    <Application Id="PhotoStoreDemo" Executable="PhotoStoreDemo.exe" uap10:TrustLevel="mediumIL" uap10:RuntimeBehavior="win32App">
      <uap:VisualElements AppListEntry="none" DisplayName="PhotoStoreDemo" Description="PhotoStoreDemo" BackgroundColor="transparent" Square150x150Logo="Assets\Square150x150Logo.png" Square44x44Logo="Assets\Square44x44Logo.png">
        <uap:DefaultTile Wide310x150Logo="Assets\Wide310x150Logo.png" Square310x310Logo="Assets\LargeTile.png" Square71x71Logo="Assets\SmallTile.png"></uap:DefaultTile>
        <uap:SplashScreen Image="Assets\SplashScreen.png" />
      </uap:VisualElements>
      <Extensions>
        <uap:Extension Category="windows.shareTarget">
          <uap:ShareTarget Description="Send to PhotoStoreDemo">
            <uap:SupportedFileTypes>
              <uap:FileType>.jpg</uap:FileType>
              <uap:FileType>.png</uap:FileType>
              <uap:FileType>.gif</uap:FileType>
            </uap:SupportedFileTypes>
            <uap:DataFormat>StorageItems</uap:DataFormat>
            <uap:DataFormat>Bitmap</uap:DataFormat>
          </uap:ShareTarget>
        </uap:Extension>
        ...

これは、Application.exe.manifest ファイルのサンプルです。

<?xml version="1.0" encoding="utf-8"?>
<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1">
  <assemblyIdentity version="1.0.0.0" name="PhotoStoreDemo.app"/>
  <msix xmlns="urn:schemas-microsoft-com:msix.v1"
          publisher="CN=YourPubNameHere"
          packageName="PhotoStoreDemo"
          applicationId="PhotoStoreDemo"
        />
</assembly>

次に、外部の場所でパッケージを作成するには、MakeAppx.exe ツールと /nv コマンドを使用して、AppxManifest.xml ファイルを含むパッケージを作成します。

例:

MakeAppx.exe pack /d <Path to directory with AppxManifest.xml> /p <Output Path>\mypackage.msix /nv

Note

"外部の場所のパッケージ" にはパッケージ マニフェストが含まれていますが、他のアプリ バイナリやコンテンツは含まれていません。 外部の場所のパッケージのマニフェストでは、事前に定義された外部の場所で、パッケージ外部のファイルを参照できます。

SignTool.exe を使用して信頼された認定資格証でパッケージに署名します。

例:

SignTool.exe sign /fd SHA256 /a /f <path to cert>  /p <cert key> <Path to Package>​

パッケージの署名に使用する認定資格証は、マシン上の信頼できる場所にインストールする必要があります。

アプリケーションの初回実行時に、パッケージを Windows に登録します。 アプリに独自のインストーラーがある場合は、ペイロードとして署名済みの MSIX も含める必要があり、指定した場所 (アプリのインストール場所など) に配置する必要があります。 アプリを登録するには MSIX の絶対パスが必要になるため、実行時にこの場所をアプリに通知する必要があります。 アプリのインストール場所にもアセットと resources.pri を配置します。

次のコードは、アプリの Main メソッドのパッケージ化されていない実行例です。

[STAThread]
public static void Main(string[] cmdArgs)
{
    //if app isn't running with identity, register its package with external identity
    if (!ExecutionMode.IsRunningWithIdentity())
    {
        //TODO - update the value of externalLocation to match the output location of your VS Build binaries and the value of 
        //externalPkgPath to match the path to your signed package with external identity (.msix). 
        //Note that these values cannot be relative paths and must be complete paths
        string externalLocation = Environment.CurrentDirectory;
        string externalPkgPath = externalLocation + @"\PhotoStoreDemo.package.msix";

        //Attempt registration
        bool bPackageRegistered = false;
        //bPackageRegistered = registerPackageWithExternalLocation(externalLocation, externalPkgPath);
        if (bPackageRegistered)
        {
            //Registration succeeded, restart the app to run with identity
            System.Diagnostics.Process.Start(Application.ResourceAssembly.Location, arguments: cmdArgs?.ToString());
        }
        else //Registration failed, run without identity
        {
            Debug.WriteLine("Package Registration failed, running WITHOUT Identity");
            SingleInstanceManager wrapper = new SingleInstanceManager();
            wrapper.Run(cmdArgs);
        }
    }
    ...

この例では、アプリの初回実行時に MSIX を登録する方法を示します。

[STAThread]
public static void Main(string[] cmdArgs)
{
    //If app isn't running with identity, register its package with external identity
    if (!ExecutionMode.IsRunningWithIdentity())
    {
        //TODO - update the value of externalLocation to match the output location of your VS Build binaries and the value of 
        //externalPkgPath to match the path to your signed package with external identity (.msix). 
        //Note that these values cannot be relative paths and must be complete paths
        string externalLocation = Environment.CurrentDirectory;
        string externalPkgPath = externalLocation + @"\PhotoStoreDemo.package.msix";

        //Attempt registration
        if (registerPackageWithExternalLocation(externalLocation, externalPkgPath))
        {
            //Registration succeeded, restart the app to run with identity
            System.Diagnostics.Process.Start(Application.ResourceAssembly.Location, arguments: cmdArgs?.ToString());
        }
        else //Registration failed, run without identity
        {
            Debug.WriteLine("Package Registration failed, running WITHOUT Identity");
            SingleInstanceManager wrapper = new SingleInstanceManager();
            wrapper.Run(cmdArgs);
        }
    }
    ...

最後に、アプリのアクティブ化を処理します。

[STAThread]
public static void Main(string[] cmdArgs)
{
    //if app isn't running with identity, register its sparse package
    if (!ExecutionMode.IsRunningWithIdentity())
    {
        ...
    }
    else //App is registered and running with identity, handle launch and activation
    {
        //Handle Sparse Package based activation e.g Share target activation or clicking on a Tile
        // Launching the .exe directly will have activationArgs == null
        var activationArgs = AppInstance.GetActivatedEventArgs();
        if (activationArgs != null)
        {
            switch (activationArgs.Kind)
            {
                case ActivationKind.Launch:
                    HandleLaunch(activationArgs as LaunchActivatedEventArgs);
                    break;
                case ActivationKind.ToastNotification:
                    HandleToastNotification(activationArgs as ToastNotificationActivatedEventArgs);
                    break;
                case ActivationKind.ShareTarget: // Handle the activation as a share target
                    HandleShareAsync(activationArgs as ShareTargetActivatedEventArgs);
                    break;
                default:
                    HandleLaunch(null);
                    break;
            }

        }
        //This is a direct exe based launch e.g. double click app .exe or desktop shortcut pointing to .exe
        else
        {
            SingleInstanceManager singleInstanceManager = new SingleInstanceManager();
            singleInstanceManager.Run(cmdArgs);
        }
    }

パッケージ ID を使用した Windows Share のデモ

次のビデオでは、パッケージ ID が付与され、共有対象トとして登録された後に、パッケージ化されていないアプリを共有対象にする方法を示します。

関連項目