提交记录修改Tai.sln+10 −0看文件
修改UI/Models/SettingPageModel.cs+5 −1看文件
修改UI/ViewModels/SettingPageVM.cs+48 −2看文件
修改UI/Views/SettingPage.xaml+13 −10看文件
新增Updater/App.config+6 −0看文件
新增Updater/App.xaml+9 −0看文件
新增Updater/App.xaml.cs+61 −0看文件
新增Updater/GithubRelease.cs+113 −0看文件
新增Updater/MainModel.cs+17 −0看文件
新增Updater/MainWindow.xaml+42 −0看文件
新增Updater/MainWindow.xaml.cs+240 −0看文件
新增Updater/Properties/AssemblyInfo.cs+55 −0看文件
新增Updater/Properties/Resources.Designer.cs+71 −0看文件
新增Updater/Properties/Resources.resx+117 −0看文件
新增Updater/Properties/Settings.Designer.cs+30 −0看文件
新增Updater/Properties/Settings.settings+7 −0看文件
新增Updater/UINotifyPropertyChanged.cs+26 −0看文件
新增Updater/Unzip.cs+88 −0看文件
新增Updater/Updater.csproj+107 −0看文件
新增Updater/packages.config+4 −0看文件
| @@ -9,6 +9,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UI", "UI\UI.csproj", "{2427 | ||
| 9 | 9 | EndProject |
| 10 | 10 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TaiBug", "TaiBug\TaiBug.csproj", "{758D59B2-C438-4DE4-B135-7FF0614FE4B7}" |
| 11 | 11 | EndProject |
| 12 | 新增:Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Updater", "Updater\Updater.csproj", "{7A2F2592-3079-441C-8704-E71CE75BC593}" | |
| 13 | 新增:EndProject | |
| 12 | 14 | Global |
| 13 | 15 | GlobalSection(SolutionConfigurationPlatforms) = preSolution |
| 14 | 16 | Debug|Any CPU = Debug|Any CPU |
| @@ -41,6 +43,14 @@ Global | ||
| 41 | 43 | {758D59B2-C438-4DE4-B135-7FF0614FE4B7}.Release|Any CPU.Build.0 = Release|Any CPU |
| 42 | 44 | {758D59B2-C438-4DE4-B135-7FF0614FE4B7}.Release|x64.ActiveCfg = Release|Any CPU |
| 43 | 45 | {758D59B2-C438-4DE4-B135-7FF0614FE4B7}.Release|x64.Build.0 = Release|Any CPU |
| 46 | 新增: {7A2F2592-3079-441C-8704-E71CE75BC593}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | |
| 47 | 新增: {7A2F2592-3079-441C-8704-E71CE75BC593}.Debug|Any CPU.Build.0 = Debug|Any CPU | |
| 48 | 新增: {7A2F2592-3079-441C-8704-E71CE75BC593}.Debug|x64.ActiveCfg = Debug|Any CPU | |
| 49 | 新增: {7A2F2592-3079-441C-8704-E71CE75BC593}.Debug|x64.Build.0 = Debug|Any CPU | |
| 50 | 新增: {7A2F2592-3079-441C-8704-E71CE75BC593}.Release|Any CPU.ActiveCfg = Release|Any CPU | |
| 51 | 新增: {7A2F2592-3079-441C-8704-E71CE75BC593}.Release|Any CPU.Build.0 = Release|Any CPU | |
| 52 | 新增: {7A2F2592-3079-441C-8704-E71CE75BC593}.Release|x64.ActiveCfg = Release|Any CPU | |
| 53 | 新增: {7A2F2592-3079-441C-8704-E71CE75BC593}.Release|x64.Build.0 = Release|Any CPU | |
| 44 | 54 | EndGlobalSection |
| 45 | 55 | GlobalSection(SolutionProperties) = preSolution |
| 46 | 56 | HideSolutionNode = FALSE |
| @@ -5,6 +5,7 @@ using System.Collections.ObjectModel; | ||
| 5 | 5 | using System.Linq; |
| 6 | 6 | using System.Text; |
| 7 | 7 | using System.Threading.Tasks; |
| 8 | 新增:using System.Windows; | |
| 8 | 9 | |
| 9 | 10 | namespace UI.Models |
| 10 | 11 | { |
| @@ -29,7 +30,10 @@ namespace UI.Models | ||
| 29 | 30 | /// <summary> |
| 30 | 31 | /// 软件版本号 |
| 31 | 32 | /// </summary> |
| 32 | 删除: public string Version{ get { return version; } set { version = value; OnPropertyChanged(); } } | |
| 33 | 新增: public string Version { get { return version; } set { version = value; OnPropertyChanged(); } } | |
| 34 | 新增: | |
| 35 | 新增: private Visibility CheckUpdateBtnVisibility_= Visibility.Visible; | |
| 36 | 新增: public Visibility CheckUpdateBtnVisibility { get { return CheckUpdateBtnVisibility_; } set { CheckUpdateBtnVisibility_ = value; OnPropertyChanged(); } } | |
| 33 | 37 | |
| 34 | 38 | } |
| 35 | 39 | } |
| @@ -1,9 +1,11 @@ | ||
| 1 | 删除:using Core.Models.Config; | |
| 1 | 新增:using Core.Librarys; | |
| 2 | 新增:using Core.Models.Config; | |
| 2 | 3 | using Core.Models.Config.Link; |
| 3 | 4 | using Core.Servicers.Interfaces; |
| 4 | 5 | using System; |
| 5 | 6 | using System.Collections.Generic; |
| 6 | 7 | using System.Diagnostics; |
| 8 | 新增:using System.IO; | |
| 7 | 9 | using System.Linq; |
| 8 | 10 | using System.Reflection; |
| 9 | 11 | using System.Text; |
| @@ -17,15 +19,59 @@ namespace UI.ViewModels | ||
| 17 | 19 | { |
| 18 | 20 | private ConfigModel config; |
| 19 | 21 | private readonly IAppConfig appConfig; |
| 22 | 新增: private readonly MainViewModel mainVM; | |
| 20 | 23 | public Command OpenURL { get; set; } |
| 21 | 删除: public SettingPageVM(IAppConfig appConfig) | |
| 24 | 新增: public Command CheckUpdate { get; set; } | |
| 25 | 新增: | |
| 26 | 新增: public SettingPageVM(IAppConfig appConfig, MainViewModel mainVM) | |
| 22 | 27 | { |
| 23 | 28 | this.appConfig = appConfig; |
| 29 | 新增: this.mainVM = mainVM; | |
| 24 | 30 | |
| 25 | 31 | OpenURL = new Command(new Action<object>(OnOpenURL)); |
| 32 | 新增: CheckUpdate = new Command(new Action<object>(OnCheckUpdate)); | |
| 26 | 33 | |
| 27 | 34 | Init(); |
| 35 | 新增: } | |
| 36 | 新增: | |
| 37 | 新增: private void OnCheckUpdate(object obj) | |
| 38 | 新增: { | |
| 39 | 新增: try | |
| 40 | 新增: { | |
| 41 | 新增: CheckUpdateBtnVisibility = System.Windows.Visibility.Collapsed; | |
| 42 | 新增: string updaterExePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, | |
| 43 | 新增: "Updater.exe"); | |
| 44 | 新增: string updaterCacheExePath = Path.Combine( | |
| 45 | 新增: AppDomain.CurrentDomain.BaseDirectory, | |
| 46 | 新增: "Update", | |
| 47 | 新增: "Updater.exe"); | |
| 48 | 新增: string updateDirPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Update"); | |
| 49 | 新增: if (!Directory.Exists(updateDirPath)) | |
| 50 | 新增: { | |
| 51 | 新增: Directory.CreateDirectory(updateDirPath); | |
| 52 | 新增: } | |
| 28 | 53 | |
| 54 | 新增: if (!File.Exists(updaterExePath)) | |
| 55 | 新增: { | |
| 56 | 新增: mainVM.Toast("升级程序似乎已被删除,请手动前往发布页查看新版本", Controls.Base.IconTypes.None); | |
| 57 | 新增: return; | |
| 58 | 新增: } | |
| 59 | 新增: File.Copy(updaterExePath, updaterCacheExePath, true); | |
| 60 | 新增: | |
| 61 | 新增: File.Copy(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Newtonsoft.Json.dll"), Path.Combine( | |
| 62 | 新增: AppDomain.CurrentDomain.BaseDirectory, | |
| 63 | 新增: "Update", | |
| 64 | 新增: "Newtonsoft.Json.dll"), true); | |
| 65 | 新增: | |
| 66 | 新增: ProcessHelper.Run(updaterCacheExePath, new string[] { Version }); | |
| 67 | 新增: } | |
| 68 | 新增: catch (Exception ex) | |
| 69 | 新增: { | |
| 70 | 新增: CheckUpdateBtnVisibility = System.Windows.Visibility.Visible; | |
| 71 | 新增: | |
| 72 | 新增: Logger.Error(ex.Message); | |
| 73 | 新增: mainVM.Toast("无法正确启动检查更新程序", Controls.Base.IconTypes.None); | |
| 74 | 新增: } | |
| 29 | 75 | } |
| 30 | 76 | |
| 31 | 77 | private void OnOpenURL(object obj) |
| @@ -13,7 +13,7 @@ | ||
| 13 | 13 | |
| 14 | 14 | <Grid Margin="20"> |
| 15 | 15 | <StackPanel> |
| 16 | 删除: | |
| 16 | 新增: | |
| 17 | 17 | <TextBlock Text="设置" FontSize="18" Margin="0,5,0,20"/> |
| 18 | 18 | <Tabbar:Tabbar Data="{Binding TabbarData}" SelectedIndex="{Binding TabbarSelectedIndex,Mode=TwoWay}"/> |
| 19 | 19 | |
| @@ -47,25 +47,28 @@ | ||
| 47 | 47 | <TabItem> |
| 48 | 48 | <!--关于--> |
| 49 | 49 | <Border Background="White" Padding="20" CornerRadius="6"> |
| 50 | 删除: <StackPanel HorizontalAlignment="Left"> | |
| 51 | 删除: <Image Width="25" Source="/Resources/Icons/tai.ico" HorizontalAlignment="Left"/> | |
| 52 | 删除: <TextBlock Margin="0,20,0,0"> | |
| 53 | 删除: <Run Text="Tai "/><Run Text="{Binding Version}"/> | |
| 54 | 删除: </TextBlock> | |
| 55 | 删除: <TextBlock Margin="0,5,0,0"> | |
| 50 | 新增: <StackPanel HorizontalAlignment="Left"> | |
| 51 | 新增: <Image Width="25" Source="/Resources/Icons/tai.ico" HorizontalAlignment="Left"/> | |
| 52 | 新增: <StackPanel Orientation="Horizontal" Margin="0,10,0,0"> | |
| 53 | 新增: <TextBlock VerticalAlignment="Center"> | |
| 54 | 新增: <Run Text="Tai版本号 "/><Run Text="{Binding Version}"/> | |
| 55 | 新增: </TextBlock> | |
| 56 | 新增: <Btn:Button Visibility="{Binding CheckUpdateBtnVisibility}" Command="{Binding CheckUpdate}" Margin="20,0,0,0" VerticalAlignment="Center" Width="120" Icon="CloudImportExport" Content="检查更新"/> | |
| 57 | 新增: </StackPanel> | |
| 58 | 新增: <TextBlock Margin="0,30,0,0"> | |
| 56 | 59 | <Run Text="开源 "/><Hyperlink Command="{Binding OpenURL}" CommandParameter="https://github.com/Planshit/Tai">https://github.com/Planshit/Tai</Hyperlink> |
| 57 | 60 | </TextBlock> |
| 58 | 61 | <TextBlock Margin="0,5,0,0"> |
| 59 | 62 | <Run Text="讨论 "/><Hyperlink Command="{Binding OpenURL}" CommandParameter="https://github.com/Planshit/Tai/discussions">https://github.com/Planshit/Tai/discussions</Hyperlink> |
| 60 | 63 | </TextBlock> |
| 61 | 删除: <TextBlock Margin="0,30,0,0"> | |
| 64 | 新增: <TextBlock Margin="0,10,0,0"> | |
| 62 | 65 | <Run Text="外部资源声明 "/> |
| 63 | 66 | </TextBlock> |
| 64 | 删除: <TextBlock Margin="0,5,0,0" Text="Icon 来自微软 Emoji"/> | |
| 67 | 新增: <TextBlock Foreground="Gray" Margin="0,5,0,0" Text="Icon 来自微软 Emoji"/> | |
| 65 | 68 | </StackPanel> |
| 66 | 69 | </Border> |
| 67 | 70 | </TabItem> |
| 68 | 删除: | |
| 71 | 新增: | |
| 69 | 72 | </TabControl> |
| 70 | 73 | </StackPanel> |
| 71 | 74 | |
| @@ -0,0 +1,6 @@ | ||
| 1 | 新增:<?xml version="1.0" encoding="utf-8" ?> | |
| 2 | 新增:<configuration> | |
| 3 | 新增: <startup> | |
| 4 | 新增: <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" /> | |
| 5 | 新增: </startup> | |
| 6 | 新增:</configuration> | |
| 文件末尾没有换行 | ||
| @@ -0,0 +1,9 @@ | ||
| 1 | 新增:<Application x:Class="Updater.App" | |
| 2 | 新增: xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" | |
| 3 | 新增: xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" | |
| 4 | 新增: xmlns:local="clr-namespace:Updater" | |
| 5 | 新增: StartupUri="MainWindow.xaml"> | |
| 6 | 新增: <Application.Resources> | |
| 7 | 新增: | |
| 8 | 新增: </Application.Resources> | |
| 9 | 新增:</Application> | |
| @@ -0,0 +1,61 @@ | ||
| 1 | 新增:using System; | |
| 2 | 新增:using System.Collections.Generic; | |
| 3 | 新增:using System.Configuration; | |
| 4 | 新增:using System.Data; | |
| 5 | 新增:using System.Linq; | |
| 6 | 新增:using System.Threading.Tasks; | |
| 7 | 新增:using System.Windows; | |
| 8 | 新增: | |
| 9 | 新增:namespace Updater | |
| 10 | 新增:{ | |
| 11 | 新增: /// <summary> | |
| 12 | 新增: /// App.xaml 的交互逻辑 | |
| 13 | 新增: /// </summary> | |
| 14 | 新增: public partial class App : Application | |
| 15 | 新增: { | |
| 16 | 新增: private System.Threading.Mutex mutex; | |
| 17 | 新增: | |
| 18 | 新增: protected override void OnStartup(StartupEventArgs e) | |
| 19 | 新增: { | |
| 20 | 新增: base.OnStartup(e); | |
| 21 | 新增: // 阻止多开和用户主动启动 | |
| 22 | 新增: if (e.Args.Length == 0 || IsRuned()) | |
| 23 | 新增: { | |
| 24 | 新增: Shutdown(); | |
| 25 | 新增: } | |
| 26 | 新增: | |
| 27 | 新增: Activated += (s, e2) => | |
| 28 | 新增: { | |
| 29 | 新增: var mainWindow = App.Current.MainWindow; | |
| 30 | 新增: if (mainWindow.DataContext != null) | |
| 31 | 新增: { | |
| 32 | 新增: var mainModel = mainWindow.DataContext as MainModel; | |
| 33 | 新增: if (string.IsNullOrEmpty(mainModel.Version)) | |
| 34 | 新增: { | |
| 35 | 新增: mainModel.Version = e.Args[0]; | |
| 36 | 新增: } | |
| 37 | 新增: } | |
| 38 | 新增: }; | |
| 39 | 新增: } | |
| 40 | 新增: | |
| 41 | 新增: | |
| 42 | 新增: | |
| 43 | 新增: | |
| 44 | 新增: | |
| 45 | 新增: #region 获取当前程序是否已运行 | |
| 46 | 新增: /// <summary> | |
| 47 | 新增: /// 获取当前程序是否已运行 | |
| 48 | 新增: /// </summary> | |
| 49 | 新增: private bool IsRuned() | |
| 50 | 新增: { | |
| 51 | 新增: bool ret; | |
| 52 | 新增: mutex = new System.Threading.Mutex(true, System.Reflection.Assembly.GetEntryAssembly().ManifestModule.Name, out ret); | |
| 53 | 新增: if (!ret) | |
| 54 | 新增: { | |
| 55 | 新增: return true; | |
| 56 | 新增: } | |
| 57 | 新增: return false; | |
| 58 | 新增: } | |
| 59 | 新增: #endregion | |
| 60 | 新增: } | |
| 61 | 新增:} | |
| @@ -0,0 +1,113 @@ | ||
| 1 | 新增:using Newtonsoft.Json; | |
| 2 | 新增:using System; | |
| 3 | 新增:using System.Collections.Generic; | |
| 4 | 新增:using System.IO; | |
| 5 | 新增:using System.Linq; | |
| 6 | 新增:using System.Net; | |
| 7 | 新增:using System.Text; | |
| 8 | 新增:using System.Threading; | |
| 9 | 新增:using System.Threading.Tasks; | |
| 10 | 新增: | |
| 11 | 新增:namespace Updater | |
| 12 | 新增:{ | |
| 13 | 新增: | |
| 14 | 新增: public class GithubRelease | |
| 15 | 新增: { | |
| 16 | 新增: public class VersionInfo | |
| 17 | 新增: { | |
| 18 | 新增: /// <summary> | |
| 19 | 新增: /// 版本标题 | |
| 20 | 新增: /// </summary> | |
| 21 | 新增: public string Title { get; set; } | |
| 22 | 新增: /// <summary> | |
| 23 | 新增: /// 版本号 | |
| 24 | 新增: /// </summary> | |
| 25 | 新增: public string Version { get; set; } | |
| 26 | 新增: /// <summary> | |
| 27 | 新增: /// 是否是预览版本 | |
| 28 | 新增: /// </summary> | |
| 29 | 新增: public bool IsPre { get; set; } | |
| 30 | 新增: /// <summary> | |
| 31 | 新增: /// 下载路径 | |
| 32 | 新增: /// </summary> | |
| 33 | 新增: public string DownloadUrl { get; set; } | |
| 34 | 新增: /// <summary> | |
| 35 | 新增: /// 版本更新内容网页链接 | |
| 36 | 新增: /// </summary> | |
| 37 | 新增: public string HtmlUrl { get; set; } | |
| 38 | 新增: } | |
| 39 | 新增: public class GithubModel | |
| 40 | 新增: { | |
| 41 | 新增: public string tag_name { get; set; } | |
| 42 | 新增: public string html_url { get; set; } | |
| 43 | 新增: public string name { get; set; } | |
| 44 | 新增: public bool prerelease { get; set; } | |
| 45 | 新增: | |
| 46 | 新增: public List<GithubAssetsModel> assets { get; set; } | |
| 47 | 新增: } | |
| 48 | 新增: public class GithubAssetsModel | |
| 49 | 新增: { | |
| 50 | 新增: public string browser_download_url { get; set; } | |
| 51 | 新增: } | |
| 52 | 新增: private string githubUrl; | |
| 53 | 新增: private string nowVersion; | |
| 54 | 新增: public VersionInfo Info { get; set; } | |
| 55 | 新增: | |
| 56 | 新增: //public event UpdaterEventHandler RequestCompleteEvent; | |
| 57 | 新增: //public event UpdaterEventHandler RequestErrorEvent; | |
| 58 | 新增: //public delegate void UpdaterEventHandler(object sender, object value); | |
| 59 | 新增: public GithubRelease(string githubUrl, string nowVersion) | |
| 60 | 新增: { | |
| 61 | 新增: this.githubUrl = githubUrl; | |
| 62 | 新增: this.nowVersion = nowVersion; | |
| 63 | 新增: Info = new VersionInfo(); | |
| 64 | 新增: } | |
| 65 | 新增: public bool IsCanUpdate() | |
| 66 | 新增: { | |
| 67 | 新增: return !(nowVersion == Info.Version); | |
| 68 | 新增: } | |
| 69 | 新增: public async Task<VersionInfo> GetRequest() | |
| 70 | 新增: { | |
| 71 | 新增: var result = await Task.Run(() => | |
| 72 | 新增: { | |
| 73 | 新增: HttpWebResponse httpWebRespones = null; | |
| 74 | 新增: try | |
| 75 | 新增: { | |
| 76 | 新增: System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; | |
| 77 | 新增: HttpWebRequest httpWebRequest = WebRequest.Create(githubUrl) as HttpWebRequest; | |
| 78 | 新增: httpWebRequest.Timeout = 60 * 1000; | |
| 79 | 新增: httpWebRequest.ReadWriteTimeout = 60000; | |
| 80 | 新增: httpWebRequest.AllowAutoRedirect = true; | |
| 81 | 新增: httpWebRequest.UserAgent = "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36"; | |
| 82 | 新增: httpWebRespones = (HttpWebResponse)httpWebRequest.GetResponse(); | |
| 83 | 新增: | |
| 84 | 新增: | |
| 85 | 新增: using (Stream stream = httpWebRespones.GetResponseStream()) | |
| 86 | 新增: { | |
| 87 | 新增: List<byte> lst = new List<byte>(); | |
| 88 | 新增: int nRead = 0; | |
| 89 | 新增: while ((nRead = stream.ReadByte()) != -1) lst.Add((byte)nRead); | |
| 90 | 新增: byte[] bodyBytes = lst.ToArray(); | |
| 91 | 新增: | |
| 92 | 新增: string body = Encoding.UTF8.GetString(bodyBytes, 0, bodyBytes.Length); | |
| 93 | 新增: | |
| 94 | 新增: var data = JsonConvert.DeserializeObject<GithubModel>(body); | |
| 95 | 新增: Info.IsPre = data.prerelease; | |
| 96 | 新增: Info.Title = data.name; | |
| 97 | 新增: Info.Version = data.tag_name; | |
| 98 | 新增: Info.DownloadUrl = data.assets[0].browser_download_url; | |
| 99 | 新增: Info.HtmlUrl = data.html_url; | |
| 100 | 新增: return Info; | |
| 101 | 新增: } | |
| 102 | 新增: | |
| 103 | 新增: } | |
| 104 | 新增: catch (Exception ec) | |
| 105 | 新增: { | |
| 106 | 新增: return null; | |
| 107 | 新增: } | |
| 108 | 新增: | |
| 109 | 新增: }); | |
| 110 | 新增: return result; | |
| 111 | 新增: } | |
| 112 | 新增: } | |
| 113 | 新增:} | |
| @@ -0,0 +1,17 @@ | ||
| 1 | 新增:using System; | |
| 2 | 新增:using System.Collections.Generic; | |
| 3 | 新增:using System.Linq; | |
| 4 | 新增:using System.Text; | |
| 5 | 新增:using System.Threading.Tasks; | |
| 6 | 新增: | |
| 7 | 新增:namespace Updater | |
| 8 | 新增:{ | |
| 9 | 新增: public class MainModel : UINotifyPropertyChanged | |
| 10 | 新增: { | |
| 11 | 新增: private double ProcessValue_; | |
| 12 | 新增: public double ProcessValue { get { return ProcessValue_; } set { ProcessValue_ = value; OnPropertyChanged(); } } | |
| 13 | 新增: private string Version_; | |
| 14 | 新增: public string Version { get { return Version_; } set { Version_ = value; OnPropertyChanged(); } } | |
| 15 | 新增: | |
| 16 | 新增: } | |
| 17 | 新增:} | |
| @@ -0,0 +1,42 @@ | ||
| 1 | 新增:<Window x:Class="Updater.MainWindow" | |
| 2 | 新增: xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" | |
| 3 | 新增: xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" | |
| 4 | 新增: xmlns:d="http://schemas.microsoft.com/expression/blend/2008" | |
| 5 | 新增: xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" | |
| 6 | 新增: xmlns:local="clr-namespace:Updater" | |
| 7 | 新增: mc:Ignorable="d" | |
| 8 | 新增: Title="Tai 升级程序" ResizeMode="NoResize" Height="310" Width="435" WindowStartupLocation="CenterScreen"> | |
| 9 | 新增: <Grid Margin="10"> | |
| 10 | 新增: <Grid.RowDefinitions> | |
| 11 | 新增: <RowDefinition Height="*"/> | |
| 12 | 新增: <RowDefinition Height="50"/> | |
| 13 | 新增: | |
| 14 | 新增: </Grid.RowDefinitions> | |
| 15 | 新增: <StackPanel> | |
| 16 | 新增: <Border Background="#f3f3f3" Padding="10" CornerRadius="2"> | |
| 17 | 新增: <TextBlock x:Name="StatusLabel" Foreground="Gray" TextWrapping="WrapWithOverflow"/> | |
| 18 | 新增: </Border> | |
| 19 | 新增: <ProgressBar x:Name="ProgressBar" Height="10" Margin="0,10,0,10" Maximum="100" Value="{Binding ProcessValue}"/> | |
| 20 | 新增: <StackPanel x:Name="NewVersionSP" Margin="10"> | |
| 21 | 新增: <StackPanel Orientation="Horizontal"> | |
| 22 | 新增: <TextBlock VerticalAlignment="Center"><Run>版本号</Run> <Run x:Name="Version" Foreground="Gray"/></TextBlock> | |
| 23 | 新增: <Border x:Name="PreTag" ToolTip="预览版表示开发者没有进行过多的测试,相较于正式版可能会多一些bug,但也并不是一定" Background="OrangeRed" Padding="5,2" CornerRadius="4" VerticalAlignment="Center" Margin="10,0,0,0"> | |
| 24 | 新增: <TextBlock Text="预览版" Foreground="White" FontSize="10" VerticalAlignment="Center" HorizontalAlignment="Center"/> | |
| 25 | 新增: </Border> | |
| 26 | 新增: </StackPanel> | |
| 27 | 新增: <TextBlock Margin="0,10,0,0" ToolTip="版本简介"><Run x:Name="VersionTitle" Foreground="Gray"/></TextBlock> | |
| 28 | 新增: <TextBlock Margin="0,10,0,0" ToolTip="在浏览器中打开"><Hyperlink Click="Hyperlink_Click">查看详细更新内容</Hyperlink></TextBlock> | |
| 29 | 新增: | |
| 30 | 新增: </StackPanel> | |
| 31 | 新增: </StackPanel> | |
| 32 | 新增: <StackPanel Orientation="Horizontal" Grid.Row="1" VerticalAlignment="Center" HorizontalAlignment="Left"> | |
| 33 | 新增: <Button x:Name="UpdateBtn" Padding="10,8" Margin="0,0,10,0" Click="UpdateBtn_Click">升级到此新版本</Button> | |
| 34 | 新增: <Button x:Name="ReCheckBtn" Padding="10,8" Click="ReCheckBtn_Click">重新检查</Button> | |
| 35 | 新增: | |
| 36 | 新增: </StackPanel> | |
| 37 | 新增: <TextBlock Grid.Row="1" VerticalAlignment="Bottom" HorizontalAlignment="Right"> | |
| 38 | 新增: <Run>当前版本号:</Run><Run Text="{Binding Version}"/> | |
| 39 | 新增: </TextBlock> | |
| 40 | 新增: | |
| 41 | 新增: </Grid> | |
| 42 | 新增:</Window> | |
| @@ -0,0 +1,240 @@ | ||
| 1 | 新增:using System; | |
| 2 | 新增:using System.Collections.Generic; | |
| 3 | 新增:using System.Diagnostics; | |
| 4 | 新增:using System.IO; | |
| 5 | 新增:using System.Linq; | |
| 6 | 新增:using System.Net; | |
| 7 | 新增:using System.Text; | |
| 8 | 新增:using System.Threading.Tasks; | |
| 9 | 新增:using System.Windows; | |
| 10 | 新增:using System.Windows.Controls; | |
| 11 | 新增:using System.Windows.Data; | |
| 12 | 新增:using System.Windows.Documents; | |
| 13 | 新增:using System.Windows.Input; | |
| 14 | 新增:using System.Windows.Media; | |
| 15 | 新增:using System.Windows.Media.Imaging; | |
| 16 | 新增:using System.Windows.Navigation; | |
| 17 | 新增:using System.Windows.Shapes; | |
| 18 | 新增:using static Updater.GithubRelease; | |
| 19 | 新增: | |
| 20 | 新增:namespace Updater | |
| 21 | 新增:{ | |
| 22 | 新增: /// <summary> | |
| 23 | 新增: /// MainWindow.xaml 的交互逻辑 | |
| 24 | 新增: /// </summary> | |
| 25 | 新增: public partial class MainWindow : Window | |
| 26 | 新增: { | |
| 27 | 新增: GithubRelease githubRelease; | |
| 28 | 新增: | |
| 29 | 新增: /// <summary> | |
| 30 | 新增: /// 新版本保存目录路径 | |
| 31 | 新增: /// </summary> | |
| 32 | 新增: private string SaveDir = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory); | |
| 33 | 新增: /// <summary> | |
| 34 | 新增: /// 新版本保存名字 | |
| 35 | 新增: /// </summary> | |
| 36 | 新增: private string SaveName = "update.zip"; | |
| 37 | 新增: /// <summary> | |
| 38 | 新增: /// 新版本下载路径 | |
| 39 | 新增: /// </summary> | |
| 40 | 新增: private string NewVersionZipURL; | |
| 41 | 新增: /// <summary> | |
| 42 | 新增: /// 新版本发布页路径 | |
| 43 | 新增: /// </summary> | |
| 44 | 新增: private string NewVersionURL; | |
| 45 | 新增: private MainModel mainModel; | |
| 46 | 新增: public MainWindow() | |
| 47 | 新增: { | |
| 48 | 新增: InitializeComponent(); | |
| 49 | 新增: | |
| 50 | 新增: mainModel = new MainModel(); | |
| 51 | 新增: | |
| 52 | 新增: DataContext = mainModel; | |
| 53 | 新增: | |
| 54 | 新增: mainModel.PropertyChanged += MainModel_PropertyChanged; | |
| 55 | 新增: } | |
| 56 | 新增: | |
| 57 | 新增: private void MainModel_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e) | |
| 58 | 新增: { | |
| 59 | 新增: if (e.PropertyName == nameof(mainModel.Version)) | |
| 60 | 新增: { | |
| 61 | 新增: githubRelease = new GithubRelease("https://api.github.com/repos/planshit/tai/releases/latest", mainModel.Version); | |
| 62 | 新增: | |
| 63 | 新增: Check(); | |
| 64 | 新增: } | |
| 65 | 新增: } | |
| 66 | 新增: | |
| 67 | 新增: private async void Download() | |
| 68 | 新增: { | |
| 69 | 新增: SetStatus("正在下载新版本文件...", false); | |
| 70 | 新增: | |
| 71 | 新增: UpdateBtn.Visibility = Visibility.Collapsed; | |
| 72 | 新增: ReCheckBtn.Visibility = Visibility.Collapsed; | |
| 73 | 新增: ProgressBar.Visibility = Visibility.Visible; | |
| 74 | 新增: mainModel.ProcessValue = 0; | |
| 75 | 新增: | |
| 76 | 新增: var res = await Task.Run(() => | |
| 77 | 新增: { | |
| 78 | 新增: try | |
| 79 | 新增: { | |
| 80 | 新增: // 确认保存目录 | |
| 81 | 新增: if (!Directory.Exists(SaveDir)) | |
| 82 | 新增: { | |
| 83 | 新增: Directory.CreateDirectory(SaveDir); | |
| 84 | 新增: } | |
| 85 | 新增: | |
| 86 | 新增: Uri uri = new Uri(NewVersionZipURL); | |
| 87 | 新增: HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(uri); | |
| 88 | 新增: httpWebRequest.Timeout = 120 * 1000; | |
| 89 | 新增: HttpWebResponse httpWebResponse = (HttpWebResponse)httpWebRequest.GetResponse(); | |
| 90 | 新增: | |
| 91 | 新增: | |
| 92 | 新增: long totalBytes = httpWebResponse.ContentLength; | |
| 93 | 新增: | |
| 94 | 新增: Stream st = httpWebResponse.GetResponseStream(); | |
| 95 | 新增: Stream so = new FileStream(System.IO.Path.Combine(SaveDir, SaveName), FileMode.Create); | |
| 96 | 新增: | |
| 97 | 新增: long totalDownloadedByte = 0; | |
| 98 | 新增: byte[] by = new byte[1024]; | |
| 99 | 新增: int osize = st.Read(by, 0, (int)by.Length); | |
| 100 | 新增: while (osize > 0) | |
| 101 | 新增: { | |
| 102 | 新增: | |
| 103 | 新增: totalDownloadedByte = osize + totalDownloadedByte; | |
| 104 | 新增: so.Write(by, 0, osize); | |
| 105 | 新增: | |
| 106 | 新增: osize = st.Read(by, 0, (int)by.Length); | |
| 107 | 新增: | |
| 108 | 新增: //进度计算 | |
| 109 | 新增: double process = double.Parse(String.Format("{0:F}", | |
| 110 | 新增: ((double)totalDownloadedByte / (double)totalBytes * 100))); | |
| 111 | 新增: mainModel.ProcessValue = process; | |
| 112 | 新增: //Debug.WriteLine(ProcessValue); | |
| 113 | 新增: } | |
| 114 | 新增: //关闭资源 | |
| 115 | 新增: httpWebResponse.Close(); | |
| 116 | 新增: so.Close(); | |
| 117 | 新增: st.Close(); | |
| 118 | 新增: | |
| 119 | 新增: return true; | |
| 120 | 新增: | |
| 121 | 新增: } | |
| 122 | 新增: catch (Exception ec) | |
| 123 | 新增: { | |
| 124 | 新增: return false; | |
| 125 | 新增: } | |
| 126 | 新增: }); | |
| 127 | 新增: | |
| 128 | 新增: if (res) | |
| 129 | 新增: { | |
| 130 | 新增: // 准备更新 | |
| 131 | 新增: var process = Process.GetProcessesByName("Tai"); | |
| 132 | 新增: if (process != null && process.Length > 0) | |
| 133 | 新增: { | |
| 134 | 新增: process[0].Kill(); | |
| 135 | 新增: } | |
| 136 | 新增: | |
| 137 | 新增: SetStatus("下载完成,正在解压请勿关闭此窗口..."); | |
| 138 | 新增: | |
| 139 | 新增: string unpath = Directory.GetParent(AppDomain.CurrentDomain.BaseDirectory).Parent.FullName; | |
| 140 | 新增: | |
| 141 | 新增: var unresult = await Task.Run(async () => | |
| 142 | 新增: { | |
| 143 | 新增: await Task.Delay(3000); | |
| 144 | 新增: return Unzip.ExtractZipFile(System.IO.Path.Combine(SaveDir, SaveName), unpath); | |
| 145 | 新增: }); | |
| 146 | 新增: if (unresult) | |
| 147 | 新增: { | |
| 148 | 新增: SetStatus("更新完成!", false); | |
| 149 | 新增: Process tai = new Process(); | |
| 150 | 新增: ProcessStartInfo startInfo = new ProcessStartInfo(System.IO.Path.Combine(unpath, "Tai.exe")); | |
| 151 | 新增: tai.StartInfo = startInfo; | |
| 152 | 新增: tai.Start(); | |
| 153 | 新增: } | |
| 154 | 新增: else | |
| 155 | 新增: { | |
| 156 | 新增: SetStatus("解压文件时发生异常,请重试!通常情况可能是因为Tai主程序尚未退出。", false); | |
| 157 | 新增: UpdateBtn.Visibility = Visibility.Visible; | |
| 158 | 新增: | |
| 159 | 新增: } | |
| 160 | 新增: } | |
| 161 | 新增: else | |
| 162 | 新增: { | |
| 163 | 新增: //下载发生异常 | |
| 164 | 新增: SetStatus("下载时发生异常,请重试。", false); | |
| 165 | 新增: UpdateBtn.Visibility = Visibility.Visible; | |
| 166 | 新增: } | |
| 167 | 新增: } | |
| 168 | 新增: | |
| 169 | 新增: | |
| 170 | 新增: private async void Check() | |
| 171 | 新增: { | |
| 172 | 新增: NewVersionSP.Visibility = Visibility.Collapsed; | |
| 173 | 新增: PreTag.Visibility = Visibility.Collapsed; | |
| 174 | 新增: | |
| 175 | 新增: SetStatus("正在检查更新"); | |
| 176 | 新增: UpdateBtn.Visibility = Visibility.Collapsed; | |
| 177 | 新增: ReCheckBtn.IsEnabled = false; | |
| 178 | 新增: | |
| 179 | 新增: var info = await githubRelease.GetRequest(); | |
| 180 | 新增: | |
| 181 | 新增: if (info != null) | |
| 182 | 新增: { | |
| 183 | 新增: if (githubRelease.IsCanUpdate()) | |
| 184 | 新增: { | |
| 185 | 新增: UpdateBtn.Visibility = Visibility.Visible; | |
| 186 | 新增: | |
| 187 | 新增: NewVersionSP.Visibility = Visibility.Visible; | |
| 188 | 新增: Version.Text = info.Version; | |
| 189 | 新增: VersionTitle.Text = info.Title; | |
| 190 | 新增: NewVersionZipURL = info.DownloadUrl; | |
| 191 | 新增: NewVersionURL = info.HtmlUrl; | |
| 192 | 新增: if (info.IsPre) | |
| 193 | 新增: { | |
| 194 | 新增: PreTag.Visibility = Visibility.Visible; | |
| 195 | 新增: } | |
| 196 | 新增: SetStatus("检测到新的版本!", false); | |
| 197 | 新增: } | |
| 198 | 新增: else | |
| 199 | 新增: { | |
| 200 | 新增: SetStatus("目前没有可用的更新。", false); | |
| 201 | 新增: } | |
| 202 | 新增: } | |
| 203 | 新增: else | |
| 204 | 新增: { | |
| 205 | 新增: SetStatus("无法获取版本信息,请检查代理或网络。", false); | |
| 206 | 新增: } | |
| 207 | 新增: ReCheckBtn.IsEnabled = true; | |
| 208 | 新增: | |
| 209 | 新增: } | |
| 210 | 新增: | |
| 211 | 新增: private void SetStatus(string statusText, bool isLoading = true) | |
| 212 | 新增: { | |
| 213 | 新增: StatusLabel.Text = statusText; | |
| 214 | 新增: ProgressBar.IsIndeterminate = isLoading; | |
| 215 | 新增: if (isLoading) | |
| 216 | 新增: { | |
| 217 | 新增: ProgressBar.Visibility = Visibility.Visible; | |
| 218 | 新增: } | |
| 219 | 新增: else | |
| 220 | 新增: { | |
| 221 | 新增: ProgressBar.Visibility = Visibility.Collapsed; | |
| 222 | 新增: } | |
| 223 | 新增: } | |
| 224 | 新增: | |
| 225 | 新增: private void ReCheckBtn_Click(object sender, RoutedEventArgs e) | |
| 226 | 新增: { | |
| 227 | 新增: Check(); | |
| 228 | 新增: } | |
| 229 | 新增: | |
| 230 | 新增: private void UpdateBtn_Click(object sender, RoutedEventArgs e) | |
| 231 | 新增: { | |
| 232 | 新增: Download(); | |
| 233 | 新增: } | |
| 234 | 新增: | |
| 235 | 新增: private void Hyperlink_Click(object sender, RoutedEventArgs e) | |
| 236 | 新增: { | |
| 237 | 新增: Process.Start(new ProcessStartInfo(NewVersionURL)); | |
| 238 | 新增: } | |
| 239 | 新增: } | |
| 240 | 新增:} | |
| @@ -0,0 +1,55 @@ | ||
| 1 | 新增:using System.Reflection; | |
| 2 | 新增:using System.Resources; | |
| 3 | 新增:using System.Runtime.CompilerServices; | |
| 4 | 新增:using System.Runtime.InteropServices; | |
| 5 | 新增:using System.Windows; | |
| 6 | 新增: | |
| 7 | 新增:// 有关程序集的一般信息由以下 | |
| 8 | 新增:// 控制。更改这些特性值可修改 | |
| 9 | 新增:// 与程序集关联的信息。 | |
| 10 | 新增:[assembly: AssemblyTitle("Updater")] | |
| 11 | 新增:[assembly: AssemblyDescription("")] | |
| 12 | 新增:[assembly: AssemblyConfiguration("")] | |
| 13 | 新增:[assembly: AssemblyCompany("")] | |
| 14 | 新增:[assembly: AssemblyProduct("Updater")] | |
| 15 | 新增:[assembly: AssemblyCopyright("Copyright © 2021")] | |
| 16 | 新增:[assembly: AssemblyTrademark("")] | |
| 17 | 新增:[assembly: AssemblyCulture("")] | |
| 18 | 新增: | |
| 19 | 新增:// 将 ComVisible 设置为 false 会使此程序集中的类型 | |
| 20 | 新增://对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型 | |
| 21 | 新增://请将此类型的 ComVisible 特性设置为 true。 | |
| 22 | 新增:[assembly: ComVisible(false)] | |
| 23 | 新增: | |
| 24 | 新增://若要开始生成可本地化的应用程序,请设置 | |
| 25 | 新增://.csproj 文件中的 <UICulture>CultureYouAreCodingWith</UICulture> | |
| 26 | 新增://例如,如果您在源文件中使用的是美国英语, | |
| 27 | 新增://使用的是美国英语,请将 <UICulture> 设置为 en-US。 然后取消 | |
| 28 | 新增://对以下 NeutralResourceLanguage 特性的注释。 更新 | |
| 29 | 新增://以下行中的“en-US”以匹配项目文件中的 UICulture 设置。 | |
| 30 | 新增: | |
| 31 | 新增://[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)] | |
| 32 | 新增: | |
| 33 | 新增: | |
| 34 | 新增:[assembly: ThemeInfo( | |
| 35 | 新增: ResourceDictionaryLocation.None, //主题特定资源词典所处位置 | |
| 36 | 新增: //(未在页面中找到资源时使用, | |
| 37 | 新增: //或应用程序资源字典中找到时使用) | |
| 38 | 新增: ResourceDictionaryLocation.SourceAssembly //常规资源词典所处位置 | |
| 39 | 新增: //(未在页面中找到资源时使用, | |
| 40 | 新增: //、应用程序或任何主题专用资源字典中找到时使用) | |
| 41 | 新增:)] | |
| 42 | 新增: | |
| 43 | 新增: | |
| 44 | 新增:// 程序集的版本信息由下列四个值组成: | |
| 45 | 新增:// | |
| 46 | 新增:// 主版本 | |
| 47 | 新增:// 次版本 | |
| 48 | 新增:// 生成号 | |
| 49 | 新增:// 修订号 | |
| 50 | 新增:// | |
| 51 | 新增://可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值 | |
| 52 | 新增://通过使用 "*",如下所示: | |
| 53 | 新增:// [assembly: AssemblyVersion("1.0.*")] | |
| 54 | 新增:[assembly: AssemblyVersion("1.0.0.0")] | |
| 55 | 新增:[assembly: AssemblyFileVersion("1.0.0.0")] | |
| @@ -0,0 +1,71 @@ | ||
| 1 | 新增://------------------------------------------------------------------------------ | |
| 2 | 新增:// <auto-generated> | |
| 3 | 新增:// 此代码由工具生成。 | |
| 4 | 新增:// 运行时版本: 4.0.30319.42000 | |
| 5 | 新增:// | |
| 6 | 新增:// 对此文件的更改可能导致不正确的行为,如果 | |
| 7 | 新增:// 重新生成代码,则所做更改将丢失。 | |
| 8 | 新增:// </auto-generated> | |
| 9 | 新增://------------------------------------------------------------------------------ | |
| 10 | 新增: | |
| 11 | 新增:namespace Updater.Properties | |
| 12 | 新增:{ | |
| 13 | 新增: | |
| 14 | 新增: | |
| 15 | 新增: /// <summary> | |
| 16 | 新增: /// 强类型资源类,用于查找本地化字符串等。 | |
| 17 | 新增: /// </summary> | |
| 18 | 新增: // 此类是由 StronglyTypedResourceBuilder | |
| 19 | 新增: // 类通过类似于 ResGen 或 Visual Studio 的工具自动生成的。 | |
| 20 | 新增: // 若要添加或删除成员,请编辑 .ResX 文件,然后重新运行 ResGen | |
| 21 | 新增: // (以 /str 作为命令选项),或重新生成 VS 项目。 | |
| 22 | 新增: [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] | |
| 23 | 新增: [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] | |
| 24 | 新增: [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] | |
| 25 | 新增: internal class Resources | |
| 26 | 新增: { | |
| 27 | 新增: | |
| 28 | 新增: private static global::System.Resources.ResourceManager resourceMan; | |
| 29 | 新增: | |
| 30 | 新增: private static global::System.Globalization.CultureInfo resourceCulture; | |
| 31 | 新增: | |
| 32 | 新增: [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] | |
| 33 | 新增: internal Resources() | |
| 34 | 新增: { | |
| 35 | 新增: } | |
| 36 | 新增: | |
| 37 | 新增: /// <summary> | |
| 38 | 新增: /// 返回此类使用的缓存 ResourceManager 实例。 | |
| 39 | 新增: /// </summary> | |
| 40 | 新增: [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] | |
| 41 | 新增: internal static global::System.Resources.ResourceManager ResourceManager | |
| 42 | 新增: { | |
| 43 | 新增: get | |
| 44 | 新增: { | |
| 45 | 新增: if ((resourceMan == null)) | |
| 46 | 新增: { | |
| 47 | 新增: global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Updater.Properties.Resources", typeof(Resources).Assembly); | |
| 48 | 新增: resourceMan = temp; | |
| 49 | 新增: } | |
| 50 | 新增: return resourceMan; | |
| 51 | 新增: } | |
| 52 | 新增: } | |
| 53 | 新增: | |
| 54 | 新增: /// <summary> | |
| 55 | 新增: /// 重写当前线程的 CurrentUICulture 属性,对 | |
| 56 | 新增: /// 使用此强类型资源类的所有资源查找执行重写。 | |
| 57 | 新增: /// </summary> | |
| 58 | 新增: [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] | |
| 59 | 新增: internal static global::System.Globalization.CultureInfo Culture | |
| 60 | 新增: { | |
| 61 | 新增: get | |
| 62 | 新增: { | |
| 63 | 新增: return resourceCulture; | |
| 64 | 新增: } | |
| 65 | 新增: set | |
| 66 | 新增: { | |
| 67 | 新增: resourceCulture = value; | |
| 68 | 新增: } | |
| 69 | 新增: } | |
| 70 | 新增: } | |
| 71 | 新增:} | |
| @@ -0,0 +1,117 @@ | ||
| 1 | 新增:<?xml version="1.0" encoding="utf-8"?> | |
| 2 | 新增:<root> | |
| 3 | 新增: <!-- | |
| 4 | 新增: Microsoft ResX Schema | |
| 5 | 新增: | |
| 6 | 新增: Version 2.0 | |
| 7 | 新增: | |
| 8 | 新增: The primary goals of this format is to allow a simple XML format | |
| 9 | 新增: that is mostly human readable. The generation and parsing of the | |
| 10 | 新增: various data types are done through the TypeConverter classes | |
| 11 | 新增: associated with the data types. | |
| 12 | 新增: | |
| 13 | 新增: Example: | |
| 14 | 新增: | |
| 15 | 新增: ... ado.net/XML headers & schema ... | |
| 16 | 新增: <resheader name="resmimetype">text/microsoft-resx</resheader> | |
| 17 | 新增: <resheader name="version">2.0</resheader> | |
| 18 | 新增: <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader> | |
| 19 | 新增: <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader> | |
| 20 | 新增: <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data> | |
| 21 | 新增: <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data> | |
| 22 | 新增: <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64"> | |
| 23 | 新增: <value>[base64 mime encoded serialized .NET Framework object]</value> | |
| 24 | 新增: </data> | |
| 25 | 新增: <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> | |
| 26 | 新增: <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value> | |
| 27 | 新增: <comment>This is a comment</comment> | |
| 28 | 新增: </data> | |
| 29 | 新增: | |
| 30 | 新增: There are any number of "resheader" rows that contain simple | |
| 31 | 新增: name/value pairs. | |
| 32 | 新增: | |
| 33 | 新增: Each data row contains a name, and value. The row also contains a | |
| 34 | 新增: type or mimetype. Type corresponds to a .NET class that support | |
| 35 | 新增: text/value conversion through the TypeConverter architecture. | |
| 36 | 新增: Classes that don't support this are serialized and stored with the | |
| 37 | 新增: mimetype set. | |
| 38 | 新增: | |
| 39 | 新增: The mimetype is used for serialized objects, and tells the | |
| 40 | 新增: ResXResourceReader how to depersist the object. This is currently not | |
| 41 | 新增: extensible. For a given mimetype the value must be set accordingly: | |
| 42 | 新增: | |
| 43 | 新增: Note - application/x-microsoft.net.object.binary.base64 is the format | |
| 44 | 新增: that the ResXResourceWriter will generate, however the reader can | |
| 45 | 新增: read any of the formats listed below. | |
| 46 | 新增: | |
| 47 | 新增: mimetype: application/x-microsoft.net.object.binary.base64 | |
| 48 | 新增: value : The object must be serialized with | |
| 49 | 新增: : System.Serialization.Formatters.Binary.BinaryFormatter | |
| 50 | 新增: : and then encoded with base64 encoding. | |
| 51 | 新增: | |
| 52 | 新增: mimetype: application/x-microsoft.net.object.soap.base64 | |
| 53 | 新增: value : The object must be serialized with | |
| 54 | 新增: : System.Runtime.Serialization.Formatters.Soap.SoapFormatter | |
| 55 | 新增: : and then encoded with base64 encoding. | |
| 56 | 新增: | |
| 57 | 新增: mimetype: application/x-microsoft.net.object.bytearray.base64 | |
| 58 | 新增: value : The object must be serialized into a byte array | |
| 59 | 新增: : using a System.ComponentModel.TypeConverter | |
| 60 | 新增: : and then encoded with base64 encoding. | |
| 61 | 新增: --> | |
| 62 | 新增: <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> | |
| 63 | 新增: <xsd:element name="root" msdata:IsDataSet="true"> | |
| 64 | 新增: <xsd:complexType> | |
| 65 | 新增: <xsd:choice maxOccurs="unbounded"> | |
| 66 | 新增: <xsd:element name="metadata"> | |
| 67 | 新增: <xsd:complexType> | |
| 68 | 新增: <xsd:sequence> | |
| 69 | 新增: <xsd:element name="value" type="xsd:string" minOccurs="0" /> | |
| 70 | 新增: </xsd:sequence> | |
| 71 | 新增: <xsd:attribute name="name" type="xsd:string" /> | |
| 72 | 新增: <xsd:attribute name="type" type="xsd:string" /> | |
| 73 | 新增: <xsd:attribute name="mimetype" type="xsd:string" /> | |
| 74 | 新增: </xsd:complexType> | |
| 75 | 新增: </xsd:element> | |
| 76 | 新增: <xsd:element name="assembly"> | |
| 77 | 新增: <xsd:complexType> | |
| 78 | 新增: <xsd:attribute name="alias" type="xsd:string" /> | |
| 79 | 新增: <xsd:attribute name="name" type="xsd:string" /> | |
| 80 | 新增: </xsd:complexType> | |
| 81 | 新增: </xsd:element> | |
| 82 | 新增: <xsd:element name="data"> | |
| 83 | 新增: <xsd:complexType> | |
| 84 | 新增: <xsd:sequence> | |
| 85 | 新增: <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> | |
| 86 | 新增: <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" /> | |
| 87 | 新增: </xsd:sequence> | |
| 88 | 新增: <xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" /> | |
| 89 | 新增: <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" /> | |
| 90 | 新增: <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" /> | |
| 91 | 新增: </xsd:complexType> | |
| 92 | 新增: </xsd:element> | |
| 93 | 新增: <xsd:element name="resheader"> | |
| 94 | 新增: <xsd:complexType> | |
| 95 | 新增: <xsd:sequence> | |
| 96 | 新增: <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> | |
| 97 | 新增: </xsd:sequence> | |
| 98 | 新增: <xsd:attribute name="name" type="xsd:string" use="required" /> | |
| 99 | 新增: </xsd:complexType> | |
| 100 | 新增: </xsd:element> | |
| 101 | 新增: </xsd:choice> | |
| 102 | 新增: </xsd:complexType> | |
| 103 | 新增: </xsd:element> | |
| 104 | 新增: </xsd:schema> | |
| 105 | 新增: <resheader name="resmimetype"> | |
| 106 | 新增: <value>text/microsoft-resx</value> | |
| 107 | 新增: </resheader> | |
| 108 | 新增: <resheader name="version"> | |
| 109 | 新增: <value>2.0</value> | |
| 110 | 新增: </resheader> | |
| 111 | 新增: <resheader name="reader"> | |
| 112 | 新增: <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> | |
| 113 | 新增: </resheader> | |
| 114 | 新增: <resheader name="writer"> | |
| 115 | 新增: <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> | |
| 116 | 新增: </resheader> | |
| 117 | 新增:</root> | |
| 文件末尾没有换行 | ||
| @@ -0,0 +1,30 @@ | ||
| 1 | 新增://------------------------------------------------------------------------------ | |
| 2 | 新增:// <auto-generated> | |
| 3 | 新增:// This code was generated by a tool. | |
| 4 | 新增:// Runtime Version:4.0.30319.42000 | |
| 5 | 新增:// | |
| 6 | 新增:// Changes to this file may cause incorrect behavior and will be lost if | |
| 7 | 新增:// the code is regenerated. | |
| 8 | 新增:// </auto-generated> | |
| 9 | 新增://------------------------------------------------------------------------------ | |
| 10 | 新增: | |
| 11 | 新增:namespace Updater.Properties | |
| 12 | 新增:{ | |
| 13 | 新增: | |
| 14 | 新增: | |
| 15 | 新增: [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] | |
| 16 | 新增: [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")] | |
| 17 | 新增: internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase | |
| 18 | 新增: { | |
| 19 | 新增: | |
| 20 | 新增: private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); | |
| 21 | 新增: | |
| 22 | 新增: public static Settings Default | |
| 23 | 新增: { | |
| 24 | 新增: get | |
| 25 | 新增: { | |
| 26 | 新增: return defaultInstance; | |
| 27 | 新增: } | |
| 28 | 新增: } | |
| 29 | 新增: } | |
| 30 | 新增:} | |
| @@ -0,0 +1,7 @@ | ||
| 1 | 新增:<?xml version='1.0' encoding='utf-8'?> | |
| 2 | 新增:<SettingsFile xmlns="uri:settings" CurrentProfile="(Default)"> | |
| 3 | 新增: <Profiles> | |
| 4 | 新增: <Profile Name="(Default)" /> | |
| 5 | 新增: </Profiles> | |
| 6 | 新增: <Settings /> | |
| 7 | 新增:</SettingsFile> | |
| 文件末尾没有换行 | ||
| @@ -0,0 +1,26 @@ | ||
| 1 | 新增:using System; | |
| 2 | 新增:using System.Collections.Generic; | |
| 3 | 新增:using System.ComponentModel; | |
| 4 | 新增:using System.Linq; | |
| 5 | 新增:using System.Runtime.CompilerServices; | |
| 6 | 新增:using System.Text; | |
| 7 | 新增:using System.Threading.Tasks; | |
| 8 | 新增: | |
| 9 | 新增:namespace Updater | |
| 10 | 新增:{ | |
| 11 | 新增: public class UINotifyPropertyChanged : INotifyPropertyChanged | |
| 12 | 新增: { | |
| 13 | 新增: public event PropertyChangedEventHandler PropertyChanged; | |
| 14 | 新增: | |
| 15 | 新增: public void OnPropertyChanged([CallerMemberName] string propertyName = "") | |
| 16 | 新增: { | |
| 17 | 新增: | |
| 18 | 新增: PropertyChangedEventHandler handler = PropertyChanged; | |
| 19 | 新增: if (handler != null) | |
| 20 | 新增: { | |
| 21 | 新增: handler.Invoke(this, new PropertyChangedEventArgs(propertyName)); | |
| 22 | 新增: } | |
| 23 | 新增: | |
| 24 | 新增: } | |
| 25 | 新增: } | |
| 26 | 新增:} | |
| @@ -0,0 +1,88 @@ | ||
| 1 | 新增:using System; | |
| 2 | 新增:using System.Collections.Generic; | |
| 3 | 新增:using System.Diagnostics; | |
| 4 | 新增:using System.IO; | |
| 5 | 新增:using System.IO.Compression; | |
| 6 | 新增:using System.Linq; | |
| 7 | 新增:using System.Text; | |
| 8 | 新增:using System.Threading.Tasks; | |
| 9 | 新增: | |
| 10 | 新增:namespace Updater | |
| 11 | 新增:{ | |
| 12 | 新增: public class Unzip | |
| 13 | 新增: { | |
| 14 | 新增: /// <summary> | |
| 15 | 新增: /// 忽略的文件列表 | |
| 16 | 新增: /// </summary> | |
| 17 | 新增: static readonly string[] IgnoreFiles = { }; | |
| 18 | 新增: public static bool ExtractZipFile(string zipPath, string extractPath) | |
| 19 | 新增: { | |
| 20 | 新增: try | |
| 21 | 新增: { | |
| 22 | 新增: if (!extractPath.EndsWith(Path.DirectorySeparatorChar.ToString(), StringComparison.Ordinal)) | |
| 23 | 新增: extractPath += Path.DirectorySeparatorChar; | |
| 24 | 新增: | |
| 25 | 新增: using (ZipArchive archive = ZipFile.OpenRead(zipPath)) | |
| 26 | 新增: { | |
| 27 | 新增: foreach (ZipArchiveEntry entry in archive.Entries) | |
| 28 | 新增: { | |
| 29 | 新增: | |
| 30 | 新增: if (!IsIgnoreFile(entry.FullName)) | |
| 31 | 新增: { | |
| 32 | 新增: // Gets the full path to ensure that relative segments are removed. | |
| 33 | 新增: string destinationPath = Path.GetFullPath(Path.Combine(extractPath, entry.FullName)); | |
| 34 | 新增: if (!IsDir(destinationPath)) | |
| 35 | 新增: { | |
| 36 | 新增: // 判断路径是否存在 | |
| 37 | 新增: string dir = Path.GetDirectoryName(destinationPath); | |
| 38 | 新增: if (!Directory.Exists(dir)) | |
| 39 | 新增: { | |
| 40 | 新增: Directory.CreateDirectory(dir); | |
| 41 | 新增: } | |
| 42 | 新增: | |
| 43 | 新增: if (File.Exists(destinationPath)) | |
| 44 | 新增: { | |
| 45 | 新增: File.Delete(destinationPath); | |
| 46 | 新增: } | |
| 47 | 新增: // Ordinal match is safest, case-sensitive volumes can be mounted within volumes that | |
| 48 | 新增: // are case-insensitive. | |
| 49 | 新增: Debug.WriteLine($"抽取:{destinationPath}"); | |
| 50 | 新增: if (destinationPath.StartsWith(extractPath, StringComparison.Ordinal)) | |
| 51 | 新增: entry.ExtractToFile(destinationPath); | |
| 52 | 新增: } | |
| 53 | 新增: else | |
| 54 | 新增: { | |
| 55 | 新增: //创建目录 | |
| 56 | 新增: Directory.CreateDirectory(destinationPath); | |
| 57 | 新增: } | |
| 58 | 新增: } | |
| 59 | 新增: } | |
| 60 | 新增: return true; | |
| 61 | 新增: } | |
| 62 | 新增: } | |
| 63 | 新增: catch | |
| 64 | 新增: { | |
| 65 | 新增: return false; | |
| 66 | 新增: } | |
| 67 | 新增: } | |
| 68 | 新增: | |
| 69 | 新增: /// <summary> | |
| 70 | 新增: /// 指示文件是否是忽略的 | |
| 71 | 新增: /// </summary> | |
| 72 | 新增: /// <param name="fileName"></param> | |
| 73 | 新增: /// <returns></returns> | |
| 74 | 新增: static bool IsIgnoreFile(string fileName) | |
| 75 | 新增: { | |
| 76 | 新增: return (Array.IndexOf(IgnoreFiles, fileName) != -1); | |
| 77 | 新增: } | |
| 78 | 新增: /// <summary> | |
| 79 | 新增: /// 指示路径是否是目录 | |
| 80 | 新增: /// </summary> | |
| 81 | 新增: /// <param name="path"></param> | |
| 82 | 新增: /// <returns></returns> | |
| 83 | 新增: static bool IsDir(string path) | |
| 84 | 新增: { | |
| 85 | 新增: return (path.Last() == '\\'); | |
| 86 | 新增: } | |
| 87 | 新增: } | |
| 88 | 新增:} | |
| @@ -0,0 +1,107 @@ | ||
| 1 | 新增:<?xml version="1.0" encoding="utf-8"?> | |
| 2 | 新增:<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> | |
| 3 | 新增: <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" /> | |
| 4 | 新增: <PropertyGroup> | |
| 5 | 新增: <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> | |
| 6 | 新增: <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform> | |
| 7 | 新增: <ProjectGuid>{7A2F2592-3079-441C-8704-E71CE75BC593}</ProjectGuid> | |
| 8 | 新增: <OutputType>WinExe</OutputType> | |
| 9 | 新增: <RootNamespace>Updater</RootNamespace> | |
| 10 | 新增: <AssemblyName>Updater</AssemblyName> | |
| 11 | 新增: <TargetFrameworkVersion>v4.5</TargetFrameworkVersion> | |
| 12 | 新增: <FileAlignment>512</FileAlignment> | |
| 13 | 新增: <ProjectTypeGuids>{60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids> | |
| 14 | 新增: <WarningLevel>4</WarningLevel> | |
| 15 | 新增: <Deterministic>true</Deterministic> | |
| 16 | 新增: </PropertyGroup> | |
| 17 | 新增: <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> | |
| 18 | 新增: <PlatformTarget>AnyCPU</PlatformTarget> | |
| 19 | 新增: <DebugSymbols>true</DebugSymbols> | |
| 20 | 新增: <DebugType>full</DebugType> | |
| 21 | 新增: <Optimize>false</Optimize> | |
| 22 | 新增: <OutputPath>bin\Debug\</OutputPath> | |
| 23 | 新增: <DefineConstants>DEBUG;TRACE</DefineConstants> | |
| 24 | 新增: <ErrorReport>prompt</ErrorReport> | |
| 25 | 新增: <WarningLevel>4</WarningLevel> | |
| 26 | 新增: </PropertyGroup> | |
| 27 | 新增: <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' "> | |
| 28 | 新增: <PlatformTarget>AnyCPU</PlatformTarget> | |
| 29 | 新增: <DebugType>pdbonly</DebugType> | |
| 30 | 新增: <Optimize>true</Optimize> | |
| 31 | 新增: <OutputPath>bin\Release\</OutputPath> | |
| 32 | 新增: <DefineConstants>TRACE</DefineConstants> | |
| 33 | 新增: <ErrorReport>prompt</ErrorReport> | |
| 34 | 新增: <WarningLevel>4</WarningLevel> | |
| 35 | 新增: </PropertyGroup> | |
| 36 | 新增: <ItemGroup> | |
| 37 | 新增: <Reference Include="Newtonsoft.Json, Version=13.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL"> | |
| 38 | 新增: <HintPath>..\packages\Newtonsoft.Json.13.0.1\lib\net45\Newtonsoft.Json.dll</HintPath> | |
| 39 | 新增: </Reference> | |
| 40 | 新增: <Reference Include="System" /> | |
| 41 | 新增: <Reference Include="System.Data" /> | |
| 42 | 新增: <Reference Include="System.IO.Compression" /> | |
| 43 | 新增: <Reference Include="System.IO.Compression.FileSystem" /> | |
| 44 | 新增: <Reference Include="System.Xml" /> | |
| 45 | 新增: <Reference Include="Microsoft.CSharp" /> | |
| 46 | 新增: <Reference Include="System.Core" /> | |
| 47 | 新增: <Reference Include="System.Xml.Linq" /> | |
| 48 | 新增: <Reference Include="System.Data.DataSetExtensions" /> | |
| 49 | 新增: <Reference Include="System.Net.Http" /> | |
| 50 | 新增: <Reference Include="System.Xaml"> | |
| 51 | 新增: <RequiredTargetFramework>4.0</RequiredTargetFramework> | |
| 52 | 新增: </Reference> | |
| 53 | 新增: <Reference Include="WindowsBase" /> | |
| 54 | 新增: <Reference Include="PresentationCore" /> | |
| 55 | 新增: <Reference Include="PresentationFramework" /> | |
| 56 | 新增: </ItemGroup> | |
| 57 | 新增: <ItemGroup> | |
| 58 | 新增: <ApplicationDefinition Include="App.xaml"> | |
| 59 | 新增: <Generator>MSBuild:Compile</Generator> | |
| 60 | 新增: <SubType>Designer</SubType> | |
| 61 | 新增: </ApplicationDefinition> | |
| 62 | 新增: <Compile Include="MainModel.cs" /> | |
| 63 | 新增: <Compile Include="UINotifyPropertyChanged.cs" /> | |
| 64 | 新增: <Compile Include="Unzip.cs" /> | |
| 65 | 新增: <Page Include="MainWindow.xaml"> | |
| 66 | 新增: <Generator>MSBuild:Compile</Generator> | |
| 67 | 新增: <SubType>Designer</SubType> | |
| 68 | 新增: </Page> | |
| 69 | 新增: <Compile Include="App.xaml.cs"> | |
| 70 | 新增: <DependentUpon>App.xaml</DependentUpon> | |
| 71 | 新增: <SubType>Code</SubType> | |
| 72 | 新增: </Compile> | |
| 73 | 新增: <Compile Include="GithubRelease.cs" /> | |
| 74 | 新增: <Compile Include="MainWindow.xaml.cs"> | |
| 75 | 新增: <DependentUpon>MainWindow.xaml</DependentUpon> | |
| 76 | 新增: <SubType>Code</SubType> | |
| 77 | 新增: </Compile> | |
| 78 | 新增: </ItemGroup> | |
| 79 | 新增: <ItemGroup> | |
| 80 | 新增: <Compile Include="Properties\AssemblyInfo.cs"> | |
| 81 | 新增: <SubType>Code</SubType> | |
| 82 | 新增: </Compile> | |
| 83 | 新增: <Compile Include="Properties\Resources.Designer.cs"> | |
| 84 | 新增: <AutoGen>True</AutoGen> | |
| 85 | 新增: <DesignTime>True</DesignTime> | |
| 86 | 新增: <DependentUpon>Resources.resx</DependentUpon> | |
| 87 | 新增: </Compile> | |
| 88 | 新增: <Compile Include="Properties\Settings.Designer.cs"> | |
| 89 | 新增: <AutoGen>True</AutoGen> | |
| 90 | 新增: <DependentUpon>Settings.settings</DependentUpon> | |
| 91 | 新增: <DesignTimeSharedInput>True</DesignTimeSharedInput> | |
| 92 | 新增: </Compile> | |
| 93 | 新增: <EmbeddedResource Include="Properties\Resources.resx"> | |
| 94 | 新增: <Generator>ResXFileCodeGenerator</Generator> | |
| 95 | 新增: <LastGenOutput>Resources.Designer.cs</LastGenOutput> | |
| 96 | 新增: </EmbeddedResource> | |
| 97 | 新增: <None Include="packages.config" /> | |
| 98 | 新增: <None Include="Properties\Settings.settings"> | |
| 99 | 新增: <Generator>SettingsSingleFileGenerator</Generator> | |
| 100 | 新增: <LastGenOutput>Settings.Designer.cs</LastGenOutput> | |
| 101 | 新增: </None> | |
| 102 | 新增: </ItemGroup> | |
| 103 | 新增: <ItemGroup> | |
| 104 | 新增: <None Include="App.config" /> | |
| 105 | 新增: </ItemGroup> | |
| 106 | 新增: <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> | |
| 107 | 新增:</Project> | |
| 文件末尾没有换行 | ||
| @@ -0,0 +1,4 @@ | ||
| 1 | 新增:<?xml version="1.0" encoding="utf-8"?> | |
| 2 | 新增:<packages> | |
| 3 | 新增: <package id="Newtonsoft.Json" version="13.0.1" targetFramework="net45" /> | |
| 4 | 新增:</packages> | |
| 文件末尾没有换行 | ||

