El rincón de JMACOE

Teléfono Windows 7 y aplicaciones «nativas», ¡el eslabón perdido!

Ok, toma una respiración profunda, muy profunda, ¿estás listo?

Lo que descubrí hoy fue un código FUNKY que Samsung había creado para establecer las propiedades de red del auricular de un teléfono de Windows 7. Tomando un vistazo debajo de la falda, me di cuenta de algo irreal. ¡La aplicación tiene DLLs no administradas dentro del archivo XAP!!!

Bueno, estás pensando, ¿y qué?, esto no es nada especial. Todo lo que he hecho es añadir de forma manual en el proyecto como una acción de construir contenido.

Es cierto, que han hecho eso, pero lo que se viene es aún más irreal.

Mirando «en» NetworkProfile.dll (código administrado de Silverlight), revela la VERDAD que todos hemos estado esperando escuchar, ¿es posible crear una aplicación «nativa» para Windows Phone 7? La respuesta es Afirmativa (con algunas salvedades).

Hay una DLL funky llamada Microsoft.Phone.InteropServices que vive en el GAC de todos los teléfonos WP7 que necesitamos para permitir el acceso al COM.

Ahora por este blog, sólo vamos a cubrir la clave «ComBridge» en la imagen de arriba. Al abrirlo en el reflector es sólo un método estático vacío. Pero su magia está oculta.

Ahora, para utilizar este archivo DLL en nuestra aplicación no puedes simplemente añadir una referencia, tienes que cargar el Assembly a través de reflexión, y llamar a sus métodos estáticos.

Assembly a = Assembly.Load("Microsoft.Phone.InteropServices, Version=7.0.0.0, Culture=neutral, PublicKeyToken=24eec0d8c86cda1e");

Ok, ahora lo hemos cargado. Tenemos que obtener el tipo (desde el espacio de nombres), obtener el método e invocarlo.

Type comBridgeType = a.GetType("Microsoft.Phone.InteropServices.ComBridge");
            MethodInfo dynMethod = comBridgeType.GetMethod("RegisterComDll", BindingFlags.Public | BindingFlags.Static);
            dynMethod.Invoke(null, new object[] { "Assembly.dll", new Guid("SomeGuidHere") });

Ok, ahora que estamos casi listos. Necesitamos limpiar todas las capacidades en WMAppManifest.xml y añadir la siguiente línea.

<Capability Name="ID_CAP_INTEROPSERVICES"/>

Una vez que hayas hecho esto, agrega un archivo XML en blanco en la raíz de la aplicación llamado «WMInteropManifest.xml» y añade el siguiente contenido al mismo.

<?xml version="1.0" encoding="UTF-8"?>
<Interop>
</Interop>

Sí, estoy consciente de que las etiquetas están vacías, no son necesarias. Una vez hecho todo esto, haz clic derecho y despliega tu aplicación. Antes de este punto, he encontrado que se necesita reiniciar el dispositivo para que realmente trabaje.

Eso es todo por ahora, voy a publicar más este próximo fin de semana acerca de cómo puedes tener acceso a la RIL (Radio Interface Layer), el Registro y acceso al sistema de archivos.

Arriba he mencionado algunas «advertencias». Seguro que ahora estás cargando archivos DLL nativos, pero tu aplicación sigue funcionando como una instancia administrada, y te obliga aun a las restricciones normales del sistema operativo. Aun seguirás vulnerable a tombstoned, kill, etc.

Cualquiera que quiera probar o necesita más información sobre este no dude en enviarme un correo electrónico a través de mi blog.

Comparte y diviertete: