1
yhj
2024-07-24 5e5d945e91568b973faa27d8ab0bcef99fc4a6c5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
#region
 
using System;
using System.Collections.Generic;
using System.IO;
using System.Reflection;
using System.Windows.Forms;
using CSFrameworkV5.Common.Tools;
using CSFrameworkV5.Core;
 
#endregion
 
namespace CSFrameworkV5.Library.CommonForms
{
    /// <summary>
    ///     自动检测升级包倒计时界面
    /// </summary>
    public partial class frmAutoUpgraderWaiting : Form
    {
        private const int DEF_REMAINING = 5; //关闭当前窗体读秒        
        private const int DEF_AUTO_DETECT = 3000; //3秒启动,测试
 
        private static Timer _AutoUpgraderTimer = new Timer();
 
        private static Form _Owner;
 
        //剩余读秒
        private int _Remaining = DEF_REMAINING;
 
        private frmAutoUpgraderWaiting()
        {
            InitializeComponent();
        }
 
        private static string GetMsg(int second)
        {
            return "系统检测到有新版本下载,程序将在 " + second + " 秒后关闭,请重新运行程序。";
        }
 
        private static bool IsForceUpdate()
        {
            var ini =
                Application.StartupPath +
                "\\UpgraderClient.ini"; //客户端本地配置INI文件      
            if (File.Exists(ini))
            {
                var file = new IniFile(ini);
                return file.IniReadValue("Setup", "ForceUpdate") == "Y";
            }
 
            return false;
        }
 
        /// <summary>
        ///     外部统一接口, 启动自动检测升级包
        /// </summary>
        public static void StartAutoUpgrading(Form owner)
        {
            if (SystemSettings.Current.CheckVersion && IsForceUpdate())
            {
                _Owner = owner;
                _AutoUpgraderTimer.Interval = DEF_AUTO_DETECT;
                _AutoUpgraderTimer.Tick += Timer_Tick;
                _AutoUpgraderTimer.Start();
            }
        }
 
        /// <summary>
        ///     检查升级包的时钟
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private static void Timer_Tick(object sender, EventArgs e)
        {
            if (UpgraderReflection.GetPackages() > 0)
            {
                _AutoUpgraderTimer.Stop();
                var form = new frmAutoUpgraderWaiting();
                form.lblMsg.Text = GetMsg(form._Remaining);
                form.timer1.Start();
                form.ShowDialog(_Owner);
            }
        }
 
        /// <summary>
        ///     界面的时钟(倒计时关闭程序)
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void timer1_Tick(object sender, EventArgs e)
        {
            _Remaining--;
            lblMsg.Text = GetMsg(_Remaining);
 
            if (_Remaining == 0)
            {
                _Remaining = DEF_REMAINING;
 
                //强制退出, 忽略frmMain窗体的Form.Closing事件。
                Application.ExitThread();
            }
        }
    }
 
    /// <summary>
    ///     文件读取version.xml
    /// </summary>
    public class VersionHistory
    {
        /// <summary>
        ///     版本历史文件
        /// </summary>
        private const string XML_FILE = @"\version.xml";
 
        private string _CurrentVersionID;
        private List<string> _VersionHistory;
 
        public VersionHistory()
        {
            _VersionHistory = new List<string>();
        }
 
        /// <summary>
        ///     用户的最新版本
        /// </summary>
        public string CurrentVersionID
        {
            get => _CurrentVersionID;
            set => _CurrentVersionID = value;
        }
 
        /// <summary>
        ///     升级历史记录
        /// </summary>
        public List<string> History
        {
            get => _VersionHistory;
            set => _VersionHistory = value;
        }
 
        /// <summary>
        ///     获取历史记录, 反序列化
        /// </summary>
        /// <returns></returns>
        public static VersionHistory GetVersionHistory()
        {
            var versionFile = Application.StartupPath + XML_FILE;
            if (File.Exists(versionFile))
            {
                var o = MyXmlSerializer.Deserialize(typeof(VersionHistory),
                    versionFile);
                return o as VersionHistory;
            }
 
            return new VersionHistory();
        }
    }
 
    /// <summary>
    ///     自动升级程序.NET反射器
    /// </summary>
    public static class UpgraderReflection
    {
        /// <summary>
        ///     获取升级包数据。通过.NET反射,调用升级程序的方法
        /// </summary>
        /// <returns></returns>
        public static int GetPackages()
        {
            try
            {
                //获取本地最新升级包的版本号
                var v = VersionHistory.GetVersionHistory();
                var newVersion = v == null ? "" : v.CurrentVersionID;
 
                //价值升级程序的程序集
                var file = Path.Combine(Application.StartupPath,
                    "CSFramework.AutoUpgrader.exe");
                var bs = File.ReadAllBytes(file);
                var asm = Assembly.Load(bs);
 
                //获取一个程序类型
                var T = asm.GetType(
                    "CSFramework.AutoUpgrader.UpgraderController");
                var o = Activator.CreateInstance(T);
 
                //反射一个方法
                var mi = T.GetMethod("GetUpgraderPackages");
                var i = mi.Invoke(o,
                    new object[]
                        { "E81FFE4E-D0C5-430B-A558-9ECFC0F2FF0D", newVersion });
                if (i == null) return 0;
 
                return Convert.ToInt32(i);
            }
            catch (Exception ex)
            {
                //Common.Msg.Warning("反射升级程序的GetPackages方法错误!\r\n" + ex.Message);
                return 0;
            }
        }
    }
}