Udostępnij przez


Integracja rozpakowanych aplikacji z Windows Share

W tym artykule wyjaśniono, jak zintegrować nieopakowane aplikacje z funkcją udostępniania Windows. Funkcja Udostępnianie umożliwia użytkownikom udostępnianie zawartości z jednej aplikacji systemu Windows do innej. Aplikacja bez pakietu musi być wyposażona w tożsamość pakietu, aby mogła się zarejestrować jako docelowy punkt udostępniania. Po zarejestrowaniu aplikacja może odbierać i przetwarzać pliki udostępnione.

Jak dołączyć rozpakowaną aplikację, jako cel udostępniania:

  • Nadaj aplikacji tożsamość pakietu
  • Implementowanie kontraktu udostępniania

Zapewnianie rozpakowanym aplikacjom tożsamości pakietu

Aplikacja może uzyskać tożsamość pakietu na dwa sposoby:

  • Utwórz nowy pakiet instalacyjny MSIX (preferowana metoda) LUB
  • Upewnij się, że aplikacje pakowane z zewnętrzną lokalizacją są zgodne z bieżącym instalatorem. Jest to zalecane tylko w przypadku aplikacji, które mają istniejącego instalatora i które nie mogą przełączyć się na instalację MSIX.

Tworzenie nowego pakietu instalacyjnego MSIX

Zaleca się spakowanie aplikacji przy użyciu pliku MSIX przy użyciu szablonu Projektu pakietu aplikacji systemu Windows w programie Visual Studio. Obejmuje to wszystkie pliki binarne w pakiecie MSIX i zapewniają czyste i zaufane środowisko instalacji.

Kwestie do zanotowania przed pakowaniem aplikacji klasycznych: przygotowanie do spakowania aplikacji klasycznej (MSIX).

Wykonaj kroki opisane w temacie Konfigurowanie aplikacji klasycznej na potrzeby tworzenia pakietów MSIX w programie Visual Studio, aby wygenerować pakiet dla projektu istniejącej aplikacji.

Uwaga / Notatka

Podczas tworzenia projektu tworzenia pakietów wybierz pozycję Windows 10, wersja 2004 (10.0; Kompilacja 19041) lub nowsza jako minimalna wersja.

Po zakończeniu utworzysz pakiet, postępując zgodnie z instrukcją Jak opakować aplikację desktopową lub UWP w Visual Studio.

Spraw, aby pakietowanie z zewnętrzną lokalizacją było zgodne z bieżącym instalatorem

Drugim sposobem na nadanie tożsamości pakietu aplikacji jest dodanie pakietu z lokalizacją zewnętrzną do aplikacji i zarejestrowanie go w istniejącym instalatorze. Pakiet z lokalizacją zewnętrzną jest pustym pakietem MSIX zawierającym plik .appxmanifest zawierający tożsamość, rejestrację celu udostępniania i zasoby wizualne. Pliki binarne aplikacji są nadal zarządzane przez istniejącego instalatora aplikacji. Podczas rejestrowania pakietu należy podać lokalizację instalacji aplikacji w interfejsie API. Ważne jest, aby tożsamość w manifeście pakietu MSIX i manifeście aplikacji Win32 była zgodna z certyfikatem używanym do podpisywania aplikacji.

Kroki nadawania tożsamości pakietu nieopakowanej aplikacji

Dokumentacja dotycząca tworzenia pakietu z lokalizacją zewnętrzną jest dostępna tutaj, w tym informacje na temat szablonów do użycia: Udzielanie tożsamości pakietu przez pakowanie z lokalizacją zewnętrzną.

Pełna wersja aplikacji przykładowej jest dostępna na GitHub: Zewnętrzna lokalizacja pakietu.

Zarejestruj się jako cel udostępniania

Gdy aplikacja ma tożsamość pakietu, następnym krokiem jest zaimplementowanie kontraktu udostępniania. Kontrakt udostępniania umożliwia aplikacji odbieranie danych z innej aplikacji.

