Buenas a todos, tengo una aplicación hecha en c#, y ahora tengo problemas en hacer un control que actualice de internet si existe una nueva versión. El problema viene al sobreescribir los ejecutables y las dll que están en uso, hace caso omiso (lo curioso es que no me saca un error.
Supongo que habrán métodos ya hechos y más profesionales para esta plataforma, agradecería cualquier aporte. Solo he encontrado datos de como hacerlo con ClickOnce (de forma hiper sencilla ), el problema es que mi aplicación, en el manifiesto pone requireAdministrador (necesita permisos de administrador) y clickOnce no permite este nivel de permisos.
os dejo el código de mi updater V1.0
spoiler
private void workerThread()
{
setMarqueeProgressBar();
bool shouldContinue = true;
string path = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase).remove(0,6);
XmlDocument newXDoc = new XmlDocument();
setStatus("Leyendo archivo remoto de manifiesto...");
try
{
newXDoc.Load("http://blablabla.com/deployment/Publitool_Online.manifest.xml");
System.Version oldVersion = new System.Version(Application.ProductVersion);
System.Version newVersion = new System.Version(newXDoc.GetElementsByTagName("version")[0].InnerText);
if (newVersion < oldVersion)
shouldContinue = false;
}
catch(Exception exc)
{
setStatus("Error al leer el archivo de manifiesto: " + exc.Message);
MessageBox.Show(exc.Message + "\n" + exc.StackTrace);
shouldContinue = false;
}
if (shouldContinue)
{
XmlNodeList files = newXDoc.GetElementsByTagName("files");
int i = 0;
string backupPath = System.IO.Path.Combine(path, "backup");
if (!System.IO.Directory.Exists(backupPath))
System.IO.Directory.CreateDirectory(backupPath);
foreach (XmlElement node in files)
{
string downloadedFilePath = System.IO.Path.GetTempPath();
string filePath = System.IO.Path.Combine(path, node.InnerText.Replace("/","\\"));
string rutaFinal = System.IO.Path.Combine(downloadedFilePath, node.InnerText.Replace("/", "\\"));
if (!System.IO.Directory.Exists(System.IO.Path.GetDirectoryName(rutaFinal)))
System.IO.Directory.CreateDirectory(System.IO.Path.GetDirectoryName(rutaFinal));
if (!System.IO.Directory.Exists(System.IO.Path.GetDirectoryName(filePath)))
System.IO.Directory.CreateDirectory(System.IO.Path.GetDirectoryName(filePath));
try
{
WebClient wc = new WebClient();
setStatus("[" + i + "/" + files.Count.ToString() + "] Descargando archivo " + node.InnerText + " ...");
wc.DownloadFile("http://blablabla.com/deployment/download.php?mac=" + this.mac + "&pass=" + this.pass + "&file=" + System.Web.HttpUtility.UrlEncode(node.InnerText) + "&appType=servidor&version=" + Application.ProductVersion, rutaFinal);
}
catch (Exception ex)
{
shouldContinue = false;
setStatus("Error al descargar archivo: " + node.InnerText);
MessageBox.Show(ex.Message);
MessageBox.Show("http://blablabla.com/deployment/download.php?mac=" + this.mac + "&pass=" + this.pass + "&file=" + "&appType=servidor&version="+ Application.ProductVersion + System.Web.HttpUtility.UrlEncode(node.InnerText));
MessageBox.Show(rutaFinal);
}
i++;
}
if (shouldContinue)
{
foreach (XmlElement node in files)
{
string downloadedFilePath = System.IO.Path.GetTempPath();
string filePath = System.IO.Path.Combine(path, node.InnerText.Replace("/", System.IO.Path.DirectorySeparatorChar.ToString()));
string rutaFinal = System.IO.Path.Combine(downloadedFilePath, node.InnerText.Replace("/", System.IO.Path.DirectorySeparatorChar.ToString()));
try
{
setStatus("Buscando archivos iguales...");
if (System.IO.File.Exists(filePath))
{
setStatus("Archivando la última version del archivo...");
System.IO.File.Delete(System.IO.Path.Combine(filePath, filePath + ".bak"));
System.IO.File.Move(filePath, System.IO.Path.Combine(filePath, filePath + ".bak"));
}
setStatus("Copiando archivo...");
System.IO.File.Move(rutaFinal, filePath);
}
catch (Exception ex)
{
setStatus("Error al copiar archivo " + ex.Message);
MessageBox.Show(ex.Message + "\n" + ex.StackTrace);
shouldContinue = false;
}
}
}
}
else
{
setStatus("No hay actualizaciones disponibles");
stopMarqueeAnimation();
shouldContinue = false;
}
setStatus("Finalizada la descarga de archivos...");
if (shouldContinue)
{
setStatus("Reiniciando aplicación...");
try
{
Application.Restart();
}
catch (Exception exc)
{
MessageBox.Show(exc.Message + "\n" + exc.StackTrace);
MessageBox.Show("Reinicie manualmente la aplicación", "Error al reiniciar", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
}
}
else
{
setStatus("Ha habido un error en la descarga");
}
}
El Script en cuestión descarga un archivo de internet llamado manifest.xml, donde he guardado la versión, y todos los archivos a ser descargados.
Tras esto, el script, hace una petición de descarga de un archivo, a un script llamado 'download.php' donde compruebo si el usuario tiene permiso para otra actualización, y le devuelvo el archivo que se ha pedido.