Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
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
- Panoramica della distribuzione di SDK per app di Windows
- Creare il primo progetto WinUI 3
- Eseguire la migrazione da UWP a Windows App SDK
- Vantaggi e svantaggi della creazione di pacchetti di un'applicazione - Panoramica della distribuzione
- Identità, registrazione e attivazione di app Win32 non in pacchetto
- Implementazione del contratto di condivisione per Windows App SDK
- Implementazione del contratto Condivisione per app in pacchetto con percorso esterno