Muchas veces en el desarrollo de software necesitamos estar constantemente actualizando el sistema, para esto no es nada viable estar conectándonos con el cliente o enviarles el instalador, por eso hoy crearemos la funcionalidad de buscar actualizaciones en C#.
¿Te imaginas estar conectándote vía remota a tu cliente para actualizarle el sistema?
Incluso enviarles el instalador es poco profesional, hoy veremos como implementar una solución para esto.
La idea simple, agregar la funcionalidad de buscar actualizaciones en C# para que nuestro cliente únicamente haga clic en ‘Buscar actualizaciones’.

¿Necesitas aprender algo nuevo ? Ve a Udemy, busca el tema del que quieres aprender, selecciona el curso para ti y continua con tu aprendizaje.
UdemyPor supuesto detrás de esto está la programación de conectarse a un servicio web para traer la última versión y en caso de que sea mayor a la que el cliente tiene hacer la descarga.
En este post veremos la primera parte de este tema que será conectarse a revisar la versión, descargar el instalador y ejecutarlo.
En un próximo artículo veremos cómo crear un instalador profesional, por el momento descargaremos cualquier instalador de prueba.
Lo que haremos
Como hemos dicho agregaremos al menú de nuestro sistema la opción ‘Buscar actualizaciones’.
Cuando el usuario haga clic en él mostrará una ventana donde se irá mostrando el proceso paso a paso.
Primero verificará si hay actualizaciones, si no hay te mencionará que ya tienes la última versión, si existe una versión disponible te habilitará el botón de ‘Actualizar’.
Si el usuario hace clic en ‘Actualizar’ comenzará la descarga del instalador, en este caso un .exe demo, ejecutará este instalador y saldrá del programa para evitar conflictos en la instalación.
Cabe mencionar que el servicio web al que se conectará a comprobar la versión estará creado en PHP.
¿Suena fácil no? Realmente lo es y además resulta bastante útil.
Código PHP
Primero veamos nuestro código PHP que compone el servicio web de consulta de versión.
Aunque ahora solo está en código posteriormente se podrá implementar una interfaz y conexión a base de datos pero la idea es la misma.
$version = 0.0; if(isset($_GET['v'])){ $version = $_GET['v']; } /* VERSIÓN ACTUAL */ $current_version = 1.1; $current_downloadUrl = "..../ws/versions/1_1/**********.exe"; /* VERSIÓN ACTUAL */ $status_code = 0; if( floatval($current_version) > floatval($version) ){ $status_code = 1; } $response->status_code = $status_code; $response->newversion_url = $current_downloadUrl; $response->newversion_version = $current_version; $response = json_encode($response); echo $response;
El resultado de este servicio web es regresado en formato JSON.
Tal vez te interesa imprimir un form con PrintDocument.
Código C#
Antes de ver el código principal de este proyecto es importante mencionar que necesitamos crear un archivo config_version.cfg.
Este archivo nos servirá para saber la versión del sistema actual, su contenido es el siguiente:
{ "version" : "1.0" }
Como puedes ver solo es el número de versión en formato JSON.
Este archivo debe de ir en la raíz del proyecto o el release.
En nuestra ventana principal al hacer doble clic en la opción ‘Buscar actualizaciones’:
Search_Updates update = new Search_Updates(); update.Show(); update.init();
Ahora si veamos el código de la ventana de buscar actualizaciones.
public partial class Search_Updates : Form { public float current_version = 1.0f; public String current_downloadUrl; public static String WSVersions = "https://......./softwaregc/"; public Search_Updates() { InitializeComponent(); } public void init() { CheckForIllegalCrossThreadCalls = false; if (File.Exists("config_version.cfg")) { String config_json = File.ReadAllText("config_version.cfg"); Config config = JsonConvert.DeserializeObject<Config>(config_json); current_version = config.version; } Thread threadCheckVersion = new Thread(() => { connectWSVersions(current_version); }); threadCheckVersion.Start(); } private void connectWSVersions(float v) { textBox1.Text = "Revisando si tienes la última versión.."; try { using (WebClient webClient = new WebClient()) { webClient.BaseAddress = WSVersions; var json = webClient.DownloadString("ws/check.php?v=" + v); WsUpdate wsUpdate = JsonConvert.DeserializeObject<WsUpdate>(json); if (wsUpdate.status_code == 1) { current_downloadUrl = wsUpdate.newversion_url; textBox1.AppendText(Environment.NewLine); textBox1.AppendText("Existe una nueva versión disponible: " + wsUpdate.newversion_version); button2.Enabled = true; } else { textBox1.AppendText(Environment.NewLine); textBox1.AppendText("Ya tienes la última versión: " + wsUpdate.newversion_version); button2.Enabled = false; } } } catch (WebException ex) { throw ex; } } private void connectWSDownload(float v) { textBox1.AppendText(Environment.NewLine); textBox1.AppendText("Conectando al servidor..."); try { using (WebClient webClient = new WebClient()) { webClient.DownloadProgressChanged += new DownloadProgressChangedEventHandler(DownloadProgressCallback); webClient.DownloadFileCompleted += new AsyncCompletedEventHandler(DownloadFileCallbackComplete); textBox1.AppendText(Environment.NewLine); textBox1.AppendText("Descargando última versión..."); webClient.DownloadFileAsync(new Uri(current_downloadUrl), Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData) + "\\upgrade.exe"); } } catch (WebException ex) { throw ex; } } private void DownloadProgressCallback(object sender, DownloadProgressChangedEventArgs e) { progressBar1.Value = e.ProgressPercentage; } private void DownloadFileCallbackComplete(object sender, AsyncCompletedEventArgs e) { if (e.Cancelled) { textBox1.AppendText(Environment.NewLine); textBox1.AppendText("Descarga cancelada por el usuario."); } if (e.Error != null) { textBox1.AppendText(Environment.NewLine); textBox1.AppendText(e.Error.ToString()); } if (!e.Cancelled && e.Error == null) { textBox1.AppendText(Environment.NewLine); textBox1.AppendText("Instalador descargado correctamente."); textBox1.AppendText(Environment.NewLine); textBox1.AppendText("Guardado en: " + Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData) + "\\upgrade.exe" ); textBox1.AppendText(Environment.NewLine); textBox1.AppendText("Iniciando instalador.."); System.Diagnostics.Process.Start(Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData) + "\\upgrade.exe"); System.Diagnostics.Process.GetCurrentProcess().Kill(); } } private void button1_Click(object sender, EventArgs e) { this.Close(); } private void button2_Click(object sender, EventArgs e) { button2.Enabled = false; Thread threadDownloadVersion = new Thread(() => { connectWSDownload(current_version); }); threadDownloadVersion.Start(); } }
Como puedes ver antes que nada leemos el archivo config_version.cfg para ver la versión actual del sistema.
También tenemos un textbox y un progressbar que nos ayudarán con el proceso.
En el textbox1 se van mostrando todos los eventos para que el usuario pueda visualizarlos.
Al descargar el instalador hacemos uso del progressbar1 en el evento DownloadProgressCallback del cliente web para ir mostrando el avance.
Tambien necesitaremos un par de clases: Config y WsUpdate.
class Config { public float version { get; set; } }
class WsUpdate { public int status_code { set; get; } public String newversion_url { set; get; } public float newversion_version { set; get; } }
Realmente no hay mucho que decir, estas clases las necesitamos para convertir el JSON del archivo cfg y del ws.
¡Ahora ya tenemos nuestro actualizador incluido en nuestro software!
Si esta información sobre cómo crear la funcionalidad de buscar actualizaciones en C# te ha sido de utilidad no olvides compartirla en tus redes sociales y dejarnos un comentario en la sección de abajo si tienes cualquier duda relacionada con este tema, será un placer ayudarte.
¡Hasta luego!