diff --git a/.idea/.idea.ProxySU/.idea/codeStyles/codeStyleConfig.xml b/.idea/.idea.ProxySU/.idea/codeStyles/codeStyleConfig.xml new file mode 100644 index 0000000..7ad1bf1 --- /dev/null +++ b/.idea/.idea.ProxySU/.idea/codeStyles/codeStyleConfig.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/.idea/.idea.ProxySU/.idea/contentModel.xml b/.idea/.idea.ProxySU/.idea/contentModel.xml new file mode 100644 index 0000000..0f66ecb --- /dev/null +++ b/.idea/.idea.ProxySU/.idea/contentModel.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/.idea.ProxySU/.idea/encodings.xml b/.idea/.idea.ProxySU/.idea/encodings.xml new file mode 100644 index 0000000..df87cf9 --- /dev/null +++ b/.idea/.idea.ProxySU/.idea/encodings.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/.idea/.idea.ProxySU/.idea/indexLayout.xml b/.idea/.idea.ProxySU/.idea/indexLayout.xml new file mode 100644 index 0000000..27ba142 --- /dev/null +++ b/.idea/.idea.ProxySU/.idea/indexLayout.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/.idea.ProxySU/.idea/modules.xml b/.idea/.idea.ProxySU/.idea/modules.xml new file mode 100644 index 0000000..a7c012b --- /dev/null +++ b/.idea/.idea.ProxySU/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/.idea.ProxySU/.idea/projectSettingsUpdater.xml b/.idea/.idea.ProxySU/.idea/projectSettingsUpdater.xml new file mode 100644 index 0000000..4bb9f4d --- /dev/null +++ b/.idea/.idea.ProxySU/.idea/projectSettingsUpdater.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/.idea/.idea.ProxySU/.idea/vcs.xml b/.idea/.idea.ProxySU/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/.idea.ProxySU/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/.idea.ProxySU/.idea/workspace.xml b/.idea/.idea.ProxySU/.idea/workspace.xml new file mode 100644 index 0000000..cfb386b --- /dev/null +++ b/.idea/.idea.ProxySU/.idea/workspace.xml @@ -0,0 +1,121 @@ + + + + ProxySU/ProxySU.csproj + WpfApp1/WpfApp1.csproj + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1607572158648 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/.idea.ProxySU/riderModule.iml b/.idea/.idea.ProxySU/riderModule.iml new file mode 100644 index 0000000..1a4e0d9 --- /dev/null +++ b/.idea/.idea.ProxySU/riderModule.iml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/ProxySU.Core/App.xaml b/ProxySU.Core/App.xaml new file mode 100644 index 0000000..6f169ad --- /dev/null +++ b/ProxySU.Core/App.xaml @@ -0,0 +1,10 @@ + + + + + diff --git a/ProxySU.Core/App.xaml.cs b/ProxySU.Core/App.xaml.cs new file mode 100644 index 0000000..ba24f85 --- /dev/null +++ b/ProxySU.Core/App.xaml.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Configuration; +using System.Data; +using System.Linq; +using System.Threading.Tasks; +using System.Windows; + +namespace ProxySU.Core +{ + /// + /// Interaction logic for App.xaml + /// + public partial class App : Application + { + } +} diff --git a/ProxySU.Core/AssemblyInfo.cs b/ProxySU.Core/AssemblyInfo.cs new file mode 100644 index 0000000..8b5504e --- /dev/null +++ b/ProxySU.Core/AssemblyInfo.cs @@ -0,0 +1,10 @@ +using System.Windows; + +[assembly: ThemeInfo( + ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located + //(used if a resource is not found in the page, + // or application resource dictionaries) + ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located + //(used if a resource is not found in the page, + // app, or any theme specific resource dictionaries) +)] diff --git a/ProxySU.Core/MainWindow.xaml b/ProxySU.Core/MainWindow.xaml new file mode 100644 index 0000000..01c479c --- /dev/null +++ b/ProxySU.Core/MainWindow.xaml @@ -0,0 +1,28 @@ + + + + + 肖文杰 + + + + + + + + + diff --git a/ProxySU.Core/MainWindow.xaml.cs b/ProxySU.Core/MainWindow.xaml.cs new file mode 100644 index 0000000..920ed49 --- /dev/null +++ b/ProxySU.Core/MainWindow.xaml.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; + +namespace ProxySU.Core +{ + /// + /// Interaction logic for MainWindow.xaml + /// + public partial class MainWindow : Window + { + public MainWindow() + { + InitializeComponent(); + } + } +} diff --git a/ProxySU.Core/ProxySU.Core.csproj b/ProxySU.Core/ProxySU.Core.csproj new file mode 100644 index 0000000..1480162 --- /dev/null +++ b/ProxySU.Core/ProxySU.Core.csproj @@ -0,0 +1,13 @@ + + + + WinExe + netcoreapp3.1 + true + + + + + + + diff --git a/ProxySU/MainWindow.xaml b/ProxySU/MainWindow.xaml index 22d9895..9a26b7b 100644 --- a/ProxySU/MainWindow.xaml +++ b/ProxySU/MainWindow.xaml @@ -5,7 +5,7 @@ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:ProxySU" mc:Ignorable="d" - Title="ProxySU - v2.5.3 Beta1" Height="675" Width="660"> + Title="ProxySU - v2.5.6" Height="720" Width="660"> @@ -57,6 +57,7 @@ + @@ -147,23 +148,29 @@ - - + + + + + + + + - - + + - + diff --git a/ProxySU/MainWindow.xaml.cs b/ProxySU/MainWindow.xaml.cs index 52bd377..7350959 100644 --- a/ProxySU/MainWindow.xaml.cs +++ b/ProxySU/MainWindow.xaml.cs @@ -99,6 +99,7 @@ namespace ProxySU static int randomCaddyListenPort = 8800; //Caddy做伪装网站所监听的端口,随机10001-60000 static int installationDegree = 0; //安装进度条显示的百分比 static string saveShellScriptFileName = "install.sh"; //用来保存下载的脚本名称 + static string acmeEmail = ""; //****** ****** // Application.Current.FindResource("").ToString() @@ -564,8 +565,17 @@ namespace ProxySU //远程主机连接信息 private ConnectionInfo GenerateConnectionInfo() { + acmeEmail = AcmeEmailTextBox.Text; + ConnectionInfo connectionInfo; + if (string.IsNullOrEmpty(acmeEmail)) + { + var acmeEmailDesc = Application.Current.FindResource("AcmeEmailDesc").ToString(); + MessageBox.Show(acmeEmailDesc); + return connectionInfo = null; + } + #region 检测输入的内容是否有错,并读取内容 if (string.IsNullOrEmpty(PreTrim(TextBoxHost.Text)) == true || string.IsNullOrEmpty(PreTrim(TextBoxPort.Text)) == true || string.IsNullOrEmpty(PreTrim(TextBoxUserName.Text)) == true) { @@ -737,7 +747,7 @@ namespace ProxySU } - + #region V2Ray相关 //打开v2ray模板设置窗口 @@ -1240,7 +1250,7 @@ namespace ProxySU functionResult = SetCaddyfile(client, upLoadPath); if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - + #endregion //启动Caddy服务 @@ -1359,8 +1369,8 @@ namespace ProxySU if (functionResult == true) { - sshShellCommand = @"mv /usr/local/etc/v2ray/config.json /usr/local/etc/v2ray/config.json.1"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); + sshShellCommand = @"mv /usr/local/etc/v2ray/config.json /usr/local/etc/v2ray/config.json.1"; + currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); } //读取配置文件各个模块 string logConfigJson = $"{pwdir}" + @"TemplateConfg\v2ray\server\00_log\00_log.json"; @@ -2923,8 +2933,8 @@ namespace ProxySU if (functionResult == true) { - sshShellCommand = @"mv /usr/local/etc/xray/config.json /usr/local/etc/xray/config.json.1"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); + sshShellCommand = @"mv /usr/local/etc/xray/config.json /usr/local/etc/xray/config.json.1"; + currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); } //读取配置文件各个模块 string logConfigJson = $"{pwdir}" + @"TemplateConfg\xray\server\00_log\00_log.json"; @@ -5268,7 +5278,7 @@ namespace ProxySU if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } //安装代理程序 37--40 - functionResult = ProxySoftInstall(client,@"NaiveProxy", @"https://raw.githubusercontent.com/proxysu/shellscript/master/Caddy-Naive/caddy-naive-install.sh"); + functionResult = ProxySoftInstall(client, @"NaiveProxy", @"https://raw.githubusercontent.com/proxysu/shellscript/master/Caddy-Naive/caddy-naive-install.sh"); if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } ////****** "系统环境检测完毕,符合安装要求,开始布署......" ****** @@ -5562,7 +5572,7 @@ namespace ProxySU { ReceiveConfigurationParameters[i] = ""; } - + bool domainNotEmpty = ClassModel.TestDomainIsEmpty(TextBoxSSRHostDomain.Text); bool preDomainMask = ClassModel.PreDomainMask(TextBoxSSRSites.Text); if (domainNotEmpty == false || preDomainMask == false) @@ -6792,10 +6802,10 @@ namespace ProxySU private string GenerateRandomStr(int length) { var rand = System.Security.Cryptography.RandomNumberGenerator.Create(); - byte[] bytes = new byte[length*2]; + byte[] bytes = new byte[length * 2]; rand.GetBytes(bytes); string randStr = Convert.ToBase64String(bytes); - randStr = randStr.Replace("+", "").Replace("/", "").Replace("=", "").Substring(0,length); + randStr = randStr.Replace("+", "").Replace("/", "").Replace("=", "").Substring(0, length); //MessageBox.Show(randStr); return randStr; } @@ -6882,7 +6892,7 @@ namespace ProxySU FileStream createDownloadConfig = File.Open(localConfigSavePathAndFileName, FileMode.Create); sftpClient.DownloadFile(remoteConfigPathAndFileName, createDownloadConfig); createDownloadConfig.Close(); - + sftpClient.Disconnect(); } @@ -6898,24 +6908,24 @@ namespace ProxySU //伪装网站处理 //private string DisguiseURLprocessing(string fakeUrl) //{ - //var uri = new Uri(fakeUrl); - //return uri.Host; + //var uri = new Uri(fakeUrl); + //return uri.Host; - ////处理伪装网站域名中的前缀 - //if (fakeUrl.Length >= 7) - //{ - // string testDomainMask = fakeUrl.Substring(0, 7); - // if (String.Equals(testDomainMask, "https:/") || String.Equals(testDomainMask, "http://")) - // { - // //MessageBox.Show(testDomain); - // string[] tmpUrl = fakeUrl.Split('/'); - // //MainWindow.ReceiveConfigurationParameters[7] = TextBoxMaskSites.Text.Replace("/", "\\/"); - // fakeUrl = tmpUrl[2]; - // } + ////处理伪装网站域名中的前缀 + //if (fakeUrl.Length >= 7) + //{ + // string testDomainMask = fakeUrl.Substring(0, 7); + // if (String.Equals(testDomainMask, "https:/") || String.Equals(testDomainMask, "http://")) + // { + // //MessageBox.Show(testDomain); + // string[] tmpUrl = fakeUrl.Split('/'); + // //MainWindow.ReceiveConfigurationParameters[7] = TextBoxMaskSites.Text.Replace("/", "\\/"); + // fakeUrl = tmpUrl[2]; + // } - //} - //return fakeUrl; - // } + //} + //return fakeUrl; + // } #region 检测系统内核是否符合安装要求 //private static bool DetectKernelVersion(string kernelVer) @@ -7057,7 +7067,7 @@ namespace ProxySU thread.SetApartmentState(ApartmentState.STA); thread.Start(); } - + //启用BBR的主要进程 private void StartTestAndEnableBBR(ConnectionInfo connectionInfo) { @@ -7155,7 +7165,7 @@ namespace ProxySU //****** "BBR已经启用了!" ****** currentStatus = Application.Current.FindResource("DisplayInstallInfo_BBRisEnabled").ToString(); MainWindowsShowInfo(currentStatus); - + } else { @@ -7165,7 +7175,7 @@ namespace ProxySU } client.Disconnect();//断开服务器ssh连接 - + return; } } @@ -7181,7 +7191,7 @@ namespace ProxySU #endregion } - + //检测要启用BBR主要的内核版本 private static bool DetectKernelVersionBBR(string kernelVer) { @@ -7233,7 +7243,7 @@ namespace ProxySU thread.SetApartmentState(ApartmentState.STA); thread.Start(); } - + } //卸载代理进程 private void StartRemoveProxySoft(ConnectionInfo connectionInfo) @@ -7338,18 +7348,18 @@ namespace ProxySU //如果未检测到有效的ip,连接就会被断开 if (client.IsConnected == false) { - return ; + return; } if (onlyIpv6 == true) { functionResult = SetUpNat64(client, true); - if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return ; } + if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } //SetUpNat64(client, true); //sshShellCommand = $"{sshCmdUpdate}"; //currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); } - + //******"开始卸载......"****** SetUpProgressBarProcessing(10); currentStatus = Application.Current.FindResource("DisplayInstallInfo_StartRemoveProxy").ToString() + "......"; @@ -7409,7 +7419,7 @@ namespace ProxySU functionResult = FileCheckExists(client, @"/usr/local/bin/v2ray"); if (functionResult == true) - //if (currentShellCommandResult.Contains("/usr/local/bin/v2ray") == true) + //if (currentShellCommandResult.Contains("/usr/local/bin/v2ray") == true) { //******"V2Ray卸载失败!请向开发者问询!"****** currentStatus = "V2Ray" + Application.Current.FindResource("DisplayInstallInfo_RemoveProxySoftFailed").ToString(); @@ -7419,7 +7429,7 @@ namespace ProxySU { //******"V2Ray卸载成功!"****** SetUpProgressBarProcessing(16); - currentStatus ="V2Ray" + Application.Current.FindResource("DisplayInstallInfo_RemoveProxySoftSuccess").ToString(); + currentStatus = "V2Ray" + Application.Current.FindResource("DisplayInstallInfo_RemoveProxySoftSuccess").ToString(); MainWindowsShowInfo(currentStatus); } @@ -7453,7 +7463,7 @@ namespace ProxySU currentStatus = Application.Current.FindResource("DisplayInstallInfo_DiscoverProxySoft").ToString() + "Trojan-go!" + Application.Current.FindResource("DisplayInstallInfo_StartRemoveProxy").ToString() - + "Trojan-go......"; + + "Trojan-go......"; MainWindowsShowInfo(currentStatus); sshShellCommand = @"systemctl stop trojan-go"; @@ -7909,15 +7919,15 @@ namespace ProxySU sshShellCommand = @"command -v apt-get"; currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - bool getApt = ! String.IsNullOrEmpty(currentShellCommandResult); + bool getApt = !String.IsNullOrEmpty(currentShellCommandResult); sshShellCommand = @"command -v dnf"; currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - bool getDnf = ! String.IsNullOrEmpty(currentShellCommandResult); + bool getDnf = !String.IsNullOrEmpty(currentShellCommandResult); sshShellCommand = @"command -v yum"; currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - bool getYum = ! String.IsNullOrEmpty(currentShellCommandResult); + bool getYum = !String.IsNullOrEmpty(currentShellCommandResult); SetUpProgressBarProcessing(55); @@ -7925,7 +7935,7 @@ namespace ProxySU currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); bool getZypper = String.IsNullOrEmpty(currentShellCommandResult); - + string sshCmdRemove = ""; //string sshCmdRemove2; //设置安装软件所用的命令格式 @@ -8135,7 +8145,7 @@ namespace ProxySU //currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); } - + //******"卸载成功!"******04 SetUpProgressBarProcessing(100); currentStatus = Application.Current.FindResource("DisplayInstallInfo_RemoveProxySoftSuccess").ToString(); @@ -8903,7 +8913,7 @@ namespace ProxySU } } - + #region 免翻网址资源标签 private void ButtonWebBrowserHomePageFreeWallURL_Click(object sender, RoutedEventArgs e) @@ -8984,7 +8994,7 @@ namespace ProxySU #endregion #endregion - + #region 测试用代码 private void Button_Click(object sender, RoutedEventArgs e) { @@ -9079,7 +9089,7 @@ namespace ProxySU SetUpProgressBarProcessing(3); currentStatus = Application.Current.FindResource("DisplayInstallInfo_LoginSuccessful").ToString(); MainWindowsShowInfo(currentStatus); - + sshShellCommand = @"id -u"; currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); @@ -9138,16 +9148,16 @@ namespace ProxySU } //设置Nat64与删除设置Nat64 - private bool SetUpNat64(SshClient client,bool set) + private bool SetUpNat64(SshClient client, bool set) { - if(set == true) + if (set == true) { //****** "正在查找最快的Nat64网关......" ****** currentStatus = Application.Current.FindResource("DisplayInstallInfo_FindFastestSetUpNat64").ToString(); MainWindowsShowInfo(currentStatus); //string[] dns64 = new string[2]; var dns64 = FilterFastestIP(client); - + if (functionResult == false) { //****** "未能找到有效的Nat64网关......" ****** @@ -9158,7 +9168,7 @@ namespace ProxySU client.Disconnect(); return false; } - + //****** "正在设置Nat64网关......" ****** currentStatus = Application.Current.FindResource("DisplayInstallInfo_SetUpNat64").ToString(); MainWindowsShowInfo(currentStatus); @@ -9169,7 +9179,7 @@ namespace ProxySU sshShellCommand = @"mv /etc/resolv.conf /etc/resolv.conf.proxysu"; currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); } - + foreach (string gateip in dns64) { @@ -9198,7 +9208,7 @@ namespace ProxySU sshShellCommand = @"mv /etc/resolv.conf.proxysu /etc/resolv.conf"; currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); } - + return true; } @@ -9251,7 +9261,7 @@ namespace ProxySU functionResult = true; } string[] returnstr = new string[listCount]; - for(int i=0;i{60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} 4 true + false publish\ true Disk @@ -23,10 +24,10 @@ false false true - 0 + 1 1.0.0.%2a - false false + true true @@ -51,6 +52,18 @@ ProxySU.ico + + 01AFC64B121E781F77B42A6E9F1B587DDBAD475A + + + ProxySU_TemporaryKey.pfx + + + true + + + true + ..\json.net\net40\Newtonsoft.Json.dll @@ -186,17 +199,11 @@ - del "$(TargetDir)*.xml" -del "$(TargetDir)*.pdb" -del "$(TargetDir)*.zip" -mkdir "$(TargetDir)TemplateConfg" -xcopy /Y /E /R "$(TargetDir)..\..\..\TemplateConfg\*.*" "$(TargetDir)TemplateConfg\" -"$(TargetDir)..\..\..\7z\7z.exe" a $(TargetDir)Release.zip $(TargetDir) -xr!*config -rmdir /S /Q "$(TargetDir)..\Beta" -mkdir "$(TargetDir)..\Beta" -copy /Y "$(TargetDir)Release.zip" "$(TargetDir)..\Beta\Beta.zip" + + - rmdir /S /Q "$(TargetDir) + + \ No newline at end of file diff --git a/ProxySU/ProxySU.csproj.user b/ProxySU/ProxySU.csproj.user index 2c7a9c0..0871ddf 100644 --- a/ProxySU/ProxySU.csproj.user +++ b/ProxySU/ProxySU.csproj.user @@ -9,5 +9,9 @@ zh-CN false + ProjectFiles + + + false \ No newline at end of file diff --git a/ProxySU/Translations/ProxySU.en-US.xaml b/ProxySU/Translations/ProxySU.en-US.xaml index 4007373..a7ff3f0 100644 --- a/ProxySU/Translations/ProxySU.en-US.xaml +++ b/ProxySU/Translations/ProxySU.en-US.xaml @@ -27,6 +27,8 @@ Not Login Requires Login Proxy Addr: + Email + Acme.sh SSL must an available email address. Save Installation Log... Waiting for installation and deployment System Tools diff --git a/ProxySU/Translations/ProxySU.zh-CN.xaml b/ProxySU/Translations/ProxySU.zh-CN.xaml index 825341a..1db4354 100644 --- a/ProxySU/Translations/ProxySU.zh-CN.xaml +++ b/ProxySU/Translations/ProxySU.zh-CN.xaml @@ -27,6 +27,8 @@ 不需登录 需要登录 代理地址: + Email + 申请SSL证书需要一个可用的Email地址 安装日志另存为... 等待安装布署 系统工具 diff --git a/ProxySU/Translations/ProxySU.zh-TW.xaml b/ProxySU/Translations/ProxySU.zh-TW.xaml index d6c233e..3b98e2e 100644 --- a/ProxySU/Translations/ProxySU.zh-TW.xaml +++ b/ProxySU/Translations/ProxySU.zh-TW.xaml @@ -27,6 +27,8 @@ 不需登錄 需要登錄 代理地址: + Email + 申請SSL證書需要一個可用的Email地址 安裝日誌另存為... 等待安裝佈署 系統工具 diff --git a/ProxySU/packages.config b/ProxySU/packages.config new file mode 100644 index 0000000..6161026 --- /dev/null +++ b/ProxySU/packages.config @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/README.md b/README.md index 546a7fd..822187a 100644 --- a/README.md +++ b/README.md @@ -267,7 +267,7 @@ Microsoft [.NET Framework 4.0](https://dotnet.microsoft.com/download/dotnet-fram 在使用遇到问题时,请先看一下[常见问题集锦](https://github.com/proxysu/windows/wiki/CommonError),如果还不能解决,可以到以上平台询问,个人精力有限,尽力解答。 ## v1.0.0发布小记 - 足足用了近两个月的业余时间,终于做成一个功能还算完善的版本。虽是一个简单的小工具,没想到对于我这个初学C#的人,还是有点小吃力,如果不是因为武汉肺炎疫情,被禁足在家,还真没时间。学习C#,为啥编写这样一个小工具软件来练手?现在一键安装脚本多的是,这样的工具还有必要吗?咋说呢?我也不知道有多少人会喜欢这个小工具,只是觉得自己用着方便,也想方便一下别人吧,喜欢用就用,不喜欢,也随意。 + 足足用了近两个月的业余时间,终于做成一个功能还算完善的版本。虽是一个简单的小工具,没想到对于我这个初学C#的人,还是有点小吃力,如果不是因为新冠肺炎疫情,被禁足在家,还真没时间。学习C#,为啥编写这样一个小工具软件来练手?现在一键安装脚本多的是,这样的工具还有必要吗?咋说呢?我也不知道有多少人会喜欢这个小工具,只是觉得自己用着方便,也想方便一下别人吧,喜欢用就用,不喜欢,也随意。 生意又忙起来了,对于我这个业余的编程爱好者,可能没有多少业余时间继续折腾了,尽力吧。 (记于2020.4.18) ## V2.0.0发布小记