Aracılığıyla paylaş


Paketlenmemiş uygulamaları Windows Share ile tümleştirme

Bu makalede, paketlenmemiş uygulamaların Windows Share özelliğiyle nasıl tümleştirilme adımları açıklanmaktadır. Paylaş özelliği, kullanıcıların bir Windows uygulamasından diğerine içerik paylaşmasına olanak tanır. Paketlenmemiş bir uygulamanın Paylaşım Hedefi olarak kaydedilebilmesi için paket kimliği sağlanmalıdır. Kaydedildikten sonra uygulama paylaşılan dosyaları alabilir ve işleyebilir.

Paketlenmemiş bir uygulamayı Paylaşım Hedefi olarak ekleme:

  • Uygulamaya paket kimliği sağlayın
  • Paylaş sözleşmesini uygulama

Paketlenmemiş uygulamalara paket kimliği sağlamak

Bir uygulama paket kimliğini iki yolla alabilir:

  • Yeni bir MSIX yükleme paketi oluşturma (tercih edilen yöntem) OR
  • Dış konumla paketlenmiş uygulamaları geçerli yükleyiciyle uyumlu hale getirin. Bu yalnızca mevcut bir yükleyicisi olan ve MSIX yüklemesine geçemeyen uygulamalar için önerilir.

Yeni bir MSIX yükleme paketi oluşturma

Visual Studio'da Windows Uygulama Paketleme Projesi şablonunu kullanarak uygulamayı MSIX ile paketlemek önerilir. Bu, MSIX paketindeki tüm ikili dosyaları içerir ve temiz ve güvenilir bir yükleme deneyimi sağlar.

Masaüstü uygulamalarını paketlemeden önce dikkate alınan noktalar: Masaüstü uygulamasını paketlemeye hazırlanma (MSIX).

Mevcut uygulamanızın projesine yönelik bir paket oluşturmak için Visual Studio'da MSIX paketlemesi için masaüstü uygulamanızı ayarlama bölümünde yer alan adımları izleyin.

Uyarı

Paketleme projesini oluştururken Windows 10, sürüm 2004 (10.0; Derleme 19041) veya üzerini En Düşük sürüm olarak ayarlayın.

Bu işlem tamamlandığında, Visual Studio'da Masaüstü veya UWP uygulaması paketleme'yi izleyerek paketi oluşturacaksınız.

Dış konumdaki paketlemeyi geçerli yükleyiciyle uyumlu hale getirme

Uygulama paketi kimliğinizi vermenin ikinci yolu, uygulamanıza dış konuma sahip bir paket eklemek ve bunu mevcut yükleyicinize kaydetmektir. Dış konuma sahip paket, kimlik, hedef kaydı paylaşımı ve görsel varlıklar içeren .appxmanifest'i barındıran boş bir MSIX paketidir. Uygulamanın ikili dosyaları yine de uygulamanın mevcut yükleyicisi tarafından yönetilir. Paketi kaydederken api'de uygulamanın yükleme konumunu sağlamanız gerekir. Kimliği MSIX paket bildiriminde ve Win32 uygulama bildiriminde, uygulamayı imzalamak için kullanılan sertifikayla eşitlenmiş olarak tutmak önemlidir.

Paketlenmemiş bir uygulamaya paket kimliği verme adımları

Kullanılacak şablonlar hakkında bilgiler de dahil olmak üzere, dış konuma sahip bir paketin nasıl oluşturulacağıyla ilgili belgelere buradan ulaşabilirsiniz: Dış konumla paketle paket kimliği verme.

Tam örnek uygulama GitHub'da mevcuttur: Dış Konum ile Paketlenmiş.

Paylaşım Hedefi Olarak Kaydetme

Uygulama paket kimliğine sahip olduktan sonra, sonraki adım Paylaş sözleşmesini uygulamaktır. Paylaş sözleşmesi, uygulamanızın başka bir uygulamadan veri almasına olanak tanır.

