Freigeben über


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