Integrieren Sie nicht gepackte Anwendungen mit Windows Share
In diesem Artikel wird erklärt, wie Sie nicht gepackte Anwendungen in die Funktion Windows Share integrieren können. Mit der Freigabefunktion können Benutzer Inhalte von einer Windows-Anwendung zur anderen freigeben. Eine nicht gepackte App muss mit einer Paketidentität versehen werden, damit sie sich als Share Target registrieren kann. Sobald die App registriert ist, kann sie freigegebene Dateien empfangen und verarbeiten.
Wie man eine nicht gepackte Anwendung als Freigabeziel einbindet:
- Versehen Sie die Anwendung mit einer Paketidentität
- Umsetzung des Aktienvertrags
Ungepackte Anwendungen mit Paketidentität bereitstellen
Eine App kann auf zwei Arten eine Paketidentität erhalten:
- Erstellen Sie ein neues MSIX-Installationspaket (bevorzugte Methode) ODER
- Kompatibilität von Anwendungen, die an einem externen Speicherort gepackt wurden, mit dem aktuellen Installationsprogramm. Dies wird nur für Apps empfohlen, die über ein vorhandenes Installationsprogramm verfügen und nicht zur MSIX-Installation wechseln können.
Erstellen Sie ein neues MSIX-Installationspaket
Es wird empfohlen, die Anwendung mit MSIX zu verpacken, indem Sie die Vorlage Windows Application Packaging Project in Visual Studio verwenden. Dadurch werden alle Binärdateien in das MSIX-Paket aufgenommen und eine saubere und zuverlässige Installation ermöglicht.
Vor dem Verpacken von Desktop-Anwendungen sind einige Dinge zu beachten: Vorbereiten der Verpackung einer Desktop-Anwendung (MSIX).
Folgen Sie den Schritten unter Richten Sie Ihre Desktop-Anwendung für MSIX-Paketierung in Visual Studio ein, um ein Paket für das Projekt Ihrer vorhandenen Anwendung zu erstellen.
Hinweis
Wählen Sie beim Erstellen des Paketierungsprojekts Windows 10, Version 2004 (10.0; Build 19041) oder höher als Mindestversion aus.
Wenn dies abgeschlossen ist, erstellen Sie das Paket, indem Sie Paket einer Desktop- oder UWP-App in Visual Studio erstellen folgen.
Kompatibilität von Paketen mit externem Speicherort mit dem aktuellen Installationsprogramm herstellen
Die zweite Möglichkeit, Ihrer Anwendung eine Paketidentität zu geben, besteht darin, ein Paket mit externem Speicherort zu Ihrer Anwendung hinzuzufügen und es bei Ihrem bestehenden Installationsprogramm zu registrieren. Das Paket mit externem Speicherort ist ein leeres MSIX-Paket, das das .appxmanifest mit Identität, Freigabezielregistrierung und visuellen Assets enthält. Die Binärdateien der App werden nach wie vor von dem vorhandenen Installationsprogramm der App verwaltet. Bei der Registrierung des Pakets müssen Sie den Installationsort der Anwendung in der API angeben. Es ist wichtig, dass die Identität im MSIX-Paketmanifest und im Win32-Anwendungsmanifest mit dem für die Signierung der Anwendung verwendeten Zertifikat übereinstimmt.
Schritte zur Gewährung einer Paketidentität für eine nicht gepackte Anwendung
Die Dokumentation zur Erstellung eines Pakets mit externem Speicherort finden Sie hier, einschließlich Informationen zu den zu verwendenden Vorlagen: Gewährung der Packstückidentität durch Verpackung mit externem Standort.
Die vollständige Beispielanwendung ist auf GitHub verfügbar: SparsePackages (Packaged with External Location).
Registrierung als Aktienziel
Sobald die App über eine Paketidentität verfügt, besteht der nächste Schritt darin, den Share-Vertrag zu implementieren. Der Share-Vertrag ermöglicht es Ihrer App, Daten von einer anderen App zu empfangen.
Sie können die gleichen Schritte im Abschnitt Als Freigabeziel registrieren der Dokumentation für gepackte Anwendungen zur Integration in Share Sheet ausführen.
Durchgang durch die PhotoStore-Beispielanwendung
In dieser exemplarischen Vorgehensweise zu Paketidentität, Registrierung & Freigabeaktivierung für nicht gepackte Win32-Anwendungen erfahren Sie, wie Sie einer nicht gepackten Win32-Anwendung Paketidentität gewähren, indem Sie ein Paket mit externem Speicherort erstellen. Sobald die App über eine Paketidentität verfügt, kann sie sich als Freigabeziel registrieren und die Aktivierung vornehmen. Sie führen die folgenden Schritte anhand des PhotoStoreDemo-Beispiels aus:
- Generieren Sie die Datei
AppxManifest.xml
- Erstellen eines Pakets
- Signieren des Pakets
- Das Paket registrieren
- Behandeln der App-Aktivierung
Beginnen Sie mit der Erstellung der Datei AppxManifest.xml
, die die notwendigen Eigenschaften wie <AllowExternalContent>
, Identität und Fähigkeiten & Share Target Extension enthält. Stellen Sie sicher, dass die Werte Publisher
, PackageName
& ApplicationId
in der Datei AppxManifest.xml
mit den Werten in der Datei PhotoStoreDemo.exe.manifest
übereinstimmen. Der Wert Publisher
sollte auch mit dem Wert im Zertifikat übereinstimmen, mit dem das Paket signiert wurde. Fügen Sie je nach Bedarf visuelle Elemente hinzu, auf die in AppxManifest.xml
verwiesen wird. In Visual Studio können Sie den Knoten Visual Assets verwenden, wenn Sie package.manifest
im Anwendungspaketierungsprojekt bearbeiten, um die erforderlichen visuellen Assets zu generieren.
Dies ist ein Beispiel für ein AppxManifest.xml
Snippet, das externe Inhalte zulässt:
<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>
...
Dies ist ein Beispiel für die Datei 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>
Um das Paket mit externem Speicherort zu erstellen, verwenden Sie das Tool MakeAppx.exe
mit dem Befehl /nv
, um ein Paket zu erstellen, das die Datei AppxManifest.xml
enthält
Beispiel:
MakeAppx.exe pack /d <Path to directory with AppxManifest.xml> /p <Output Path>\mypackage.msix /nv
Hinweis
Ein Paket mit externem Speicherort enthält ein Paketmanifest, aber keine anderen App-Binärdateien und -Inhalte. Das Manifest eines Pakets mit externem Speicherort kann auf Dateien außerhalb des Pakets an einem vordefinierten externen Speicherort verweisen.
Signieren Sie Ihr Paket mit einem vertrauenswürdigen Zertifikat unter SignTool.exe
Beispiel:
SignTool.exe sign /fd SHA256 /a /f <path to cert> /p <cert key> <Path to Package>
Das zum Signieren des Pakets verwendete Zertifikat sollte an einem vertrauenswürdigen Ort auf dem Rechner installiert sein.
Bei der ersten Ausführung der Anwendung registrieren Sie das Paket bei Windows. Wenn eine Anwendung über ein eigenes Installationsprogramm verfügt, sollte es auch die signierte MSIX-Datei als Nutzdaten enthalten und an einem bestimmten Ort (z. B. dem Installationsort der Anwendung) abgelegt werden. Dieser Ort muss der Anwendung zur Laufzeit bekannt sein, da die Anwendung den absoluten Pfad von MSIX benötigt, um sie zu registrieren. Legen Sie die Assets und resources.pri
auch am Installationsort der App ab.
Der folgende Code ist ein Beispiel für die nicht gepackte Ausführung der Main-Methode der Anwendung:
[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);
}
}
...
Dieses Beispiel zeigt, wie MSIX beim ersten Start der Anwendung registriert wird:
[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);
}
}
...
Zum Schluss kümmern Sie sich um die Aktivierung der 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);
}
}
Windows Share mit Paketidentitätsdemo
Das folgende Video zeigt, wie eine nicht gepackte Anwendung ein Freigabeziel sein kann, nachdem ihr eine Paketidentität gewährt wurde und sie sich als Freigabeziel registriert hat:
Siehe auch
- Übersicht über die Windows App SDK-Bereitstellung
- Erstellen Ihres ersten WinUI 3-Projekts
- Migrieren von UWP zum Windows App SDK
- Vorteile und Nachteile der Paketierung einer Anwendung - Überblick über die Bereitstellung
- Identifizierung, Registrierung und Aktivierung von nicht paketierten Win32-Anwendungen
- Freigabevertragsimplementierung für WinAppSDK App
- Share Contract Implementation für Apps mit externem Standort verpackt
Windows developer