Paketlenmiş uygulamaların Paylaşım Sayfası ile tümleştirilmesi için belgelerin Paylaşım Hedefi Olarak Kaydet bölümünde aynı adımları izleyebilirsiniz.

Örnek PhotoStore uygulamasının kılavuzu

Paketlenmemiş Win32 Uygulamaları için paket kimliği, kayıt ve paylaşım etkinleştirmesi ile ilgili bu kılavuzda, dış konuma sahip bir paket oluşturarak paketlenmemiş bir Win32 uygulamasına paket kimliği verme hakkında bilgi edineceksiniz. Uygulama paket kimliğine sahip olduktan sonra etkinleştirmeyi Paylaşım Hedefi olarak kaydedebilir ve işleyebilir. PhotoStoreDemo örneğini kullanarak aşağıdaki adımları uygulayacaksınız:

  • AppxManifest.xml Dosyayı oluşturma
  • Paket oluşturma
  • Paketi imzalama
  • Paketi kaydetme
  • Uygulama etkinleştirmesini yönet

AppxManifest.xml dosyasını oluşturmakla başlayın, <AllowExternalContent> gibi gerekli özellikler, kimlik ve seçenekler ile paylaşım hedef uzantısını içeren bir dosya. Dosyadaki Publisher, PackageName ve ApplicationId değerlerinin AppxManifest.xml dosyadaki değerlerle eşleştiğinden PhotoStoreDemo.exe.manifest emin olun. Değerin Publisher , paketi imzalamak için kullanılan sertifikadaki değerle de eşleşmesi gerekir. Görsel öğeleri gerektiğinde ekleyin ve AppxManifest.xml ile referans verin. Visual Studio'da, gerekli görsel varlıkları oluşturmak için Uygulama Paketleme projesinde düzenleme package.manifest yaparken Görsel Varlıklar düğümünü kullanabilirsiniz.

Bu, dış içeriğe izin verilen örnek AppxManifest.xml bir kod parçacığıdır:

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

Bu örnek bir Application.exe.manifest dosyasıdır:

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

Ardından, MakeAppx.exe aracını /nv komutuyla kullanarak AppxManifest.xml dosyasını içeren ve dış konumda bulunan bir paket oluşturun.

Örnek:

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

Uyarı

Dış konuma sahip bir paket bir paket bildirimi içerir, ancak başka uygulama ikili dosyaları ve içeriği içermez. Dış konuma sahip bir paketin bildirimi, önceden belirlenmiş bir dış konumda paketin dışındaki dosyalara başvurabilir.

kullanarak SignTool.exepaketinizi güvenilir bir sertifikayla imzalayın.

Örnek:

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

Paketi imzalamak için kullanılan sertifika, makinede güvenilir bir konuma yüklenmelidir.

Uygulamanın ilk çalıştırıldığında paketi Windows'a kaydedin. Bir uygulamanın kendi yükleyicisi olduğunda, yük olarak imzalı MSIX'i de içermesi ve bunu belirtilen bir konuma (örneğin, uygulamanın yükleme konumu) yerleştirmesi gerekir. Uygulamanın kaydetmek için MSIX'in mutlak yoluna ihtiyacı olacağı için bu konumun uygulama tarafından çalışma zamanında bilinmesi gerekir. Varlıkları ve resources.pri uygulamayı yükleme konumuna da yerleştirin.

Aşağıdaki kod, uygulamanın Main yönteminin paketlenmemiş yürütme örneğidir:

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

Bu örnek, uygulamanın ilk çalıştırmada MSIX'in nasıl kaydedileceğini göstermektedir.

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

Son olarak, uygulamanın etkinleştirilmesini işleyin.

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

Paket kimliğiyle Windows Share tanıtımı

Aşağıdaki videoda paket kimliği verildikten ve paylaşım hedefi olarak kaydedildikten sonra paketlenmemiş bir uygulamanın nasıl paylaşım hedefi olabileceği gösterilmektedir:

Ayrıca bakınız