Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
A partir do Windows 10, versão 2004, você pode criar aplicativos hospedados. Um aplicativo hospedado compartilha o mesmo executável e definição que um aplicativo pai host aplicativo, mas parece e se comporta como um aplicativo separado no sistema.
Os aplicativos hospedados são úteis para cenários em que você deseja que um componente (como um arquivo executável ou um arquivo de script) se comporte como um aplicativo autônomo do Windows 10, mas o componente requer um processo de host para ser executado. Por exemplo, um script PowerShell ou Python pode ser entregue como um aplicativo hospedado que requer que um host seja instalado para ser executado. Um aplicativo hospedado pode ter seu próprio bloco inicial, identidade e integração profunda com recursos do Windows 10, como tarefas em segundo plano, notificações, blocos e destinos de compartilhamento.
O recurso de aplicativos hospedados é suportado por vários elementos e atributos no manifesto do pacote que permitem que um aplicativo hospedado use um executável e uma definição em um pacote de aplicativo host. Quando um usuário executa o aplicativo hospedado, o sistema operacional inicia automaticamente o executável do host sob a identidade do aplicativo hospedado. O host pode então carregar ativos visuais, conteúdo ou chamar APIs como o aplicativo hospedado. O aplicativo hospedado obtém a interseção de recursos declarados entre o host e o aplicativo hospedado. Isso significa que um aplicativo hospedado não pode pedir mais recursos do que o que o host fornece.
Definir um anfitrião
O host é o principal processo executável ou de execução para a aplicação hospedada. Atualmente, os únicos hosts suportados são aplicações de ambiente de trabalho (.NET ou C++ de ambiente de trabalho) que têm identidade de pacote. Há várias maneiras de um aplicativo de desktop ter identidade de pacote:
- A maneira mais comum de conceder identidade de pacote a um aplicativo de desktop é empacotá-lo em um pacote MSIX.
- Em alguns casos, pode-se, alternativamente, optar por atribuir a identidade de pacote criando um pacote com uma localização externa (consulte Conceder identidade de pacote ao empacotar com uma localização externa). Essa opção é útil se você não conseguir adotar o MSIX para instalar seu aplicativo de desktop.
O host é declarado no manifesto de pacote pela extensão uap10:HostRuntime. Essa extensão tem um atributo Id
O exemplo a seguir demonstra como definir um host em um manifesto de pacote. A extensão uap10:HostRuntime abrange todo o pacote e, portanto, é declarada como filho do elemento Package.
<Package xmlns:uap10="http://schemas.microsoft.com/appx/manifest/uap/windows10/10">
<Extensions>
<uap10:Extension Category="windows.hostRuntime"
Executable="PyScriptEngine\PyScriptEngine.exe"
uap10:RuntimeBehavior="packagedClassicApp"
uap10:TrustLevel="mediumIL">
<uap10:HostRuntime Id="PythonHost" />
</uap10:Extension>
</Extensions>
</Package>
Anote esses detalhes importantes sobre os seguintes elementos.
| Elemento | Detalhes |
|---|---|
| uap10:Extensão | A categoria windows.hostRuntime declara uma extensão de todo o pacote que define as informações de tempo de execução a serem usadas ao ativar um aplicativo hospedado. Um aplicativo hospedado será executado com as definições declaradas na extensão. Ao usar a aplicação host declarada no exemplo anterior, uma aplicação hospedada será executada como executável PyScriptEngine.exe no nível de confiança mediumIL .Os atributos Executable, uap10:RuntimeBehaviore uap10:TrustLevel especificam o nome do binário do processo de host no pacote e como os aplicativos hospedados serão executados. Por exemplo, uma aplicação hospedada utilizando os atributos mencionados no exemplo anterior será executada como o executável PyScriptEngine.exe no nível de confiança mediumIL. |
| uap10:HostRuntime | O atributo Id declara o identificador exclusivo desse aplicativo host específico no pacote. Um pacote pode ter várias aplicações host, e cada uma deve ter um elemento uap10:HostRuntime com um Idexclusivo. |
Declarar um aplicativo hospedado
Uma aplicação hospedada declara uma dependência de pacote de um host . O aplicativo hospedado utiliza o ID do host (ou seja, o atributo Id da extensão uap10:HostRuntime no pacote host) para a ativação em vez de especificar um executável de ponto de entrada no seu próprio pacote. O aplicativo hospedado normalmente contém conteúdo, ativos visuais, scripts ou binários que podem ser acessados pelo host. O valor de TargetDeviceFamily no pacote do aplicativo hospedado deve ter como destino o mesmo valor que o host.
Os pacotes de aplicativos hospedados podem ser assinados ou não:
- Os pacotes assinados podem conter arquivos executáveis. Isso é útil em cenários que têm um mecanismo de extensão binária, que permite que o host carregue uma DLL ou um componente registrado no pacote do aplicativo hospedado.
- Na maioria dos cenários, o pacote não assinado conterá conteúdo executável. Mas um pacote não assinado que contém apenas ficheiros não executáveis é útil em cenários onde o host precisa carregar apenas imagens, recursos e/ou ficheiros de script ou conteúdo. Os pacotes não assinados devem incluir um valor de
OIDespecial no seu elemento de identidade , caso contrário, não terão permissão para se registar. Isso evita que pacotes não assinados entrem em conflito ou falsificem a identidade de um pacote assinado.
Para definir um aplicativo hospedado, declare os seguintes itens no manifesto do pacote:
- O elemento uap10:HostRuntimeDependency. Este é um subelemento do elemento Dependências.
- O atributo uap10:HostId do elemento Application (para uma aplicação) ou do elemento Extension (para uma extensão ativável).
O exemplo a seguir demonstra as seções relevantes de um manifesto de pacote para um aplicativo hospedado não assinado.
<Package xmlns:uap10="http://schemas.microsoft.com/appx/manifest/uap/windows10/10">
<Identity Name="NumberGuesserManifest"
Publisher="CN=AppModelSamples, OID.2.25.311729368913984317654407730594956997722=1"
Version="1.0.0.0" />
<Dependencies>
<TargetDeviceFamily Name="Windows.Desktop" MinVersion="10.0.19041.0" MaxVersionTested="10.0.19041.0" />
<uap10:HostRuntimeDependency Name="PyScriptEnginePackage" Publisher="CN=AppModelSamples" MinVersion="1.0.0.0"/>
</Dependencies>
<Applications>
<Application Id="NumberGuesserApp"
uap10:HostId="PythonHost"
uap10:Parameters="-Script "NumberGuesser.py"">
</Application>
</Applications>
</Package>
Anote esses detalhes importantes sobre os seguintes elementos.
| Elemento | Detalhes |
|---|---|
| Identidade | Como o pacote do aplicativo hospedado neste exemplo não está assinado, o atributo Publisher deve incluir a cadeia de caracteres OID.2.25.311729368913984317654407730594956997722=1. Isso garante que o pacote não assinado não possa falsificar a identidade de um pacote assinado. |
| FamíliaDoDispositivoAlvo | O atributo MinVersion deve especificar 10.0.19041.0 ou uma versão posterior do sistema operacional. |
| uap10:HostRuntimeDependency | Este elemento declara uma dependência no pacote do aplicativo host. Isso consiste no Name e no Publisher do pacote host, e na MinVersion de que ele depende. Esses valores podem ser encontrados sob o elemento Identity no pacote host. |
| Aplicação | O atributo uap10:HostId expressa a dependência do host. O pacote do aplicativo hospedado deve declarar esse atributo em vez dos atributos usuais Executable e EntryPoint para um elemento Application ou Extension. Como resultado, o aplicativo hospedado herda os atributos Executable, EntryPoint e do tempo de execução do host com o valor correspondente HostId. O atributo uap10:Parameters especifica parâmetros que são passados para a função de ponto de entrada do executável do host. Como o host precisa saber o que fazer com esses parâmetros, há um contrato implícito entre o host e o aplicativo hospedado. |
Registrar um pacote de aplicação hospedada não assinado no momento da execução
Um benefício da extensão
Use os seguintes métodos da classe
- AddPackageByUriAsync: Registra um pacote MSIX não assinado usando a propriedade AllowUnsigned do parâmetro opções.
- RegisterPackageByUriAsync: Executa um registro de arquivo de manifesto de pacote solto. Se o pacote estiver assinado, a pasta que contém o manifesto deve incluir um ficheiro .p7x, , e um catálogo. Se não for assinada, a propriedade AllowUnsigned do parâmetro de opções deve ser configurada.
Requisitos para aplicativos hospedados não assinados
- Os elementos Application ou Extension no manifesto do pacote não podem conter dados de ativação, como os atributos Executable, EntryPointou TrustLevel. Em vez disso, esses elementos só podem conter um atributo
uap10:HostId que expressa a dependência do host e um atributouap10:Parameters. - O pacote deve ser um pacote principal. Não pode ser um pacote, um pacote de estrutura, um recurso ou um pacote opcional.
Requisitos para um host que instala e registra um pacote de aplicativo hospedado não assinado
- O anfitrião deve ter a identidade do pacote .
- O host deve ter o packageManagementcapacidade restrita.
<rescap:Capability Name="packageManagement" />
Exemplo
Para obter uma aplicação de exemplo totalmente funcional que se declara como um host e, em seguida, regista dinamicamente um pacote de aplicação hospedada em tempo de execução, consulte o exemplo de aplicação hospedada em .
O anfitrião
O host é chamado PyScriptEngine. Este é um wrapper escrito em C# que executa scripts python. Quando executado com o parâmetro -Register, o mecanismo de script instala um aplicativo hospedado contendo um script python. Quando um usuário tenta iniciar o aplicativo hospedado recém-instalado, o host é iniciado e executa o script NumberGuesser python.
O manifesto do pacote para a aplicação hospedeira (o arquivo Package.appxmanifest na pasta PyScriptEnginePackage) contém uma extensão uap10:HostRuntime que declara a aplicação como hospedeira com a identificação PythonHost e o executável PyScriptEngine.exe.
Observação
Neste exemplo, o manifesto do pacote é chamado Package.appxmanifest e faz parte de um Windows Application Packaging Project. Quando esse projeto é criado, ele gera um manifesto chamado AppxManifest.xml e cria o pacote MSIX para o aplicativo host.
O aplicativo hospedado
O aplicativo hospedado consiste em um script python e artefatos de pacote, como o manifesto do pacote. Ele não contém nenhum arquivo PE.
O manifesto do pacote para o aplicativo hospedado (o arquivo NumberGuesser/AppxManifest.xml) contém os seguintes itens:
- O atributo Publisher do elemento Identity contém o
OID.2.25.311729368913984317654407730594956997722=1identificador, que é necessário para um pacote não assinado. - O atributo uap10:HostId do elemento Application identifica PythonHost como seu host.
Executar o exemplo
O exemplo requer a versão 10.0.19041.0 ou posterior do Windows 10 e do SDK do Windows.
Transfira o exemplo para uma pasta no computador de desenvolvimento.
Abra a solução PyScriptEngine.sln no Visual Studio e defina o projeto PyScriptEnginePackage como o projeto de inicialização.
Compile o projeto PyScriptEnginePackage.
No Gerenciador de Soluções, clique com o botão direito do mouse no projeto
PyScriptEnginePackage e escolha Implantar .Abra uma janela de Prompt de Comando no diretório onde você copiou os arquivos de exemplo e execute o seguinte comando para registrar o exemplo aplicativo NumberGuesser (o aplicativo hospedado). Altere
D:\repos\HostedAppspara o caminho onde você copiou os arquivos de exemplo.D:\repos\HostedApps>pyscriptengine -Register D:\repos\HostedApps\NumberGuesser\AppxManifest.xmlObservação
Você pode executar
pyscriptenginena linha de comando porque o host no exemplo declara um AppExecutionAlias.Abra o menu Iniciar e clique em NumberGuesser para executar o aplicativo hospedado.