Partilhar via


Integre aplicativos não empacotados com o Compartilhamento do Windows

Este artigo explica como integrar aplicativos não empacotados com o recurso Compartilhamento do Windows . O recurso Compartilhar permite que os usuários compartilhem conteúdo de um aplicativo do Windows para outro. Um aplicativo não empacotado deve ser fornecido com identidade de pacote para que possa se registrar como um Destino de Compartilhamento. Uma vez registrado, o aplicativo pode receber e processar arquivos compartilhados.

Como integrar um aplicativo não empacotado como um destino de compartilhamento:

  • Fornecer a identidade do pacote ao aplicativo
  • Implementar o contrato de Partilha

Fornecer aplicativos não empacotados com identidade de pacote

Um aplicativo pode obter identidade de pacote de duas maneiras:

  • Faça um novo pacote de instalação MSIX (método preferencial) OU
  • Torne as aplicações empacotadas com localização externa compatíveis com o instalador atual. Isso só é recomendado para aplicativos que têm um instalador existente e que não podem alternar para a instalação do MSIX.

Criar um novo pacote de instalação do MSIX

É recomendável empacotar o aplicativo com MSIX usando o modelo Windows Application Packaging Project no Visual Studio. Isso incluirá todos os binários no pacote MSIX e fornecerá uma experiência de instalação limpa e confiável.

Aspetos a ter em conta antes de empacotar aplicações de ambiente de trabalho: Preparar para empacotar uma aplicação de ambiente de trabalho (MSIX).

Siga as etapas em Configurar sua aplicação de ambiente de trabalho para empacotamento MSIX no Visual Studio para criar um pacote para o projeto da aplicação existente.

Observação

Ao criar o projeto de empacotamento, selecione Windows 10, versão 2004 (10.0; Build 19041) ou posterior como a versão mínima.

Quando isso for concluído, você criará o pacote seguindo Empacotar um aplicativo da área de trabalho ou UWP no Visual Studio.

Tornar a embalagem com localização externa compatível com o instalador atual

A segunda maneira de dar identidade ao pacote do aplicativo é adicionar um pacote com local externo ao aplicativo e registrá-lo com o instalador existente. O pacote com localização externa é um pacote MSIX vazio que contém o .appxmanifest com identidade, registo de destino de partilha e recursos visuais. Os binários do aplicativo ainda são gerenciados pelo instalador existente do aplicativo. Ao registrar o pacote, você precisa fornecer o local de instalação do aplicativo na API. É importante manter a identidade no manifesto do pacote MSIX e no manifesto do aplicativo Win32 em sincronia com o certificado usado para assinar o aplicativo.

Etapas para conceder identidade de pacote a um aplicativo não empacotado

A documentação sobre como criar um pacote com localização externa está disponível aqui, incluindo informações sobre modelos a serem usados: Conceder identidade de pacote por empacotamento com local externo.

O aplicativo de exemplo completo está disponível no GitHub: Empacotado com Localização Externa.

Registre-se como um alvo de compartilhamento

Depois que o aplicativo tiver a identidade do pacote, a próxima etapa é implementar o contrato de Compartilhamento. O contrato de Partilha permite que a sua aplicação receba dados de outra aplicação.

Você pode seguir as mesmas etapas na seção Registrar como um destino de compartilhamento da documentação para aplicativos empacotados a serem integrados ao Share Sheet.

Passo a passo do aplicativo PhotoStore de exemplo

Neste passo a passo sobre identidade de pacote, registro e ativação de compartilhamento para aplicativos Win32 não empacotados, você aprenderá como conceder identidade de pacote a um aplicativo Win32 não empacotado criando um pacote com local externo. Assim que o aplicativo obtiver a identidade do pacote, ele pode registar-se e gerir a ativação como destino para partilha. Você seguirá as seguintes etapas usando o exemplo PhotoStoreDemo:

  • Gerar o AppxManifest.xml ficheiro
  • Criar um pacote
  • Assine o pacote
  • Registar o pacote
  • Gerir a ativação da aplicação

Comece por criar o arquivo AppxManifest.xml, que inclui as propriedades necessárias, como <AllowExternalContent>, identidade, capacidades e extensão de destino de partilha. Certifique-se de que os valores em Publisher, PackageName e ApplicationId no ficheiro AppxManifest.xml correspondem aos valores no ficheiro PhotoStoreDemo.exe.manifest. O Publisher valor também deve corresponder ao valor no certificado usado para assinar o pacote. Adicione os ativos visuais conforme necessário e conforme referenciado em AppxManifest.xml. No Visual Studio, você pode usar o nó Ativos Visuais ao editar package.manifest no projeto Application Packaging para gerar os ativos visuais necessários.

Este é um trecho de exemplo AppxManifest.xml com conteúdo externo permitido:

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

Este é um arquivo .manifest exemplo 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>

Em seguida, para criar o pacote com localização externa, use a MakeAppx.exe ferramenta com o /nv comando para criar um pacote contendo o AppxManifest.xml arquivo.

Exemplo:

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

Observação

Um pacote com local externo contém um manifesto de pacote, mas nenhum outro binário e conteúdo de aplicativo. O manifesto de um pacote com local externo pode fazer referência a arquivos fora do pacote em um local externo predeterminado.

Assine o seu pacote com um certificado confiável usando o SignTool.exe.

Exemplo:

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

O certificado usado para assinar o pacote deve ser instalado em um local confiável na máquina.

Na primeira execução do aplicativo, registre o pacote com o Windows. Quando um aplicativo tem seu próprio instalador, ele também deve conter o MSIX assinado como carga útil e deve colocá-lo em um local especificado (por exemplo, o local de instalação do aplicativo). Esse local deve ser conhecido pelo aplicativo em tempo de execução porque o aplicativo precisará do caminho absoluto do MSIX para registrá-lo. Coloque os recursos e resources.pri no local de instalação da aplicação também.

O código a seguir é um exemplo de execução não empacotada do método Main do aplicativo:

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

Este exemplo mostra como registrar o MSIX na primeira execução do aplicativo:

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

Por fim, manipule a ativação do aplicativo:

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

Demonstração de partilha do Windows com identidade de pacote

O vídeo a seguir demonstra como um aplicativo não empacotado pode ser um destino de compartilhamento depois de receber a identidade do pacote e se registrar como um destino de compartilhamento:

Ver também