Generalmente existen dos métodos de actualización de aplicaciones: uno es notificar al usuario (por ejemplo, enviando un correo electrónico) y pedirle que descargue el programa actualizado desde una dirección de sitio web designada; el otro es transferir la responsabilidad de la actualización del usuario al usuario; La propia aplicación, en lugar de que el usuario obtenga e instale una actualización de software, la propia aplicación cliente es responsable de descargar e instalar las actualizaciones desde un servidor conocido. La única intervención que el usuario debe realizar es decidir si desea instalar nuevas actualizaciones ahora o. más tarde. Evidentemente, este último es más amigable que el primero. Ahora puede ver productos reales que se parecen a este último enfoque, como Windows XP y Microsoft Money. El componente de actualización de la aplicación .NET presentado en este artículo puede proporcionar una funcionalidad similar.
1. Introducción al componente de actualización de aplicaciones .NET
El componente de actualización de aplicaciones .NET AppUpdater se desarrolla utilizando el marco .NET. Aunque AppUpdater no es un producto de Microsoft, siempre que agregue el componente a la barra de herramientas de VS.NET, puede arrastrar y soltar el componente desde la barra de herramientas en su aplicación como si usara otros componentes. Después de configurar algunas propiedades (como la ubicación). y frecuencia de obtención de actualizaciones, etc.), su aplicación cliente puede tener la función de actualización automática.
2. Principio de funcionamiento
Para comprender en profundidad el principio de funcionamiento del componente de actualización de la aplicación cliente .NET, es necesario estudiar detenidamente lo que se debe hacer para implementar la actualización de la aplicación cliente. El primer paso es verificar si hay una actualización; cuando se encuentre una actualización, comience el segundo paso: descargue la actualización cuando se complete la descarga de la actualización, continúe con el último paso: implemente la actualización.
(1) Buscar actualizaciones.
Como desarrollador, primero debe indicarle a la aplicación dónde buscar actualizaciones. De lo contrario, ¿no sería como buscar una aguja en un pajar? En segundo lugar, determine cuándo buscar actualizaciones. Es imposible para el usuario ejecutar el programa cliente cada vez y constantemente busca actualizaciones en segundo plano. ¡Qué desperdicio de recursos! Una última cosa importante a abordar es cómo buscar actualizaciones. El componente .NET Application Update utiliza HTTP para la comunicación, lo que permite que las aplicaciones cliente realicen actualizaciones a través de firewalls. Y la dirección requerida para la verificación de actualizaciones se convierte en una dirección URL de un servidor web conocido, y el primer problema se resuelve con éxito.
El componente de actualización de la aplicación .NET genera un hilo basado en la generación del componente, que es responsable de la verificación de actualizaciones. Este hilo duerme la mayor parte del tiempo, pero se activa a intervalos establecidos y realiza una verificación de actualización. La frecuencia con la que una aplicación busca nuevas actualizaciones depende de la aplicación. Los valores comunes para el intervalo entre comprobaciones de actualizaciones suelen oscilar entre una hora y varios días. Este enfoque básico de las encuestas no es adecuado para todas las situaciones. Por ejemplo, Microsoft Money sólo busca actualizaciones cuando el usuario lo solicita. En este caso, el hilo de sondeo de actualización se puede desactivar.
La verificación de actualizaciones se implementa llamando al método CheckForUpdate() del componente de actualización con un comando.
Existen varios métodos para realizar comprobaciones de actualizaciones:
Método 1: Comprobación directa de archivos: utilice HTTP para comparar la fecha y hora de la última modificación del servidor y las aplicaciones cliente para ver si son coherentes. Si hay un archivo actualizado en el servidor, el cliente sabe que puede actualizarse él mismo. Lo mismo ocurre con un navegador web, que sabe si necesita volver a descargar una página o imagen HTML o si puede reutilizar una descargada previamente. Cuando está disponible una nueva versión de la aplicación, el administrador simplemente copia la versión más nueva sobre la versión anterior en el servidor web. El problema con este enfoque es que la actualización no es automática, por lo que existe la posibilidad de que falle. Por ejemplo, si un administrador está actualizando la versión de una aplicación en un servidor web y un cliente está descargando una versión antes de la actualización, entonces la computadora del cliente tendrá algunos archivos anteriores a la actualización, así como algunos archivos de la nueva versión. versión después de la actualización del documento. Por los motivos anteriores, no se recomienda la comprobación directa de archivos en busca de actualizaciones para aplicaciones críticas.
Método 2: verificación explícita: utilice un archivo de configuración explícito en el servidor. Un archivo explícito de servidor válido para usar con componentes de actualización de aplicaciones .NET tiene un aspecto similar al siguiente: ..
<VersionConfig>
<Versión disponible>1.0.0.0</Versión disponible>
<Url de la aplicación> http://localhost/demos/selfupdate/V1/ </
URL de aplicación>
</VersionConfig>
AvailableVersion especifica el número de versión del último ensamblado disponible. El atributo ApplicationURL especifica la dirección URL donde se encuentra esta versión de la aplicación. Cuando los administradores desean actualizar una aplicación cliente, copian la nueva versión de la aplicación al servidor web y modifican los archivos explícitos del servidor de manera adecuada. El propio cliente detectará que el archivo explícito del servidor ha sido modificado y luego descargará el archivo explícito. Luego, el cliente compara el número de versión del ensamblado especificado en el archivo explícito con el número de versión del archivo EXE de la aplicación. Si hay un número de versión más reciente disponible en el archivo explícito del servidor, la aplicación sabe que necesita ser actualizado. Este método se recomienda para la mayoría de las aplicaciones.
Método tres: verificación del servicio web XML: XML WebServices proporciona un método de verificación de actualizaciones más avanzado. Por ejemplo, suponga que desea actualizar un conjunto de usuarios iniciales antes de actualizar los demás usuarios. Si la aplicación cliente llama a un servicio web XML para verificar si hay una actualización disponible, ese servicio web XML también puede consultar la base de datos para esa actualización. y determinar si el usuario es uno de los primeros usuarios. Si son usuarios iniciales, el servicio web XML devuelve un valor que indica que hay actualizaciones disponibles. De lo contrario, el servicio web devuelve un valor que indica que la actualización no está disponible. Sin embargo, el componente de actualización de la aplicación .NET presentado en este artículo no proporciona soporte directo para el servicio web XML.
Para utilizar el servicio web XML para realizar comprobaciones de actualizaciones, primero cree un servicio web XML y enlace un evento OnCheckForUpdate. Esto le permite escribir sus propias comprobaciones personalizadas en lugar de las comprobaciones de actualización del hilo del sondeador. El evento OnCheckForUpdate tiene un valor de retorno que indica si se detectó una actualización.
(2) Descargar actualizaciones
Cuando el componente de actualización de la aplicación .NET detecta que hay una nueva actualización disponible, automáticamente iniciará otro hilo e iniciará la descarga asíncrona de actualizaciones en segundo plano.
La descarga se realiza mediante HTTP-DAV. DAV es una versión extendida de HTTP, que proporciona funciones como la enumeración de directorios y archivos. Un proceso de descarga completo comienza especificando una URL. La URL utilizada para la descarga depende del método utilizado para completar la verificación de actualización. Por ejemplo, si utiliza archivos explícitos del servidor, la URL utilizada para descargar actualizaciones se especifica mediante el atributo ApplicationURL en el archivo explícito del servidor.
La descarga de actualizaciones obviamente requiere cierta solidez. Es inaceptable dejar una aplicación cliente en un estado inestable después de descargarla y actualizarla. Pueden ocurrir diversos problemas durante el proceso de descarga: el servidor web al que pertenece el archivo de actualización puede no funcionar, la máquina cliente puede fallar o el usuario puede simplemente cerrar la aplicación por algún motivo. Dado que la aplicación se está descargando, si se cierra, la descarga se detendrá. Una solución de diseño alternativa es utilizar servicios de sistema separados para descargas y actualizaciones de aplicaciones. Al utilizar los servicios del sistema, las descargas de actualizaciones continúan incluso cuando la aplicación no se está ejecutando. De hecho, Windows XP tiene un servicio de descarga integrado llamado BITS, que sirve para este propósito. Windows XP utiliza BITS para descargar y actualizar el propio Windows. Para obtener más información sobre BITS, consulte http://msdn.microsoft.com/library/en-us/dnwxp/html/WinXP_BITS.asp . Este servicio no se utiliza en el componente de actualización de aplicaciones .NET, por lo que se puede utilizar en Windows 9x, que no admite servicios del sistema.
(3) Implementación de actualizaciones
El componente de actualización de la aplicación .NET gana solidez al dividir los procesos de descarga y actualización en dos fases separadas. Cuando se completa cada etapa, se registra en un archivo de manifiesto actualizado ubicado en el directorio de la aplicación cliente. Si el proceso de descarga o actualización se interrumpe en cualquier etapa, se reanudará el trabajo original desde el último punto de interrupción completado la próxima vez que se inicie la aplicación. Cada etapa se puede volver a ejecutar, por lo que si ocurre una falla en medio de una etapa, la repetición de la etapa será exitosa. Si se produce un error, como que se pierda la conexión con el servidor durante la descarga, el componente de actualización .NET lo intentará nuevamente más tarde. Si se informan demasiados errores (por ejemplo, el servidor web nunca vuelve a estar en línea), se cancelarán las descargas y actualizaciones y se informarán los errores.
Nuestro primer enfoque es simplemente iniciar un proceso separado para implementar la actualización. Este proceso separado primero cerrará el proceso de solicitud, implementará la actualización (ya que ahora está desbloqueada), reiniciará el proceso de solicitud y luego se cerrará cuando termine. Por lo tanto, hay tres problemas básicos con este diseño:
En algunos casos no funciona. Cuando se actualiza una aplicación, el proceso de actualización cierra el proceso de aplicación original y el proceso de actualización en sí también se cierra, por lo que la actualización no se implementará.
Queremos poder actualizar automáticamente todo el código que necesita ser actualizado. Queremos tener la capacidad de instalar parches automáticamente no solo en la aplicación, sino también en el propio componente de actualización de la aplicación .NET. Usando este modo, no podemos actualizar el proceso que implementa la actualización.
Es de mala educación obligar al usuario a cerrar la aplicación y esperar mientras la usa.
El último método utilizado para implementar actualizaciones de aplicaciones es utilizar el patrón de ensamblaje paralelo de .NET Framework. Como alternativa a intentar actualizar la aplicación en sí, genere una versión más nueva de la aplicación que la versión existente actualmente.
Se pueden generar nuevas versiones fusionando el catálogo de aplicaciones existente actualmente con las versiones actualizadas descargadas. Cuando se complete la nueva versión, el usuario usará automáticamente la nueva versión la próxima vez que vuelva a abrir la aplicación. Luego se puede eliminar la copia de la solicitud original. Lo complicado es determinar qué versión se debe cargar en un momento dado. Introducimos una aplicación llamada Appstart. Appstart es el punto de entrada a su aplicación. Al utilizar este modo, el directorio de su aplicación se ve así: ..
--> Archivos de programa
--> MyApp
--> Appstart.exe
--> Appstart.config
- -> Carpeta V1
. > MyApp.exe
--> Carpeta V1.1
--> MyApp.exe
Para ejecutar su aplicación, normalmente inicia Appstart.exe. Si desea tener una tecla de acceso directo en el escritorio, esa tecla de acceso directo debe apuntar a Appstart y no directamente a la aplicación (tenga en cuenta que puede cambiar el nombre de AppStart.exe a cualquier cosa que desee, como YourApp.exe). Appstart.exe es un programa muy simple que lee el archivo Appstart.config y carga la aplicación especificada. Un archivo Appstart.config válido tiene este aspecto:
<Config>
<Nombre de la carpeta de aplicaciones>Carpeta V1</Nombre de la carpeta de aplicaciones>
<AppExeName>MyApp.exe</AppExeName>
<AppLaunchMode>appdomain</AppLaunchMode>
</Configuración>
AppFolderName especifica la subcarpeta que contiene la versión de la aplicación que se está ejecutando actualmente. AppExeName contiene el nombre del archivo exe que se cargará en esa carpeta. Cuando se completa una actualización de la aplicación, el paso final es modificar el valor de AppFolderName para que apunte a la nueva versión de la aplicación. De esta forma, la próxima vez que el usuario ejecute la aplicación, se ejecutará la nueva versión actualizada de la aplicación. AppLaunchMode especifica cómo se carga la aplicación. Hay dos formas de cargar aplicaciones: la primera es utilizar AppDomains. AppDomains es una característica de .NET framework common language runtime y también es una unidad lógica independiente y un objeto de gestión. Common Language Runtime permite múltiples dominios de aplicaciones por proceso. De esta manera, Appstart.exe puede cargar su aplicación en un AppDomain separado pero en el mismo proceso AppStart.exe. A pesar de que hay dos programas exe diferentes en ejecución (es decir, Appstart.exe y MyApp.exe), solo se utiliza un proceso. AppDomains funcionará bien para la mayoría de las aplicaciones, aunque existen algunas diferencias sutiles entre ejecutarse en un AppDomain separado y ejecutarse en un proceso separado. En este caso, AppLaunchMode se puede configurar en "proceso", lo que hará que la aplicación se cargue en un proceso separado.
Una vez que Appstart inicia la aplicación, se pone en suspensión esperando a que finalice. Una vez finalizada la aplicación, Appstart también se cierra.
3. Tutorial de ejemplo
Anteriormente analizamos cómo funciona la actualización de aplicaciones .NET, ahora apliquemoslo a un ejemplo.
Paso 1: Cree una aplicación para actualizar
1. Utilice VS.NET para generar un nuevo proyecto de aplicación de Windows, denominado "SampleApp".
2. Dale al formulario un color de fondo interesante de tu elección. Usaremos un color de fondo para diferenciarlo de versiones actualizadas posteriores.
3. Ahora agreguemos una característica sutil a esta aplicación. Primero, agregue un botón a su formulario. El archivo comprimido contiene un ensamblaje con un formulario Windows Form simple. Agregue una referencia al ensamblado SamplesSampleAppSimpleForm en el archivo comprimido. Luego agregue dos líneas de código al controlador de eventos de su botón:
..
SimpleForm.Form1 F = nuevo SimpleForm.Form1();
F.Mostrar();
4. Convierta su indicador de compilación de depuración a RELEASE. Esto nos permitirá evitar problemas de bloqueo de archivos pdb más adelante cuando creemos una nueva versión de la aplicación mientras se ejecuta la copia original. Construya y pruebe su aplicación.
Paso 2: Agregue el componente de actualización de la aplicación .NET
1. En la pestaña Componentes de la barra de herramientas VS.NET, haga clic derecho y seleccione "Personalizar barra de herramientas". Seleccione la pestaña "Componentes de .NET Framework". Haga clic en "Examinar" y seleccione AppUpdater.dll ubicado en el proyecto AppUpdater en el archivo comprimido, haga clic en Aceptar.
2. Ahora debería aparecer un icono de AppUpdater en la parte inferior de la lista de componentes de la barra de herramientas. Arrastre y suelte el componente AppUpdater en el formulario SampleApp. En la parte inferior del formulario aparece una instancia del componente de actualización de aplicaciones .NET denominado appUpdater1.
Paso 3: Configurar el componente de actualización de la aplicación .NET
En este paso configuraremos el componente de actualización de la aplicación .NET. Tenga en cuenta que en este ejemplo sólo necesita cambiar las primeras cuatro propiedades y dejar el resto con sus valores predeterminados.
Atributo AppUpdater: este es el núcleo de la actualización de la aplicación .NET. Se deben realizar las siguientes configuraciones para este programa:
(1) AutoFileLoad: controla las características de descarga del comando que se describirán más adelante.
(2) ChangeDetectionMode: esta enumeración determina cómo buscar actualizaciones. En este ejemplo, usaremos una verificación explícita del servidor, así que establezca este valor en "ServerManifestCheck".
(3) ShowDefaultUI: el componente de actualización de la aplicación .NET tiene una serie de interfaces de usuario para notificar a los usuarios sobre algunos eventos, como una nueva actualización disponible o un error que ocurre durante la actualización. Esta interfaz de usuario se puede desactivar configurando la interfaz de usuario predeterminada como no válida y reemplazándola con una interfaz de usuario personalizada y específica de la aplicación, conectándose a los eventos apropiados (p. ej.
OnUpdateComplete) y aparecerá la interfaz de usuario personalizada. Para este ejemplo usaremos la interfaz de usuario predeterminada, así que establezca este valor en verdadero.
(4) UpdateUrl: UpdateUrl determina dónde buscará actualizaciones el programa de actualización. En este ejemplo, utilizamos un archivo explícito del servidor para buscar actualizaciones, por lo que esta propiedad debe establecerse en la URL del archivo explícito del servidor.
En este ejemplo, configúrelo en: http://yourWebserver/SampleApp_ServerSetup/UpdateVersion.xml . Reemplace "yourWebserver" con el nombre de su servidor web.
Propiedad del descargador: el componente AppUpdater tiene dos subcomponentes. El primero se llama Downloader, que controla la descarga y las propiedades de Poller del componente: El segundo subcomponente de AppUpdater es Poller, que controla la verificación de actualizaciones.
(1) Inicio automático: valor booleano que controla si Poller debe comenzar a sondear cuando se inicia la aplicación o si debe esperar hasta que comience una consulta de actualización planificada.
(2) DownloadOnDetection: valor booleano, controla si Poller comienza a descargar actualizaciones inmediatamente cuando se descubre una nueva actualización, o si comienza la descarga explícita llamando al método DownloadUdpate().
(3)InitialPollInterval: la cantidad de segundos que se deben esperar antes de realizar la primera verificación de actualización después de iniciar la aplicación.
(4)PollInterval: después de la primera verificación de actualización, PollInterval controla la cantidad de segundos entre cada verificación de actualización posterior. Nota: el valor predeterminado es verificar cada 30 segundos, obviamente, querrá que su aplicación reduzca la cantidad de comprobaciones de actualización. .
Una vez hecho todo esto, su tabla de propiedades debería verse así:
El directorio SamplesSampleAppSampleApp_Complete contiene una versión correctamente instalada de la aplicación.
Instalación:
(1) Intentos de reintento de descarga: si se produce un error durante la descarga (como que el servidor web no funciona), el programa de descarga intentará nuevamente más tarde. Esta propiedad controla la cantidad de veces que el descargador reintenta una solicitud de red antes de considerarla un error completo de actualización de la aplicación.
(2) SecondsBeteweenDownloadRety: la cantidad de segundos que se deben esperar antes de volver a intentar la solicitud de red.
(3) UpdateRetryAttempts: si ocurre un error grave durante la actualización (por ejemplo, el descargador excede el número de reintentos), se generará un error de actualización de la aplicación. De forma predeterminada, se detendrán los intentos de actualización. Pero intentará recuperarse la próxima vez que se inicie la aplicación (por ejemplo, la actualización del servidor web puede estar inactiva durante varios días). Esta propiedad controla la cantidad de veces que se intenta una actualización. Si se excede este valor, el actualizador cancela la actualización, restablece su estado y vuelve a la verificación de actualizaciones.
(4)ValidateAssemblies: este atributo controla el nivel en el que los ensamblados descargados se completan efectivamente. Consulte la sección Seguridad de este artículo para obtener más información.
Paso 4: Generar e implementar la versión V1 de la aplicación en el cliente.
En el proyecto SampleApp, abra el archivo AssemblyInfo.cs. Modifique el valor de AssemblyVersion de "1.0" a "1.0.0.0". Esto provoca que al construir el ensamblado se obtenga una etiqueta con el valor "1.0.0.0".. en lugar del valor que normalmente VS.NET especifica como incremento.
1. Cree la aplicación.
2. Copie el directorio SamplesSampleAppSampleApp_ClientSetup del archivo comprimido a su máquina local. Tenga en cuenta que este directorio ya contiene AppStart.exe. AppStart.config se ha configurado para que apunte al directorio 1.0.0.0 e inicie SampleApp.exe.
Copie SampleApp (Appupdater.dll, SimpleForm.dll y SampleApp.exe) del directorio de lanzamiento de SampleApp
al directorio del cliente SampleApp_ClientSetup1.0.0.0. En este punto, se ha "instalado" una versión completamente funcional de la aplicación en el cliente y se puede ejecutar ejecutando AppStart.exe.
Paso 5: Instale el servidor web
En este paso instalaremos el servidor web para proporcionar la funcionalidad de sondeo de actualizaciones. El componente de actualización de aplicaciones .NET utiliza HTTP-DAV para descargar actualizaciones de aplicaciones y, por lo tanto, requiere un servidor web que admita HTTP-DAV. IIS5.0 en Windows 2000 y sistemas operativos más recientes admiten HTTP-DAV.
1. Copie el directorio Samples/SampleApp_ServerSetup al directorio wwwroot de su servidor web.
2. Copie la versión V1 de SampleApp a la carpeta 1.0.0.0 del servidor web.
3. Habilite el permiso "Explorar directorio" de IIS para el directorio SampleApp_ServerSetup en el servidor web.
Paso seis: Actualizar aplicaciones automáticamente
OK,... Ahora es el momento de ver los resultados de todo este arduo trabajo instalando automáticamente una nueva versión.
1. Si la versión de SampleApp que implementó en el cliente no se está ejecutando, cárguela y déjela ejecutar. Recuerde usar AppStart.exe.
2. Regrese a VS.NET y realice algunos cambios notables en el formulario SampleApp (como cambiar el color de fondo).
3. Cambie la información de la versión de AssemblyInfo.cs a 2.0.0.0.
4. Regenerar.
5. Regrese al servidor web y genere un directorio 2.0.0.0 que sea equivalente al directorio 1.0.0.0. Copie la nueva versión de la aplicación desde el directorio de generación de versiones al directorio 2.0.0.0 recién creado en el servidor web.
6. Abra UpdateVersion.xml y modifique AvailableVersion a 2.0.0.0. Modifique ApplicationURL para que apunte a la nueva ruta 2.0.0.0.
7. Guarde los cambios realizados en UpdateVersion.xml.
Una vez que guarde el nuevo UpdateVersion.xml, dentro de 30 segundos, la ejecución de copias de SampleApp detectará la nueva versión disponible.
4. Instalación bajo demanda, seguridad, escalabilidad y depuración
(1) Instalación bajo demanda
La llamada instalación bajo demanda significa que solo el programa ejecutable principal se instala explícitamente en la computadora cliente. El resto de la aplicación se puede descargar e instalar automáticamente según las necesidades básicas.
Inicie la instalación bajo demanda a través de la propiedad AutoFileLoad del componente de actualización de la aplicación .NET. Debe considerar cuidadosamente dónde se encuentran los límites del ensamblado dentro de su aplicación y qué acciones provocarán que se descargue el ensamblado. Debido a que la descarga del ensamblado implica entrada y salida de red, el tiempo que lleva la descarga es variable. Durante la descarga del ensamblado, la aplicación se congela esperando a que se complete la descarga del ensamblado.
(2) Implementación
La capacidad de instalar automáticamente actualizaciones de aplicaciones de forma segura tiene muchos beneficios, pero también conlleva algunos peligros potenciales. Cuando facilita la instalación de actualizaciones, también puede facilitar la instalación de código malicioso si no tiene cuidado. Existen dos peligros. El primer peligro es que alguien utilice su propio servidor web para engañar al servidor web utilizado para implementar las actualizaciones. Pueden usar ese servidor web para instalar un virus en la ruta de su aplicación. La forma más sencilla de evitar la suplantación de identidad u otras interferencias inadecuadas en la red es utilizar HTTPS. Para utilizar HTTPS con el componente de actualización de aplicaciones .NET, simplemente reemplace las URL HTTP con URL HTTPS. Por supuesto, HTTPS no es una solución milagrosa. Hay dos problemas con el uso de HTTPS. El primero es la escalabilidad. El uso de HTTPS requiere que el servidor cifre todos los archivos descargados del servidor web. Si los archivos de actualización de una aplicación son grandes, el costo de cifrarlos puede sobrecargar el servidor. Otro problema con el uso de HTTPS es que no beneficia el segundo peligro de seguridad. El segundo peligro es que los piratas informáticos puedan atacar su servidor tanto desde dentro como desde fuera. Si el ataque tiene éxito, puede significar que cientos o miles de clientes también se vean afectados por las actualizaciones automáticas, lo que sería catastrófico.
Para resolver este problema, el componente Actualización de aplicaciones .NET utiliza la función de nombre seguro para ensamblados .NET para verificar los ensamblados descargados. Si el componente de actualización de aplicaciones .NET detecta que un ensamblado no está firmado con su clave durante la descarga, la descarga se cancelará. Esto significa que sólo alguien con la clave privada de su aplicación puede crear actualizaciones que se puedan implementar automáticamente.
Para verificar que el ensamblado sea válido, el componente de actualización de aplicaciones .NET verifica que la clave pública del ejecutable de la aplicación instalada actualmente y la clave pública de la actualización descargada coincidan. Si dos ensamblados están firmados con la misma clave privada secreta, entonces la clave pública incorporada será la misma. Debido a que el ensamblado que carga el CLR verifica su clave pública, el CLR calcula su verificación de hash normal para garantizar que el ensamblado sea de hecho un ensamblado genuino y no un ensamblado manipulado. Para habilitar la validación en el momento de la descarga, agregue nombres seguros a todos los ensamblados de su aplicación y establezca la propiedad ValidateAssemblies del componente .NET Application Update en verdadero.
La verificación del ensamblaje en el momento de la descarga ayuda mucho, pero en la práctica, las aplicaciones suelen tener componentes firmados con diferentes claves privadas. Por ejemplo, su aplicación podría tener dos archivos: un ensamblado ejecutable firmado con su clave privada y otro ensamblado dll que contiene un control de gráfico de terceros que compró y utilizó en su aplicación. Los ensamblados de terceros se pueden firmar utilizando la clave privada de terceros en lugar de la suya propia. Para complicar aún más la situación, la configuración de claves privadas válidas utilizadas para firmar ensamblados en su aplicación puede cambiar de un número de versión a otro. ¿Cómo se actualizan automáticamente esos tipos de aplicaciones? Para resolver este problema, puede generar un ensamblado en su aplicación que contenga una lista de claves públicas válidas. Firme el ensamblado con la clave privada maestra de la aplicación (la clave utilizada para firmar el archivo exe de la aplicación) y coloque el ensamblado en un directorio en el servidor web con los archivos de actualización de la aplicación. Antes de que comience el proceso de descarga de la actualización, el componente de actualización de la aplicación .NET buscará un ensamblado llamado "AppUpdaterKeys.dll" en el directorio de actualización de la aplicación en el servidor web. Si está presente, se descarga el ensamblaje. El ensamblado se verifica con la clave pública de la aplicación principal. Si la firma es válida, se extrae la lista de claves. A partir de ahora, cualquier clave de esta lista se considerará una firma válida para el archivo actualizado.
El enfoque de seguridad recomendado es utilizar URL HTTPS para comprobar las actualizaciones. Esto proporciona el primer nivel de protección contra la suplantación de identidad. Para descargas de actualizaciones, es mejor no utilizar RL HTTPS para evitar sobrecargar su servidor web. En su lugar, agregue nombres seguros a los ensamblados de su aplicación y use la función de validación de ensamblados.
(3) Escalabilidad
En el ejemplo mencionado anteriormente en este artículo, simplemente arrastramos y soltamos un componente en la aplicación y configuramos algunas propiedades para lograr la implementación automática.
Si bien esto funciona bien en muchas aplicaciones, algunas requieren un alto nivel de control que sólo se puede obtener escribiendo código. Podemos escribir nuestro propio código para reemplazar el proceso estándar del componente de actualización de la aplicación .NET, utilizando los métodos CheckForUpdate() y ApplyUpdate() anulados para personalizar el comportamiento de verificación y actualización.
(4) Depuración
Esta sección señalará algunas opciones de depuración preferidas, así como también describirá los problemas más comunes que enfrentan los usuarios de este componente.
.NET Application Updater genera un archivo de registro oculto llamado AppUpdate.log en el mismo directorio que AppStart.exe.
Toda la información de éxito y error de la actualización se registra en este registro. El archivo de registro es particularmente útil cuando un cliente en particular no se actualiza correctamente.
Puede utilizar los registros para determinar cuándo y cómo fallaron las actualizaciones. Además, el componente .NET Application Update utiliza la clase Debug de .NET Framework para generar una gran cantidad de información útil. Si ejecuta su aplicación en el depurador, verá esta información en la ventana de salida. Puede seguir los registros del Actualizador de aplicaciones .NET para resaltar y encontrar las áreas problemáticas.
Si por alguna razón no puede hacer que funcione el Actualizador de aplicaciones .NET, asegúrese de lo siguiente antes de profundizar en la depuración. El problema que está encontrando probablemente sea uno de los siguientes: ..
¿Navegaste hasta IIS? directorio? De lo contrario, el actualizador no descargará ni instalará ningún archivo.
¿Implementaste todo correctamente y configuraste la URL correctamente?
Si su aplicación está instalada en el directorio de archivos del programa, ¿está seguro de que es el superadministrador o superusuario de la máquina? De lo contrario, no tendrá acceso de escritura para actualizar la aplicación.
¿Está generando el objeto AppUpdater en el hilo principal de la interfaz de usuario de la aplicación? De lo contrario, el actualizador no podrá mostrar la interfaz de usuario y fallará al devolver un evento a la interfaz de usuario.
¿La actualización se realiza correctamente pero la aplicación no se reinicia automáticamente con la nueva actualización? El componente .NET Application Update intenta salir de la aplicación llamando al método Application.Exit. Sin embargo, este método no garantiza el cierre de una aplicación. Si genera y deja un hilo separado en ejecución, este método no puede cerrar el proceso. La solución para garantizar que todos los subprocesos terminen es llamar al evento Application.OnExit o conectarse al evento OnUpdateComplete del actualizador de la aplicación .NET y manejar el cierre usted mismo.
5. Resumen
La implementación conveniente de aplicaciones cliente es un objetivo importante de la primera versión del marco .NET. El uso de .NET framework es una excelente técnica para crear aplicaciones cliente que resuelvan problemas de implementación. La facilidad de implementación sigue siendo un objetivo importante para futuras nuevas versiones de .NET Framework. Como solución, el componente de actualización de la aplicación .NET que se describe aquí representa algunas de nuestras ideas que podremos usar directamente en versiones futuras de .NET Framework. Sin embargo, en el período previo a que llegue ese momento, el componente de actualización de aplicaciones .NET puede considerarse como una forma importante de comenzar a crear aplicaciones de actualización automática.
De: csdn, lo vi en Tianji, todavía no lo he estudiado detenidamente. Lo dejaré para más adelante.