Te same kroki można wykonać w sekcji Rejestrowanie jako element docelowy udostępniania w dokumentacji dla spakowanych aplikacji w celu integracji z Udostępnij arkusz.

Przewodnik po przykładowej aplikacji PhotoStore

W tym przewodniku po tożsamości pakietu, rejestracji i aktywacji udziału dla rozpakowanych aplikacji Win32 dowiesz się, jak udzielić tożsamości pakietu do rozpakowanej aplikacji Win32, tworząc pakiet z lokalizacją zewnętrzną. Gdy aplikacja ma tożsamość pakietu, może zarejestrować i obsłużyć aktywację jako cel udostępniania. Wykonasz następujące kroki, korzystając z przykładu PhotoStoreDemo:

  • Generowanie AppxManifest.xml pliku
  • Tworzenie pakietu
  • Podpisywanie pakietu
  • Rejestrowanie pakietu
  • Obsługa aktywacji aplikacji

Zacznij od utworzenia pliku AppxManifest.xml, który zawiera niezbędne właściwości, takie jak <AllowExternalContent>, tożsamość, możliwości, oraz rozszerzenie docelowego obiektu udziału. Upewnij się, że wartości Publisher, PackageName i ApplicationId w pliku AppxManifest.xml odpowiadają wartościom w pliku PhotoStoreDemo.exe.manifest. Wartość Publisher powinna również odpowiadać wartości w certyfikacie użytym do podpisania pakietu. Dodaj zasoby wizualne zgodnie z wymaganiami i odniesieniami w AppxManifest.xml. W programie Visual Studio możesz użyć węzła Zasoby wizualne podczas edytowania package.manifest w projekcie Tworzenie pakietów aplikacji, aby wygenerować wymagane zasoby wizualne.

Jest to przykładowy AppxManifest.xml fragment kodu z dozwoloną zawartością zewnętrzną:

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

Jest to przykładowy plik manifestu Application.exe:

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

Następnie, aby utworzyć pakiet z lokalizacją zewnętrzną, użyj narzędzia MakeAppx.exe wraz z poleceniem /nv aby utworzyć pakiet, który zawiera plik AppxManifest.xml.

Przykład:

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

Uwaga / Notatka

Pakiet z lokalizacją zewnętrzną zawiera manifest pakietu, ale nie ma innych plików binarnych aplikacji i zawartości. Manifest pakietu z lokalizacją zewnętrzną może odwoływać się do plików spoza pakietu w wstępnie określonej lokalizacji zewnętrznej.

Podpisz swój pakiet za pomocą zaufanego certyfikatu, korzystając z SignTool.exe.

Przykład:

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

Certyfikat używany do podpisywania pakietu powinien być zainstalowany w zaufanej lokalizacji na maszynie.

Po pierwszym uruchomieniu aplikacji zarejestruj pakiet w systemie Windows. Jeśli aplikacja ma własny instalator, powinna również zawierać podpisany plik MSIX jako ładunek i powinien umieścić go w określonej lokalizacji (na przykład lokalizacji instalacji aplikacji). Ta lokalizacja musi być znana aplikacji w czasie wykonywania, ponieważ aplikacja będzie potrzebować bezwzględnej ścieżki MSIX do jej zarejestrowania. Umieść zasoby i resources.pri w lokalizacji instalacji aplikacji.

Poniższy kod jest przykładem rozpakowanego uruchomienia metody Main aplikacji.

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

W tym przykładzie pokazano, jak zarejestrować plik MSIX podczas pierwszego uruchomienia aplikacji:

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

Na koniec obsłuż aktywację aplikacji:

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

Pokaz tożsamości pakietu w usłudze Windows Share

W poniższym filmie wideo pokazano, jak aplikacja bez pakietu może być celem udostępniania po uzyskaniu tożsamości pakietu i zarejestrowaniu się jako cel udostępniania.

Zobacz także