En una situación en la que tiene la interfaz de la interfaz de usuario construida con el nuevo estilo Metro de aplicaciones para Windows 8 y le gustaría que se comunique con una aplicación .NET que se ejecuta en el escritorio en la misma máquina local (por ejemplo, una aplicación de servicio de Windows).
¿Qué formas de comunicación entre procesos están disponibles entre la aplicación metro y la aplicación de escritorio?
Gracias a Pavel Minaev del equipo de Visual Studio, que ha proporcionado información inicial aquí en un comentario, citado:
Según Martyn Lovell, no existe ningún mecanismo deliberado para eso, y algunos que podrían usarse para ello están intencionalmente restringidos. Las canalizaciones con nombre no existen, por ejemplo, ni los archivos mapeados en memoria. Hay sockets (incluidos los sockets del servidor), pero cuando se conecta a localhost, solo puede conectarse a la misma aplicación. Podrías usar archivos normales en una de las "carpetas conocidas" compartidas (Documentos, Imágenes, etc.), pero ese es un truco bastante tosco que requiere sondeo y es visible para el usuario. - Pavel Minaev comentando sobre este tema.
Entonces, al fallar los enfoques normales, estaba pensando en usar servicios web o leer / escribir en una base de datos para que ocurriera alguna forma de comunicación, lo cual parece excesivo cuando los procesos se ejecutan en la misma máquina.
¿Tiene sentido lo que intento aquí? Puedo ver la necesidad de que una aplicación de metro sea la interfaz de usuario de un servicio existente que se ejecuta en el escritorio. ¿O es mejor simplemente usar WPF para la interfaz de usuario de la interfaz que se ejecuta en el escritorio (es decir, una aplicación que no sea metro)?
Respuestas:
Estoy portando mi proyecto existente a Win8 en este momento. Consiste en el servicio de Windows y la aplicación de bandeja que se comunican entre sí a través de NamedPipes WCF. Como ya sabrá, Metro no admite tuberías con nombre. Terminé usando TcpBinding para una conexión full duplex.
Esta publicación describe qué funcionalidad es compatible.
Aquí se muestra una muestra de mi servidor WCF que el cliente Metro puede consumir .
También tenga en cuenta que no puede usar WCF síncrono en Metro. Tendrá que usar un contenedor basado en tareas que solo es asíncrono.
Y gracias por tu pregunta. Fui un buen punto de partida para mí :)
fuente
Hubo una serie de preguntas como esta al final de una // construcción / sesión a la que asistí. Aleš Holeček, el ejecutivo que hizo una de las sesiones de imagen grande, salió de la audiencia para manejarlos. Incluso si no es un desarrollador de C ++, descargue esa sesión y vea las preguntas y respuestas http://channel9.msdn.com/Events/BUILD/BUILD2011/TOOL-789C
Las aplicaciones de Metro no pueden contar con la instalación de aplicaciones o servicios de escritorio en la máquina. Y las aplicaciones de escritorio no pueden contar con las aplicaciones de Metro en ejecución, ya que pueden suspenderse en cualquier momento. Tienes que empezar a pensar de manera diferente. Escuche a Aleš en este.
fuente
localhost
directamente a través de un socket TCP, ¿por qué le permitiría hacer lo mismo a través de WCF?Tenga en cuenta que con Windows 8.1 Update, la comunicación entre las aplicaciones de la Tienda Windows y los componentes de escritorio escritos en C # para .NET 4.5+ ahora es oficialmente compatible con las aplicaciones de carga lateral en escenarios empresariales:
Componentes intermedios de Windows Runtime para aplicaciones de Windows Store de carga lateral
Citar:
Aunque la implementación de este enfoque es un poco complicada al principio, permite una integración profunda en la Tienda Windows y los componentes del escritorio. Solo tenga en cuenta que, por el momento, no pasará la certificación pública de la Tienda Windows.
fuente
Hay un artículo sobre InfoQ sobre cómo crear aplicaciones Metro acopladas libremente con controladores de protocolo. Esto es algo que ha sido soportado por Windows durante mucho tiempo y uno podría prever que una aplicación de escritorio se registre como un controlador de protocolo y tal vez la aplicación metro pueda comunicarse a través de este mecanismo.
No tengo idea de si esto es posible, pero sería interesante comprobarlo.
fuente
Christophe Nasarre ha escrito en su blog sobre una forma bastante hacky de hacerlo utilizando archivos locales. El resultado es la comunicación entre la aplicación de escritorio y la aplicación de la tienda de Windows (denominada DA / WSA en el blog), sin tener que cambiar entre la interfaz de usuario de las dos aplicaciones. También escribió en su blog sobre otra técnica menos hacky que involucra a los controladores de protocolo.
Tenga en cuenta que tener una WSA que se comunique con un DA está explícitamente prohibido por los requisitos de certificación de la aplicación de la tienda
... pero restringe solo los "mecanismos locales". Así que supongo que se puede crear un servicio web para enrutar las comunicaciones.
fuente
Si cree que puede realizar una operación cmd manual adicional, puede intentar:
CheckNetIsolation.exe está incluido en la instalación de winRT, por lo que no hay nada adicional que instalar.
Lo probé: funciona, incluso después de la actualización del paquete.
Como se muestra en: http://msdn.microsoft.com/en-us/library/windows/apps/Hh780593.aspx
Aquí se explica cómo averiguar el ID de paquete para su aplicación: http://social.msdn.microsoft.com/Forums/windowsdesktop/en-US/82bad7d4-d52b-4731-a396-13ab9004c1cc/how-to-get- la-aplicación-de-una-aplicación-estilo-metro
fuente
Es posible comunicarse en la misma máquina desde la aplicación Metro a la aplicación de escritorio usando el servicio local. He implementado hace algún tiempo una simple "prueba de concepto", cómo omitir el sandbox de WinRT usando el servicio local. Todavía necesita algún tipo de "ingeniería social" o guía directa para instalar el servicio, pero de todos modos, es posible.
Sin embargo, no estoy seguro de las reglas de certificación sobre la comunicación del "servicio local" al agregar dicha aplicación a la Tienda Windows.
Muestra aquí
fuente
Tal vez me perdí el punto, pero al activar la capacidad de redes privadas, puedo conectarme a un servidor local en ejecución (http) usando la dirección IP local (no localhost). Esto habilita mi escenario donde una aplicación winrt se comunica con una aplicación de escritorio wpf
fuente