Partage via


Intégrer les applications non packagées à Windows Share

Cet article explique comment intégrer des applications non packagées à la fonctionnalité Windows Share. La fonctionnalité Share permet aux utilisateurs de partager du contenu d'une application Windows à une autre. Une application non packagée doit être dotée d'une identité de package afin de pouvoir être reconnue comme cible Share. Une fois enregistrée, l'application peut recevoir et traiter des fichiers partagés.

Comment intégrer une application non packagée en tant que cible Share :

  • Fournir à l'application l'identité de package
  • Implémentation du contrat Share

Fournir aux applications non packagées une identité de package

Une application peut obtenir une identité de package de deux manières :

  • Créer un nouveau package d'installation MSIX (méthode préférée) OU
  • Rendre les applications packageés avec un emplacement externe compatible avec l'installateur actuel. Il est recommandé uniquement pour les applications qui ont un programme d’installation existant et qui ne peuvent pas basculer vers l’installation de MSIX.

Créer un nouveau package d'installation MSIX

Il est recommandé de packager l'application avec MSIX en utilisant le modèle Windows Application Packaging Project dans Visual Studio. Cela permettra d'inclure tous les binaires dans le package MSIX et de fournir une expérience d'installation propre et fiable.

Points à retenir avant de procéder au packaging d'une application de bureau : Préparer le package d'une application de bureau (MSIX).

Suivez les étapes de la section Configurer votre application de bureau pour le packaging MSIX dans Visual Studio afin de générer un package pour le projet de votre application existante.

Remarque

Lors de la création du projet de packaging, sélectionnez Windows 10, version 2004 (10.0; Build 19041) ou ultérieure comme version minimale.

Une fois cette étape franchie, vous créerez le package en suivant la procédure Packager une application de bureau ou UWP dans Visual Studio.

Rendre les applications packageés avec un emplacement externe compatible avec l'installateur actuel.

La deuxième façon de donner une identité au package de votre application est d'ajouter un package avec un emplacement externe à votre application et de l'enregistrer avec votre programme d'installation existant. Le package avec emplacement externe est un package MSIX vide qui contient le .appxmanifest ayant l'identité, l'enregistrement de la cible de partage et les ressources visuelles. Les binaires de l'application sont toujours gérés par le programme d'installation existant de l'application. Lors de l'enregistrement du package, vous devez indiquer l'emplacement d'installation de l'application dans l'API. Il est important que l'identité figurant dans le manifeste du package MSIX et dans le manifeste de l'application Win32 soit synchronisée avec le certificat utilisé pour la signature de l'application.

Applications pour accorder l'identité de package à une application non packagée

Vous trouverez ici de la documentation sur la création d'un package avec emplacement externe, y compris des informations sur les modèles à utiliser : Attribuer une identité au package en l'empaquetant avec un emplacement externe.

L'application modèle complète est disponible sur GitHub : SparsePackages (Packagé avec un emplacement externe).

Enregistrer en tant que à Share Target

Une fois que l'application possède une identité de package, l'étape suivante consiste à mettre en œuvre le contrat de partage. Le contrat Share permet à votre application de recevoir des données d'une autre application.

Vous pouvez suivre les mêmes étapes dans la section Enregistrer en tant que cible Share de la documentation pour les applications packagées à intégrer à la feuille Share.

Procédure-à-pas de l'exemple d'application PhotoStore

Dans cette procédure-à-pas-pas sur l'identité de package, l'enregistrement & l'activation de partage pour les applications Win32 non packagées, vous apprendrez comment accorder l'identité de package à une application Win32 non packagée en créant un package avec un emplacement externe. Une fois que l'application dispose d'une identité de package, elle peut être enregistrée et gérer l'activation en tant que cible Share. Vous allez suivre les étapes suivantes en utilisant l'exemple PhotoStoreDemo :

  • Générer le fichier AppxManifest.xml
  • Créer un package
  • Signer le package
  • Enregistrer le package
  • Gérer l’activation d’une application

Commencez par créer le fichier AppxManifest.xml, qui comprend les propriétés nécessaires telles que <AllowExternalContent>, l'identité et les capacités &, l'extension de la cible de partage. Assurez-vous que les valeurs Publisher, PackageName, &, et ApplicationId du fichier AppxManifest.xml correspondent aux valeurs du fichier PhotoStoreDemo.exe.manifest. La valeur Publisher doit également correspondre à la valeur du certificat utilisé pour signer le package. Ajoutez les ressources visuelles nécessaires et référencées dans AppxManifest.xml. Dans Visual Studio, vous pouvez utiliser le nœud Visual Assets lors de l'édition package.manifest dans le projet Application Packaging pour générer les ressources visuelles requises.

Il s'agit d'un exemple d'extrait AppxManifest.xml dont le contenu externe est autorisé :

<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>
        ...

Voici un exemple de fichier 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>

Ensuite, pour créer le package avec emplacement externe, utilisez l'outil /nv avec la commande MakeAppx.exe pour créer un package contenant le fichier AppxManifest.xml.

Exemple :

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

Remarque

Un package avec un emplacement externe contient un manifeste de package, mais aucun autre fichier binaire et contenu d’application. Le manifeste d’un package avec un emplacement externe peut référencer des fichiers extérieurs au package à un emplacement externe prédéterminé.

Signez votre package avec un certificat de confiance en utilisant SignTool.exe.

Exemple :

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

Le certificat utilisé pour signer le package doit être installé dans un emplacement de confiance sur la machine.

Lors de la première exécution de l'application, enregistrez le package avec Windows. Lorsqu'une application possède son propre programme d'installation, celui-ci doit également contenir le fichier MSIX signé en tant que charge utile et doit le placer à un emplacement spécifié (par exemple, l'emplacement d'installation de l'application). Cet emplacement doit être connu de l'application au moment de l'exécution, car l'application aura besoin du chemin absolu de MSIX pour l'enregistrer. Placez également les ressources et resources.pri dans l'emplacement d'installation de l'application.

Le code suivant est un exemple d'exécution sans emballage de la méthode Main de l'application :

[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);
        }
    }
    ...

Cet exemple montre comment enregistrer le MSIX lors de la première exécution de l'application :

[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);
        }
    }
    ...

Enfin, occupez-vous de l'activation de l'application :

[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);
        }
    }

Windows Share avec démonstration d’identité de package

La vidéo suivante montre comment une application non packagée peut devenir une cible de partage après avoir reçu l'identité du package et s'être enregistrée en tant que cible de partage :

Voir aussi