2011-02-05 13 views
10

Tengo una aplicación .NET 4 WPF que se instala usando un MSI, generado a través de un proyecto de configuración de estudio visual. Todo funciona muy bien, excepto que me falta la función Click Once Deployment que busca nuevas versiones de la aplicación al cargarlas y las descarga/instala. Cambié de Click Once Deployment porque parece ser una solución a medias que hace que hagas hacks simplemente para hacer cosas simples como ejecutar tu aplicación al inicio.Código para buscar actualizaciones, instalar la nueva versión de la aplicación

Me preguntaba si hay algún tipo de tutorial o código que pueda mostrarme alguien que establezca cómo controlar las nuevas versiones de la aplicación, descargar la nueva versión de la aplicación e instalar la nueva en lugar de la anterior. uno. Esto parece algo que la mayoría de las aplicaciones de WPF querrían tener. Me sorprende que no pueda encontrar nada al respecto en google.

Respuesta

13

No existe una herramienta incorporada o lista para usar. Al iniciar su aplicación, puede ejecutar su código, que lo sigue.

  1. Fetch su http://myserver.com/myproduct/update.xml, donde se mantendrá la configuración de su última versión y la URL de la nueva actualización del archivo msi
  2. Si actualización disponible que es diferente a la versión actualmente en ejecución, a continuación, descargue el archivo utilizando WebClient y almacenarlo en la carpeta temporal
  3. a continuación, puede crear un archivo por lotes con la siguiente cadena y almacenarlo en la carpeta de archivos temporales
msiexec /u {your product code} 
msiexec /i ..path to your new msi 

Finalmente Ejecute su archivo por lotes usando Process.Start y salga de su aplicación.

+0

Gracias @Akash Kava Estoy cerca ahora, pero vea el problema que tengo a continuación con la línea de comando msiexec uninstall/install. – Justin

+0

Lo tengo trabajando, gracias ... – Justin

2

Echa un vistazo a la entrada del blog de Scott Hanselman sobre manually update via clickonce.

+2

Mi mensaje dice que no estoy usando el despliegue haga clic una vez ... – Justin

+0

que Entendido No estoy usando ClickOnce, sin embargo, mi búsqueda me trajo aquí y esto ayudará a otros que * están * usando CO: Cómo: Buscar actualizaciones de aplicaciones utilizando la API ClickOnce Deployment http://msdn.microsoft.com/en- us/library/ms404263.aspx –

13

tengo trabajo, aquí está el código para que otros no tienen que reinventar la rueda ...

public class VersionHelper 
{ 
    private string MSIFilePath = Path.Combine(Environment.CurrentDirectory, "HoustersCrawler.msi"); 
    private string CmdFilePath = Path.Combine(Environment.CurrentDirectory, "Install.cmd"); 
    private string MsiUrl = String.Empty; 

    public bool CheckForNewVersion() 
    { 
     MsiUrl = GetNewVersionUrl(); 
     return MsiUrl.Length > 0; 
    } 

    public void DownloadNewVersion() 
    { 
     DownloadNewVersion(MsiUrl); 
     CreateCmdFile(); 
     RunCmdFile(); 
     ExitApplication(); 
    } 

    private string GetNewVersionUrl() 
    { 
     var currentVersion = Convert.ToInt32(ConfigurationManager.AppSettings["Version"]); 
     //get xml from url. 
     var url = ConfigurationManager.AppSettings["VersionUrl"].ToString(); 
     var builder = new StringBuilder(); 
     using (var stringWriter = new StringWriter(builder)) 
     { 
      using (var xmlReader = new XmlTextReader(url)) 
      { 
       var doc = XDocument.Load(xmlReader); 
       //get versions. 
       var versions = from v in doc.Descendants("version") 
           select new 
           { 
            Name = v.Element("name").Value, 
            Number = Convert.ToInt32(v.Element("number").Value), 
            URL = v.Element("url").Value, 
            Date = Convert.ToDateTime(v.Element("date").Value) 
           }; 
       var version = versions.ToList()[0]; 
       //check if latest version newer than current version. 
       if (version.Number > currentVersion) 
       { 
        return version.URL; 
       } 
      } 
     } 
     return String.Empty; 
    } 

    private void DownloadNewVersion(string url) 
    { 
     //delete existing msi. 
     if (File.Exists(MSIFilePath)) 
     { 
      File.Delete(MSIFilePath); 
     } 
     //download new msi. 
     using (var client = new WebClient()) 
     { 
      client.DownloadFile(url, MSIFilePath); 
     } 
    } 

    private void CreateCmdFile() 
    { 
     //check if file exists. 
     if (File.Exists(CmdFilePath)) 
      File.Delete(CmdFilePath); 
     //create new file. 
     var fi = new FileInfo(CmdFilePath); 
     var fileStream = fi.Create(); 
     fileStream.Close(); 
     //write commands to file. 
     using (TextWriter writer = new StreamWriter(CmdFilePath)) 
     { 
      writer.WriteLine(@"msiexec /i HoustersCrawler.msi /quiet"); 
     } 
    } 

    private void RunCmdFile() 
    {//run command file to reinstall app. 
     var p = new Process(); 
     p.StartInfo = new ProcessStartInfo("cmd.exe", "/c Install.cmd"); 
     p.StartInfo.CreateNoWindow = true; 
     p.Start(); 
     //p.WaitForExit(); 
    } 

    private void ExitApplication() 
    {//exit the app. 
     Application.Current.Shutdown(); 
    } 
} 
+0

realmente buena respuesta. Pero es mejor verificar la versión usando https://msdn.microsoft.com/en-us/library/s3bf0xb2(v=vs.110).aspx –

Cuestiones relacionadas