Implementando una aplicación de Windows 8 Metro que usa SQLite
windows-8 microsoft-metro (1)
Quería publicar los detalles de una solución temporal con la que vamos. También nos hemos acercado a la raíz del problema, así que también quería proporcionar esos detalles.
Resumen de la cuestión
Cuando se hace referencia al paquete de tiempo de ejecución de Visual C ++ de nuestro proyecto Metro, System Center no puede implementar la aplicación en los dispositivos porque existe un problema al implementar la versión adecuada de la dependencia para la arquitectura y el tipo de compilación adecuados.
Nuestras máquinas de desarrollo que ejecutan Visual Studio 2012 (y empaquetan el proyecto para la implementación) están utilizando una versión más nueva de Visual C ++ Runtime (50727) que la disponible en una instalación nueva de Windows 8 (50712).
Trabajé con el equipo de System Center y confirmé que se trataba de un error en la versión que estábamos usando y que ya se ha solucionado en futuras versiones. Vamos a trabajar para mejorar el entorno, pero eso llevará un par de semanas.
Solución
Confirmé y probé la siguiente solución:
- Elimine la referencia al paquete Microsoft Visual C ++ Runtime Package del proyecto Metro
- Instale la versión x64 de Visual C ++ Redistributable para Visual Studio 2012 - http://www.microsoft.com/en-us/download/details.aspx?id=3
- Implementar la aplicación
Funciona como un encanto porque la versión correcta de la dependencia ya está allí. Obviamente, no es una solución a largo plazo si elegimos apuntar también a x86 y ARM, pero nos ayudará a superar este problema.
Fondo
Estamos usando System Center 2012 para implementar una aplicación de estilo Windows 8 Metro en las pizarras de Samsung en el campo que ejecuta Windows 8 Enterprise x64. Las listas se unen al dominio y tienen una conexión de DirectAccess persistente, lo que permite a System Center enviar aplicaciones y actualizaciones a los dispositivos.
Tenemos que implementar nuestra aplicación para potencialmente cientos de dispositivos en el campo, razón por la cual fuimos a la ruta de System Center. El certificado de firma de código se instala en todos los dispositivos mediante la Política de grupo. Para implementar la aplicación, simplemente proporcione la salida del paquete y especifique la colección de dispositivos para instalarla. La aplicación solo aparece en el dispositivo en unos minutos.
El problema que tenemos es que cuando System Center implementa nuestra aplicación, la dependencia de SQLite se pierde y ninguno de nuestros datos de acceso funciona.
Acerca de nuestro proyecto
Nuestra aplicación es una aplicación WinJS que utiliza SQLite como backend. Sin embargo, todo nuestro código de acceso a datos está en un proyecto WinMD de C # al que hace referencia el proyecto WinJS. Estamos usando la biblioteca sqlite-net para hablar con SQLite; incluimos la fuente para eso en nuestro proyecto C #.
En Visual Studio, instalamos la extensión SQLite para Windows Runtime como se describe en el artículo de Tim Heuer . La aplicación de Metro hace referencia a esto.
Pruebas usando otros métodos de despliegue
El acceso a datos de SQLite desde la aplicación funciona bien cuando se depura o se ejecuta localmente, tanto en Debug / Release como en x86 / x64.
El proceso de empaquetado de la aplicación proporciona un script de PowerShell que puede usar para instalar la aplicación y una licencia de desarrollador si es necesario. Al instalar nuestra aplicación utilizando el script de PowerShell, el acceso a los datos de SQLite también funciona bien. Verifiqué esto empaquetando e instalando las versiones Debug / Release y x86 / x64 de la aplicación.
Solución de problemas
Cuando la aplicación intenta usar SQLite por primera vez, vemos una excepción acerca de no poder encontrar el sqlite3.dll.
Hemos probado / verificado lo siguiente:
- Confirme que estamos implementando una versión Release / x64
- Examine la appx en WinRAR y verifique que contenga el sqlite3.dll
- Consulte la extensión "SQLite for Windows Runtime" del proyecto C # en lugar del proyecto WinJS
- También haga referencia al tiempo de ejecución de C ++, esto hizo que System Center fallara al implementar la aplicación. No sé por qué todavía, pero investigándolo.
ACTUALIZACIÓN El problema es que System Center tiene problemas para implementar la dependencia de Visual C ++ Runtime Library que necesita la biblioteca SQLite. Desafortunadamente, esto ya no es una cuestión de programación. Estamos recibiendo ayuda sobre esto y publicaré la corrección.