c# - tutorial - wpf or windows forms 2018




Como um aplicativo Metro no Windows 8 pode se comunicar com um aplicativo de desktop de back-end na mesma máquina? (6)

É possível se comunicar na mesma máquina do aplicativo Metro para o aplicativo de desktop usando o serviço local. Implementei há algum tempo uma "prova de conceito" simples, como ignorar a sandbox do WinRT usando o serviço local. Ainda precisa de algum tipo de "engenharia social" ou guia direto para instalar o serviço, mas, de qualquer forma, é possível.
No entanto, não tenho certeza sobre as regras de certificação sobre a comunicação "serviço local" ao adicionar esse aplicativo à Windows Store.

Amostra aqui

Por design, o aplicativo Metro não pode acessar diretamente o PC subjacente, usando apenas a API do WinRT e os recursos disponíveis. Mas quando você cria um serviço de back-end para acessar o PC e todos os dados, basicamente, ele não está mais sendo executado na sandbox.

O único "problema" é que o usuário deve instalar manualmente este serviço de back-end, mas isso não será um problema usando alguma "engenharia social": downloads usuário "navegador PC" aplicativo Metro, o usuário pode procurar todas as fotos, músicas e vídeos , usando WinRT API, mas o aplicativo também mostra a mensagem na parte inferior: "Baixe o powerpack do seu navegador PC e navegue em todo o seu PC, de graça"

O usuário é redirecionado para a página da web, de onde o usuário pode baixar o instalador de desktop clássico que contém o serviço de back-end "navegador de PC" para acessar arquivos em todo o PC de usuários. Quando esse serviço de desktop é instalado, o aplicativo Metro pode detectá-lo e usá-lo para navegar em todo o PC. O usuário está feliz, mas o sandbox do WinRT está comprometido.

Claro que isso não funcionará em tablets Windows 8 ARM. Usando essa solução alternativa, pode ser possível criar clientes de aplicativos Metro para aplicativos de área de trabalho clássicos, como antivírus, clientes de torrent / P2P, etc.

Em uma situação em que você tem o front-end da UI construído usando o novo estilo Metro de aplicativos para o Windows 8 e gostaria de se comunicar com um aplicativo .NET em execução na área de trabalho na mesma máquina local (por exemplo, um aplicativo de serviço do Windows).

Quais formas de comunicação entre processos estão disponíveis entre o aplicativo Metro e o aplicativo para desktop?

Obrigado a Pavel Minaev da equipe do Visual Studio, que forneceu algumas informações iniciais aqui em um comentário, citado:

De acordo com Martyn Lovell, não há nenhum mecanismo deliberado para isso, e alguns que poderiam ser usados ​​para isso são intencionalmente restritos. Os pipes nomeados não estão lá, por exemplo, nem são arquivos mapeados na memória. Existem sockets (incluindo sockets de servidor), mas quando se liga a localhost, só pode ligar à mesma app. Você pode usar arquivos normais em uma das "pastas conhecidas" compartilhadas (Documentos, Imagens, etc), mas isso é um hack bastante grosseiro que necessita de pesquisa e é visível para o usuário. - Pavel Minaev comentando sobre esta questão

Então, ao falhar nas abordagens normais, eu estava pensando em usar serviços da Web ou leitura / gravação em um banco de dados para obter alguma forma de comunicação, os quais parecem um exagero quando os processos estão sendo executados na mesma máquina.

É o que estou tentando fazer aqui? Posso ver a necessidade de um aplicativo metropolitano ser a interface do usuário front-end de um serviço existente que está sendo executado na área de trabalho. Ou é melhor usar apenas o WPF para a interface do usuário frontend executada na área de trabalho (ou seja, um aplicativo não metropolitano).


Christophe Nasarre blogged sobre uma maneira bastante hacky de fazer isso usando arquivos locais. O resultado é a comunicação entre o aplicativo de desktop app / windows store (referido como DA / WSA no blog), sem ter que alternar entre a interface do usuário dos dois aplicativos. Ele também blogou sobre outra técnica menos hacky envolvendo manipuladores de protocolo.

Observe que ter um WSA que se comunica com um DA é explicitamente proibido pelos requisitos de certificação do aplicativo store .

Os aplicativos da Windows Store não devem se comunicar com aplicativos ou serviços de área de trabalho locais por meio de mecanismos locais, inclusive por meio de arquivos e chaves do Registro.

... mas restringe apenas "mecanismos locais". Então eu acho que se pode construir um serviço web para rotear as comunicações.


Há um article no InfoQ sobre como construir aplicativos Metro fracamente acoplados com manipuladores de protocolo. Isso é algo que tem sido suportado pelo Windows há muito tempo e pode-se prever que um aplicativo de desktop se registre como um manipulador de protocolo e talvez o aplicativo metropolitano possa se comunicar por meio desse mecanismo.

Eu não tenho ideia se isso é possível, mas pode ser interessante verificar.


Houve uma série de perguntas como esta no final de uma // build / session que participei. Aleš Holeček, o executivo que fez uma das grandes sessões, saiu do público para lidar com eles. Mesmo que você não seja um desenvolvedor de C ++, faça o download dessa sessão e assista ao Q & A. http://channel9.msdn.com/Events/BUILD/BUILD2011/TOOL-789C

Os aplicativos do Metro não podem contar com aplicativos ou serviços de desktop instalados na máquina. E os aplicativos para computador não podem contar com aplicativos Metro em execução, pois podem ser suspensos a qualquer momento. Você precisa começar a pensar de maneira diferente. Ouça Aleš neste.


Se você acha que pode fazer uma operação cmd manual adicional, tente:

X:/> CheckNetIsolation.exe LoopbackExempt a n=<packageID>;

O CheckNetIsolation.exe está incluído na instalação do winRT, portanto não há nada extra a ser instalado.

Eu tentei: funciona, mesmo após a atualização do pacote.

Conforme mostrado em: http://msdn.microsoft.com/en-us/library/windows/apps/Hh780593.aspx

Aqui é explicado como descobrir o packageID para seu aplicativo: http://social.msdn.microsoft.com/Forums/windowsdesktop/en-US/82bad7d4-d52b-4731-a396-13ab9004c1cc/how-to-get-the-appid-of-a-metro-style-app-


Talvez eu tenha perdido o ponto, mas ao ativar o recurso de redes privadas, posso conectar-me a um servidor local em execução (http) usando o endereço IP local (não o host local). Isso permite meu cenário em que um aplicativo winrt se comunica com um aplicativo de área de trabalho wpf





windows-runtime