2011-02-05 56 views
10

Tôi có ứng dụng .NET 4 WPF được cài đặt bằng MSI, được tạo thông qua dự án thiết lập phòng thu trực quan. Mọi thứ hoạt động tốt, ngoại trừ việc tôi thiếu tính năng Click Once Deployment để kiểm tra các phiên bản mới của ứng dụng đang tải và tải xuống/cài đặt chúng. Tôi đã chuyển từ Click Once Deployment vì nó có vẻ là một giải pháp nửa nướng khiến bạn thực hiện hack chỉ để thực hiện những việc đơn giản như chạy ứng dụng khi khởi động. Tôi đã tự hỏi liệu có bất kỳ loại hướng dẫn hoặc mã nào mà bất cứ ai cũng có thể chỉ cho tôi biết cách xử lý việc kiểm tra các phiên bản mới của ứng dụng, tải xuống phiên bản mới của ứng dụng và cài đặt ứng dụng mới trên ứng dụng cũ hay chưa. một. Điều này có vẻ như một cái gì đó mà hầu hết các ứng dụng WPF sẽ muốn có, tôi ngạc nhiên rằng tôi không thể tìm thấy bất cứ điều gì về điều này trên google.Mã để kiểm tra các bản cập nhật, cài đặt phiên bản mới của ứng dụng

Trả lời

13

Không có công cụ sẵn có sẵn hoặc sẵn có nào. Khi khởi động ứng dụng của bạn, bạn có thể chạy mã của bạn.

  1. Fetch http://myserver.com/myproduct/update.xml của bạn, nơi bạn sẽ tiếp tục cài đặt phiên bản mới nhất của bạn và url của một bản cập nhật mới msi nộp
  2. Nếu bản cập nhật có sẵn đó là khác nhau sau đó phiên bản hiện đang chạy, sau đó tải về tập tin sử dụng WebClient và lưu nó trong thư mục tạm thời
  3. sau đó, bạn có thể tạo một tập tin batch với chuỗi sau đây và lưu nó trong thư mục tạm thời
msiexec /u {your product code} 
msiexec /i ..path to your new msi 

Cuối cùng Thực thi tệp lô của bạn bằng cách sử dụng Process.Start và thoát khỏi ứng dụng của bạn.

+0

Cảm ơn @Akash Kava Tôi đã đóng ngay bây giờ nhưng thấy sự cố tôi đang gặp phải bên dưới với việc gỡ cài đặt/cài đặt dòng lệnh msiexec. – Justin

+0

Đã làm việc, cảm ơn ... – Justin

2

Xem bài đăng trên blog của Scott Hanselman về manually update via clickonce.

+2

bài của tôi nói rằng tôi không sử dụng Nhấn Khi triển khai ... – Justin

+0

Hiểu bạn 'không sử dụng ClickOnce, tuy nhiên, tìm kiếm của tôi đưa tôi đến đây và điều này sẽ giúp những người khác * đang sử dụng CO: Cách: Kiểm tra Cập nhật Ứng dụng Lập trình Sử dụng API Triển khai ClickOnce http://msdn.microsoft.com/en- us/library/ms404263.aspx –

13

Got nó làm việc, đây là mã để những người khác không cần phải phát minh lại bánh xe ...

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

câu trả lời thực sự tốt. Nhưng tốt hơn để kiểm tra phiên bản bằng cách sử dụng https://msdn.microsoft.com/en-us/library/s3bf0xb2(v=vs.110).aspx –

Các vấn đề liên quan