Condividi tramite


Integrare app non in pacchetto con Windows Share

In questo articolo viene illustrato come integrare le app con la funzionalità Windows Share. La funzionalità Share consente agli utenti di condividere contenuti da un'app Windows a un'altra. Un'app non in pacchetto deve essere dotata di un'identità del pacchetto per potersi registrare come destinazione della condivisione. Una volta registrata, l'app può ricevere ed elaborare i file condivisi.

Come eseguire l'onboarding di un'app non in pacchetto come destinazione di condivisione:

  • Dotare l'app di un'identità del pacchetto
  • Implementare il contratto di Share

Dotare le app non in pacchetto dell'identità del pacchetto

Un'app può ricevere l'identità del pacchetto in due modi:

  • Creando un nuovo pacchetto di installazione MSIX (metodo preferito) OPPURE
  • Rendendo le app in pacchetto con un percorso esterno compatibili con il programma di installazione corrente. Questa opzione è consigliata solo per le app con un programma di installazione esistente e che non possono passare all'installazione MSIX.

Creare un nuovo pacchetto di installazione MSIX

È consigliabile creare un pacchetto dell'app con MSIX usando il modello Progetto di creazione pacchetti per applicazioni Windows in Visual Studio. Questo modello includerà tutti i file binari nel pacchetto MSIX e offrirà un'esperienza di installazione pulita e affidabile.

Aspetti da considerare prima di creare pacchetti di app desktop: prepararsi a creare un pacchetto di un'applicazione desktop (MSIX).

Attenersi alla procedura descritta in Configurare l'applicazione desktop per la creazione di un pacchetto MSIX in Visual Studio per generare un pacchetto per il progetto dell'app esistente.

Nota

Quando si crea il progetto di creazione del pacchetto, selezionare Windows 10, versione 2004 (10.0; Build 19041) o successive come Versione minima.

Al termine, creerai il pacchetto seguendo Creare il pacchetto di un'app desktop o UWP in Visual Studio.

Rendere la creazione di pacchetti con percorso esterno compatibili con il programma di installazione corrente

Il secondo modo per dotare l'app dell'identità del pacchetto consiste nell'aggiungere all'applicazione un pacchetto con percorso esterno e registrarlo con il programma di installazione esistente. Il pacchetto con posizione esterna è un pacchetto MSIX vuoto contenente il file .appxmanifest con identità, registrazione della destinazione di condivisione e asset visivi. I file binari dell'app sono comunque gestiti dal programma di installazione esistente dell'app. Quando si registra il pacchetto, è necessario specificare il percorso di installazione dell'app nell'API. È importante mantenere l'identità nel manifest del pacchetto MSIX e nel manifest dell'app Win32 sincronizzate con il certificato usato per firmare l'app.

Passaggi per concedere l'identità del pacchetto a un'app non in pacchetto

La documentazione su come creare un pacchetto con posizione esterna è disponibile qui, incluse le informazioni sui modelli da usare: Concedere l'identità del pacchetto tramite creazione di pacchetti con posizione esterna.

L'app di esempio completa è disponibile su GitHub: Distribuito con posizione esterna.

Registrare come destinazione di condivisione

Una volta che l'app ha ottenuto l'identità del pacchetto, il passaggio successivo consiste nell'implementare il contratto Condivisione. Il contratto Condivisione consente all'app di ricevere dati da un'altra app.

È possibile seguire gli stessi passaggi nella sezione Registra come destinazione di condivisione della documentazione relativa alle app in pacchetto da integrare con lo strumento di condivisione.

Procedura dettagliata dell'app PhotoStore di esempio

Questa procedura dettagliata sull'identità del pacchetto, la registrazione & l'attivazione di condivisione per applicazioni Win32 non in pacchetto include informazioni su come concedere l'identità del pacchetto a un'applicazione Win32 non in pacchetto creando un pacchetto con percorso esterno. Una volta che l'app ha ottenuto l'identità del pacchetto, può registrarsi e gestire l'attivazione come destinazione di condivisione. Si eseguiranno I passaggi seguenti usando l'esempio PhotoStoreDemo:

  • Generare il file AppxManifest.xml.
  • Creare un pacchetto
  • Firmare il pacchetto
  • Registrare il pacchetto
  • Gestire l'attivazione dell'app

Iniziare creando il file AppxManifest.xml, che include proprietà necessarie quali <AllowExternalContent>, identità ed estensione di destinazione di condivisione & funzionalità. Assicurarsi che i valori Publisher, PackageName & ApplicationId nel file AppxManifest.xml corrispondano ai valori nel file PhotoStoreDemo.exe.manifest. Il valore Publisher deve corrispondere anche al valore del certificato usato per firmare il pacchetto: Aggiungere asset visivi come richiesto e illustrato in AppxManifest.xml. In Visual Studio è possibile usare il nodo Asset visivi durante la modifica di package.manifest nel progetto di creazione pacchetti di applicazioni per generare gli asset visivi richiesti.

Questo è un esempio di frammento di AppxManifest.xml con contenuto esterno consentito:

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

Questo è un esempio di file 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>

Quindi, per creare il pacchetto con percorso esterno, usare lo strumento MakeAppx.exe con il comando /nv per creare un pacchetto contenente il file AppxManifest.xml.​

Esempio:

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

Nota

Un pacchetto con posizione esterna contiene un manifesto del pacchetto, ma nessun altro file binario e contenuto dell'app. Il manifesto di un pacchetto con posizione esterna può fare riferimento a file esterni al pacchetto in una posizione esterna predeterminata.

Firmare il pacchetto con un certificato attendibile usando SignTool.exe.​

Esempio:

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

Il certificato usato per firmare il pacchetto deve essere installato in un percorso attendibile sul computer.

Alla prima esecuzione dell'applicazione, registrare il pacchetto con Windows. Quando un'app ha un proprio programma di installazione, deve contenere anche un MSIX firmato come payload e deve inserirlo in un percorso specifico (ad esempio, il percorso di installazione dell'app). Questo percorso deve essere noto all'app in fase di esecuzione perché l'app richiederà il percorso assoluto di MSIX per registrarlo. Inserire gli asset e resources.pri anche nel percorso di installazione dell'app.

Il codice seguente è un esempio di esecuzione non in pacchetto del metodo Main dell'app:

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

Questo esempio illustra come registrare MSIX alla prima esecuzione dell'app:

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

Infine, gestire l'attivazione dell'app:

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

Demo di Windows Share con identità del pacchetto

Nel video seguente viene mostrato come un'app non in pacchetto può essere una destinazione di condivisione dopo che le è stata concessa l'identità del pacchetto e la registrazione come destinazione di condivisione:

Vedi anche