0

我试图为我的程序编写一个自动更新程序。我已经摆脱了 stackOverflow 之类的东西,但是现在我的程序在遇到变量时似乎无休止地运行。并且什么也不做。

我试图用 cw 获取信息并检查它挂在哪里,但我什么也没得到,也找不到它。

我的主要

    {
    updater = new Updater(this);
    updater.DoUpdate();
    }

     public string ApplicationName {
            get { return "MyProgram"; }
        }

        public string ApplicationID {
            get { return "MyProgramID"; }
        }

        public Assembly ApplicationAssembly {
            get { return System.Reflection.Assembly.GetExecutingAssembly(); }
        }

        public Icon ApplicationIcon {
            get { return this.Icon; }
        }

        public Uri UpdateXmlLocation {
            get { return new Uri("UrlToXml"); }
        }

        public Form Context {
            get { return this; }
        }

在我的 XML 类中

    public class UpdateXml
    {
        private Version version;
        public Uri uri;
        private string fileName;
        private string md5;
        private string description;
        private string launchArgs;

        internal Version Version {
            get { return this.Version; }
        }
        internal Uri Uri {

            get { return this.Uri; }
        }
        internal string FileName {
            get { return this.fileName; }
        }
        internal string MD5 {
            get { return this.md5; }
        }
        internal string Description  {
            get { return this.description; }
        }
        internal string LaunchArgs {
            get { return this.launchArgs; }
        }

过了一会儿(代码运行良好,它到了崩溃的部分)

       private void DwnloadUpdate(UpdateXml update)
        {            
            updateDownloadForm form = new updateDownloadForm(update.Uri, this.applicationInfo.ApplicationIcon);

在这段代码之后,我希望我的 dl 窗口打开并且 dl 启动并且程序得到更新

我的更新程序类

using System;
using System.ComponentModel;
using System.Diagnostics;
using System.IO;
using System.Windows.Forms;

namespace updater
{
    public class Updater
    {
        private Iupdater applicationInfo;
        private BackgroundWorker bgWorker;


        public Updater(Iupdater applicationInfo)
        {
            this.applicationInfo = applicationInfo;

            this.bgWorker = new BackgroundWorker();
            this.bgWorker.DoWork += new DoWorkEventHandler(bgWorker_DoWork);
            this.bgWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bgWorker_RunWorkerCompleted);
        }

        public void DoUpdate()
        {
            if (!this.bgWorker.IsBusy)
                this.bgWorker.RunWorkerAsync(this.applicationInfo);
        }
        private void bgWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            Iupdater application = (Iupdater)e.Argument;

            if (!UpdateXml.ExistOnServer(application.UpdateXmlLocation))
            {
                e.Cancel = true;
            }
            else
            {

                UpdateXml ux = UpdateXml.Parse(application.UpdateXmlLocation, application.ApplicationID);

                if (ux == null)
                {
                    e.Cancel = true;
                }
                else
                {
                    e.Result = ux;
                }
            }
        }
        void bgWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            if(!e.Cancelled)
            {
                UpdateXml update = (UpdateXml)e.Result;

                if(update == null)
                {
                    Console.WriteLine("Update NULL");
                }

                Console.WriteLine("test3.1");



                Console.WriteLine(this.applicationInfo.ApplicationAssembly.GetName().Version);

                if(this.applicationInfo.ApplicationAssembly.GetName().Version != null)
                {
                    Console.WriteLine("YES!");
                } else
                {
                    Console.WriteLine("NO!");
                }


                Console.WriteLine("test3.2");




                if (update != null && update.IsNewerThan(this.applicationInfo.ApplicationAssembly.GetName().Version))
                {
                    Console.WriteLine("test4");
                    if (new updateInformation(applicationInfo, update).ShowDialog(this.applicationInfo.Context) == DialogResult.Yes)
                        this.DwnloadUpdate(update);
                }                
            }
        }

        private void DwnloadUpdate(UpdateXml update)
        {
            Console.WriteLine(update.Uri);
            if(update.Uri == null)
                Console.WriteLine("null");

            updateDownloadForm form = new updateDownloadForm(update.Uri, this.applicationInfo.ApplicationIcon);
            Console.WriteLine("ich bin hier drinnen");
            DialogResult result = form.ShowDialog(this.applicationInfo.Context);

            if(result == DialogResult.OK)
            {
                string currentPath  = this.applicationInfo.ApplicationAssembly.Location;
                string newPath = Path.GetDirectoryName(currentPath) + "\\" + update.FileName;

                UpdateApplication(form.TempFilePath, currentPath, newPath, update.LaunchArgs);

                Application.Exit();
            }
            else if(result == DialogResult.Abort)
            {
                MessageBox.Show("The update download was cancelled. \nThis programm has not been modified.", "Update Download Cancelled", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            else
            {
                MessageBox.Show("There was a Problem downloading the Updat. \nThis programm has not been modified.", "Update Download Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }

        }

        private void UpdateApplication(string tempFilePath, string currentPath, string newPath, string launchArgs)
        {
            string argument = "/C Choice /C Y /N /D Y /T 4 & Del /F /Q \"{0}\" & Choice /C Y /N /D Y /T 2 & Move /Y \"{1}\" \"{2}\" & Start \"\" /D \"{3}\" \"{4}\"{5}";
            ProcessStartInfo info = new ProcessStartInfo();
            info.Arguments = string.Format(argument, currentPath, tempFilePath, newPath, Path.GetDirectoryName(newPath), Path.GetFileName(newPath), launchArgs);
            info.CreateNoWindow = true;
            info.FileName = "cmd.exe";
            Process.Start(info);
        }
    }
}

我的 XML 更新程序类

using System;
using System.Net;
using System.Xml;

namespace updater
{
    public class UpdateXml
    {
        private Version version;
        public Uri uri;
        private string fileName;
        private string md5;
        private string description;
        private string launchArgs;

        internal Version Version {
            get { return this.Version; }
        }
        internal Uri Uri {

            get { return this.Uri; }
        }
        internal string FileName {
            get { return this.fileName; }
        }
        internal string MD5 {
            get { return this.md5; }
        }
        internal string Description  {
            get { return this.description; }
        }
        internal string LaunchArgs {
            get { return this.launchArgs; }
        }
        internal UpdateXml(Version version, Uri uri, string fileName, string md5, string description, string launchArgs)
        {
            Console.WriteLine("run in1");
            this.version        = version;
            this.uri            = uri;
            this.fileName       = fileName;
            this.md5            = md5;
            this.description    = description;
            this.launchArgs     = launchArgs;
            Console.WriteLine("run out 1");
        }
        internal bool IsNewerThan(Version version)
        {
            Console.WriteLine("run in 2");
            return this.version > version;
        }
        internal static bool ExistOnServer(Uri location)
        {
            try
            {
                Console.WriteLine("run in 3");
                HttpWebRequest req = (HttpWebRequest)WebRequest.Create(location.AbsoluteUri);
                HttpWebResponse res = (HttpWebResponse)req.GetResponse();
                Console.WriteLine("run out 3");
                return res.StatusCode == HttpStatusCode.OK;
            }
            catch { return false; }
        }
        internal static UpdateXml Parse(Uri location, string appID)
        {
            Console.WriteLine("run in 4");
            Version version = null;
            string url = "", fileName = "", md5 = "", description = "", launchArgs = "";

            try
            {
                XmlDocument doc = new XmlDocument();
                doc.Load(location.AbsoluteUri);

                XmlNode node = doc.DocumentElement.SelectSingleNode("//update");

                if(node == null)
                {
                    return null;
                }

                version     = Version.Parse(node["version"].InnerText);
                url         = node["url"].InnerText;
                fileName    = node["fileName"].InnerText;
                md5         = node["md5"].InnerText;
                description = node["description"].InnerText;
                launchArgs  = node["launchArgs"].InnerText;
                Console.WriteLine("run out 4");
                return new UpdateXml(version, new Uri(url), fileName, md5, description, launchArgs);

            }
            catch
            {
                return null;

            }
        }
    }
}

我的界面

using System;
using System.Reflection;
using System.Drawing;
using System.Windows.Forms;

namespace updater
{
    public interface Iupdater
    {
        string ApplicationName          { get; }
        string ApplicationID            { get; }
        Assembly ApplicationAssembly    { get; }
        Icon ApplicationIcon            { get; }
        Uri UpdateXmlLocation           { get; }
        Form Context                    { get; }
    }
}

我的更新开始表单似乎进入了循环

using System;
using updater;
using System.Windows.Forms;

namespace updater
{
    internal partial class updateInformation : Form
    {
        private Iupdater applicationInfo;

        private UpdateXml updateInfo;

        private UpdateInoForm updateInoForm;

        public updateInformation(Iupdater applicationInfo, UpdateXml updateInfo)
        {
            InitializeComponent();

            this.applicationInfo = applicationInfo;
            this.updateInfo = updateInfo;

            this.Text = this.applicationInfo.ApplicationName + " - Update in Process";

            if (this.applicationInfo.ApplicationIcon != null)
                this.Icon = this.applicationInfo.ApplicationIcon;

            //this.lblNewVersion.Text = String.Format("New Version: {0}", this.updateInfo.Version.ToString());

            Timer wait = new Timer();
            wait.Interval = 5000;
            wait.Tick += new EventHandler(wait_Tick);
            wait.Start();

        }

        void wait_Tick(object sender, EventArgs e)
        {
            this.DialogResult = DialogResult.Yes;
        }

        private void Details_Click(object sender, EventArgs e)
        {
            if (this.updateInfo == null)
                this.updateInoForm = new UpdateInoForm(this.applicationInfo, this.updateInfo);

            this.updateInoForm.ShowDialog(this);
        }
    }
}
4

1 回答 1

1

您需要返回字段值,而不是返回属性值的属性。不要写这样的属性

/// THIS PROPERTY TRIES TO RETURN ITSELF!!
internal Version Version {
  get {
    return this.Version; // you wanted to return 'this.version'
  }
}

您可以使用这样的自动属性:

// No more private fields
public class UpdateXml
{
  public Version Version { get; set; }
  public string FileName { get; } // Only expose a getter, can be set in the ctor
  public Uri Uri { get; set; }

  // add more properties here...

  public UpdateXml(string filename)
  {
    FileName = filename;
  }
}

或者学习使用在 C# 中看到的约定分配。为私有变量名称添加前缀:

public class UpdateXml
{
  private Version _version;
  private string _fileName;
  private Uri _uri;

  public Version Version => _version;
  public string FileName => _filename;
  public Uri Uri {
    get => _uri;
    set => _uri = value;
  }

  // add more properties here...

  // use the ctor to set some field values
  public UpdateXml(string filename)
  {
    _filename = filename;
  }

  // fields allow setting values later on
  public void SetLatestVersion(Version v)
  {
    if (_version == null || v > _version)
      _version = v;
  }
}

总而言之,编写代码时要小心。案例确实很重要;-)

于 2019-09-20T08:04:40.190 回答