Sdílet prostřednictvím


Integrace rozbalených aplikací se službou Windows Share

Tento článek vysvětluje, jak integrovat rozbalené aplikace s funkcí Windows Share . Funkce Sdílet umožňuje uživatelům sdílet obsah z jedné aplikace pro Windows do jiné. Rozbalená aplikace musí mít identitu balíčku, aby se mohla zaregistrovat jako cílový bod sdílení. Po registraci může aplikace přijímat a zpracovávat sdílené soubory.

Postup nasazení rozbalené aplikace jako cíle pro sdílení:

  • Poskytněte aplikaci identitu balíčku
  • Implementace kontraktu sdílení

Poskytnutí rozbalených aplikací s identitou balíčku

Aplikace může získat identitu balíčku dvěma způsoby:

  • Vytvoření nového instalačního balíčku MSIX (upřednostňovaná metoda) NEBO
  • Vytvořte aplikace zabalené s externím umístěním kompatibilním s aktuálním instalačním programem. To se doporučuje jenom pro aplikace, které mají existující instalační program a které nemůžou přepnout na instalaci MSIX.

Vytvoření nového instalačního balíčku MSIX

Doporučujeme zabalit aplikaci do formátu MSIX s použitím šablony Projekt vytvoření balíčku aplikací Windows v sadě Visual Studio. To bude zahrnovat všechny binární soubory v balíčku MSIX a poskytují čisté a důvěryhodné prostředí instalace.

Co je potřeba si poznamenat před balením desktopových aplikací: Příprava na zabalení desktopové aplikace (MSIX)

Postupujte podle pokynů v tématu Nastavení desktopové aplikace pro balení MSIX v sadě Visual Studio a vygenerujte balíček pro projekt existující aplikace.

Poznámka:

Při vytváření projektu balení vyberte Windows 10 verze 2004 (10.0; Build 19041) nebo novější jako minimální verze

Po dokončení vytvoříte balíček podle pokynů v balíčku desktopové nebo UWP aplikace v sadě Visual Studio.

Vytvořte balení s externím umístěním kompatibilním se současným instalačním programem

Druhým způsobem, jak dát identitě balíčku aplikace, je přidat do aplikace balíček s externím umístěním a zaregistrovat ho ve stávajícím instalačním programu. Balíček s externím umístěním je prázdný balíček MSIX, který obsahuje .appxmanifest s identitou, cílovou registraci a vizuální prostředky. Binární soubory aplikace jsou stále spravovány existujícím instalačním programem aplikace. Při registraci balíčku musíte do rozhraní API zadat umístění instalace aplikace. Je důležité zachovat identitu v manifestu balíčku MSIX a manifest aplikace Win32 synchronizovat s certifikátem použitým k podepsání aplikace.

Postup udělení identity balíčku pro nebalenou aplikaci

Dokumentaci k vytvoření balíčku s externím umístěním najdete tady, včetně informací o šablonách, které se mají použít: Udělení identity balíčku zabalením s externím umístěním.

Úplná ukázková aplikace je dostupná na GitHubu: Zabalená s externím umístěním.

Registrace jako cílová aplikace pro sdílení

Jakmile má aplikace identitu balíčku, dalším krokem je implementace kontraktu sdílení. Kontrakt Sdílet umožňuje vaší aplikaci přijímat data z jiné aplikace.

Stejný postup najdete v části Registrace jako cíl sdílení v dokumentaci pro zabalené aplikace pro integraci se Share Sheetem.

Návod k ukázkové aplikaci PhotoStore

V tomto názorném postupu o identitě balíčku, registraci a aktivaci sdílené složky pro rozbalené aplikace Win32 se dozvíte, jak udělit identitu balíčku pro rozbalenou aplikaci Win32 vytvořením balíčku s externím umístěním. Jakmile má aplikace identitu balíčku, může se zaregistrovat a zpracovat aktivaci jako Share Target. Pomocí ukázky PhotoStoreDemo provedete následující kroky:

  • Vygenerujte AppxManifest.xml soubor
  • Vytvoření balíčku
  • Podepište balíček
  • Registrace balíčku
  • Zpracování aktivace aplikace

Začněte vytvořením AppxManifest.xml souboru, který zahrnuje nezbytné vlastnosti, jako je <AllowExternalContent>, identita a možnosti a cílová přípona sdílení. Ujistěte se, že hodnoty Publisher, PackageName a ApplicationId v souboru AppxManifest.xml odpovídají hodnotám v souboru PhotoStoreDemo.exe.manifest. Hodnota Publisher by se také měla shodovat s hodnotou v certifikátu použitém k podepsání balíčku. Přidejte vizuální prvky dle potřeby a odkazované v AppxManifest.xml. V sadě Visual Studio můžete použít uzel Vizuální prostředky při úpravách package.manifest v projektu Vytváření balíčků aplikací k vygenerování požadovaných vizuálních prostředků.

Toto je ukázkový AppxManifest.xml fragment kódu s povoleným externím obsahem:

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

Toto je ukázkový soubor 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>

Dále vytvořte balíček s externím umístěním pomocí MakeAppx.exe nástroje s /nv příkazem k vytvoření balíčku obsahujícího AppxManifest.xml soubor.

Příklad:

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

Poznámka:

Balíček s externím umístěním obsahuje manifest balíčku, ale žádné jiné binární soubory a obsah aplikace. Manifest balíčku s externím umístěním může odkazovat na soubory mimo balíček v předem určeném externím umístění.

Podepište balíček pomocí důvěryhodného certifikátu pomocí SignTool.exe.

Příklad:

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

Certifikát použitý k podepisování balíčku by se měl nainstalovat do důvěryhodného umístění na počítači.

Při prvním spuštění aplikace zaregistrujte balíček ve Windows. Pokud má aplikace vlastní instalační program, měla by také obsahovat podepsanou MSIX jako datovou část a měla by ji umístit do zadaného umístění (například umístění instalace aplikace). Toto umístění musí být známo pro aplikaci za běhu, protože aplikace bude k registraci potřebovat absolutní cestu MSIX. Umístěte prostředky a resources.pri rovněž do umístění instalace aplikace.

Následující kód je příkladem rozbaleného spuštění metody Main aplikace:

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

Tento příklad ukazuje, jak zaregistrovat MSIX při prvním spuštění aplikace:

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

Nakonec zpracujte aktivaci aplikace:

[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 s ukázkou identity balíčku

Následující video ukazuje, jak může být rozbalená aplikace cílem sdílení poté, co získá identitu balíčku a zaregistruje se jako cíl sdílení.

Viz také