一些修改

1. 需要重启的设置保存会自动重启
2. 去重逻辑更新 address port path
3. 一些重构和小修改
pull/40/head
CGQAQ 2019-08-26 16:21:08 +08:00
parent 26c9cd4d27
commit c1354600c7
9 changed files with 153 additions and 101 deletions

View File

@ -44,6 +44,7 @@ namespace v2rayN.Forms
Application.ApplicationExit += (sender, args) => Application.ApplicationExit += (sender, args) =>
{ {
Utils.ClearTempPath(); Utils.ClearTempPath();
statistics.Close();
}; };
} }
@ -52,14 +53,16 @@ namespace v2rayN.Forms
ConfigHandler.LoadConfig(ref config); ConfigHandler.LoadConfig(ref config);
v2rayHandler = new V2rayHandler(); v2rayHandler = new V2rayHandler();
v2rayHandler.ProcessEvent += v2rayHandler_ProcessEvent; v2rayHandler.ProcessEvent += v2rayHandler_ProcessEvent;
statistics = new StatisticsHandler(config, statistics = new StatisticsHandler(config, UpdateHandler);
(ulong totalUp, ulong totalDown, ulong up, ulong down, List<Mode.ServerStatistics> statistics) => }
private void UpdateHandler(ulong totalUp, ulong totalDown, ulong up, ulong down, List<Mode.ServerStatistics> statistics)
{ {
double up_amount = 0.0, down_amount; double up_amount = 0.0, down_amount;
string up_unit = "", down_unit; string up_unit = "", down_unit;
up /= (ulong)(config.statisticsFreshRate / 1000f); up /= (ulong) (config.statisticsFreshRate / 1000f);
down /= (ulong)(config.statisticsFreshRate / 1000f); down /= (ulong) (config.statisticsFreshRate / 1000f);
Utils.ToHumanReadable(up, out up_amount, out up_unit); Utils.ToHumanReadable(up, out up_amount, out up_unit);
Utils.ToHumanReadable(down, out down_amount, out down_unit); Utils.ToHumanReadable(down, out down_amount, out down_unit);
@ -76,15 +79,14 @@ namespace v2rayN.Forms
UIRes.I18N("downloadSpeed") UIRes.I18N("downloadSpeed")
); );
List<string[]> datas = new List<string[]>(); List<string[]> datas = new List<string[]>();
for (int i= 0; i < config.vmess.Count; i++) for (int i = 0; i < config.vmess.Count; i++)
{ {
string totalUp_ = string.Empty, string totalUp_ = string.Empty,
totalDown_ = string.Empty, totalDown_ = string.Empty,
todayUp_ = string.Empty, todayUp_ = string.Empty,
todayDown_ = string.Empty; todayDown_ = string.Empty;
var index = statistics.FindIndex(item_ => (config.vmess[i].address == item_.address && config.vmess[i].port == item_.port)); var index = statistics.FindIndex(item_ => (config.vmess[i].address == item_.address && config.vmess[i].port == item_.port && config.vmess[i].path == item_.path));
if (index != -1) if (index != -1)
{ {
Func<ulong, string> human_fy = (amount) => Func<ulong, string> human_fy = (amount) =>
@ -100,13 +102,13 @@ namespace v2rayN.Forms
todayDown_ = human_fy(statistics[index].todayDown); todayDown_ = human_fy(statistics[index].todayDown);
} }
datas.Add(new string[] { totalUp_, totalDown_, todayUp_, todayDown_ }); datas.Add(new string[] { totalUp_, totalDown_, todayUp_, todayDown_});
} }
lvServers.Invoke((MethodInvoker)delegate lvServers.Invoke((MethodInvoker)delegate
{ {
lvServers.SuspendLayout(); lvServers.SuspendLayout();
for (int i =0; i< datas.Count; i++) for (int i =0; i<datas.Count; i++)
{ {
lvServers.Items[i].SubItems[7].Text = datas[i][0]; lvServers.Items[i].SubItems[7].Text = datas[i][0];
lvServers.Items[i].SubItems[8].Text = datas[i][1]; lvServers.Items[i].SubItems[8].Text = datas[i][1];
@ -115,7 +117,6 @@ namespace v2rayN.Forms
} }
lvServers.ResumeLayout(); lvServers.ResumeLayout();
}); });
});
} }
private void MainForm_VisibleChanged(object sender, EventArgs e) private void MainForm_VisibleChanged(object sender, EventArgs e)
@ -155,7 +156,9 @@ namespace v2rayN.Forms
} }
if(e.CloseReason == CloseReason.ApplicationExitCall) if(e.CloseReason == CloseReason.ApplicationExitCall)
{ {
ConfigHandler.SaveConfig(ref config);
statistics.saveToFile(); statistics.saveToFile();
statistics.Close();
} }
} }
@ -519,6 +522,14 @@ namespace v2rayN.Forms
break; break;
case Keys.T: case Keys.T:
// Speed test selected servers // Speed test selected servers
if (!config.sysAgentEnabled || config.listenerType != 1)
{
UI.Show(UIRes.I18N("NeedHttpGlobalProxy"));
return;
}
UI.Show(UIRes.I18N("SpeedServerTips"));
GetLvSelectedIndex(); GetLvSelectedIndex();
ServerSpeedTest(); ServerSpeedTest();
break; break;

View File

@ -125,9 +125,9 @@
<data name="splitContainer1.Location" type="System.Drawing.Point, System.Drawing"> <data name="splitContainer1.Location" type="System.Drawing.Point, System.Drawing">
<value>3, 17</value> <value>3, 17</value>
</data> </data>
<metadata name="cmsLv.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> <data name="cmsLv.TrayLocation" type="System.Drawing.Point, System.Drawing">
<value>327, 17</value> <value>327, 17</value>
</metadata> </data>
<data name="menuAddVmessServer.Size" type="System.Drawing.Size, System.Drawing"> <data name="menuAddVmessServer.Size" type="System.Drawing.Size, System.Drawing">
<value>447, 22</value> <value>447, 22</value>
</data> </data>
@ -401,12 +401,12 @@
<data name="&gt;&gt;splitContainer1.ZOrder" xml:space="preserve"> <data name="&gt;&gt;splitContainer1.ZOrder" xml:space="preserve">
<value>0</value> <value>0</value>
</data> </data>
<metadata name="notifyMain.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> <data name="notifyMain.TrayLocation" type="System.Drawing.Point, System.Drawing">
<value>17, 17</value> <value>17, 17</value>
</metadata> </data>
<metadata name="cmsMain.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> <data name="cmsMain.TrayLocation" type="System.Drawing.Point, System.Drawing">
<value>137, 17</value> <value>137, 17</value>
</metadata> </data>
<data name="cmsMain.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms"> <data name="cmsMain.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value> <value>NoControl</value>
</data> </data>
@ -494,12 +494,12 @@
<data name="notifyMain.Visible" type="System.Boolean, mscorlib"> <data name="notifyMain.Visible" type="System.Boolean, mscorlib">
<value>True</value> <value>True</value>
</data> </data>
<metadata name="bgwPing.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> <data name="bgwPing.TrayLocation" type="System.Drawing.Point, System.Drawing">
<value>232, 17</value> <value>232, 17</value>
</metadata> </data>
<metadata name="bgwScan.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> <data name="bgwScan.TrayLocation" type="System.Drawing.Point, System.Drawing">
<value>498, 17</value> <value>498, 17</value>
</metadata> </data>
<data name="groupBox1.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms"> <data name="groupBox1.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
<value>Fill</value> <value>Fill</value>
</data> </data>
@ -560,9 +560,9 @@
<data name="&gt;&gt;txtMsgBox.ZOrder" xml:space="preserve"> <data name="&gt;&gt;txtMsgBox.ZOrder" xml:space="preserve">
<value>0</value> <value>0</value>
</data> </data>
<metadata name="ssMain.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> <data name="ssMain.TrayLocation" type="System.Drawing.Point, System.Drawing">
<value>603, 17</value> <value>603, 17</value>
</metadata> </data>
<data name="toolSslSocksPortLab.Size" type="System.Drawing.Size, System.Drawing"> <data name="toolSslSocksPortLab.Size" type="System.Drawing.Size, System.Drawing">
<value>55, 17</value> <value>55, 17</value>
</data> </data>
@ -609,7 +609,7 @@
<value>31, 17</value> <value>31, 17</value>
</data> </data>
<data name="toolSslBlank4.Text" xml:space="preserve"> <data name="toolSslBlank4.Text" xml:space="preserve">
<value>N/A</value> <value>Disabled</value>
</data> </data>
<data name="ssMain.Location" type="System.Drawing.Point, System.Drawing"> <data name="ssMain.Location" type="System.Drawing.Point, System.Drawing">
<value>3, 151</value> <value>3, 151</value>
@ -686,9 +686,9 @@
<data name="&gt;&gt;panel1.ZOrder" xml:space="preserve"> <data name="&gt;&gt;panel1.ZOrder" xml:space="preserve">
<value>4</value> <value>4</value>
</data> </data>
<metadata name="tsMain.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> <data name="tsMain.TrayLocation" type="System.Drawing.Point, System.Drawing">
<value>409, 17</value> <value>409, 17</value>
</metadata> </data>
<data name="toolStripSeparator4.Size" type="System.Drawing.Size, System.Drawing"> <data name="toolStripSeparator4.Size" type="System.Drawing.Size, System.Drawing">
<value>6, 56</value> <value>6, 56</value>
</data> </data>
@ -736,13 +736,13 @@
</data> </data>
<data name="tsbReload.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> <data name="tsbReload.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value> <value>
iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAE3SURBVFhH7ZaBDQIhDEVvBEdwBDfQDXQER3AD3cARdAPd wwAADsMBx2+oZAAAATdJREFUWEftloENAiEMRW8ER3AEN9ANdARHcAPdwBF0A91AN9INtC+5JvUCJwWM
QDfSDbQvuSb1AicFjJrwkxcN0FIolOuamv5VE2E+gLaPayWchEcE+hhTXVPhIoQmDcFYbKpoJtwEdX4X mvCTFw3QUiiU65qa/lUTYT6Ato9rJZyERwT6GFNdU+EihCYNwVhsqmgm3AR1fheOAitd9PCfNvp0HDbY
jgIrXfTwnzb6dBw22BaJVdjJmWQs1/SdBRtE0U5cBXW2oSFRO0HtSEeW2FZ1wsq9sjuRdTDVAXnNuWLY FolV2MmZZCzX9J0FG0TRTlwFdbahIVE7Qe1IR5bYVnXCyr2yO5F1MNUBec25YtjomcCXSxhr9DmrV2Gr
6JnAl0sYa/Q5q1dhq35ci+Bkq2HJvbZpxGeybAAuw4Fq+cnW1wPITgHFYxvBUw+qHEIL1yq1vDKhVlH3 flyL4GSrYcm9tmnEZ7JsAC7DgWr5ydbXA8hOAcVjG8FTD6ocQgvXKrW8MqFWUfc1DAXgmRwVFaJQAHsh
NQwF4JkcFRWiUAB7IVW2FFPO3YqlgPd+LJf02e8Fdi3rMdIAcLDuf9UpeT0IS0G/hvhPm305vSl7EQFY VbYUU87diqWA934sl/TZ7wV2Lesx0gBwsO5/1Sl5PQhLQb+G+E+bfTm9KXsRAVgHrMK+jO9gbNEzzMSh
B6zCvozvYGzRM8zEoeg5TPZwDaGvpHQni1yzSxbXPW9q+hF13ROHuJnQcjbhtQAAAABJRU5ErkJggg== 6DlM9nANoa+kdCeLXLNLFtc9b2r6EXXdE4e4mdByNuG1AAAAAElFTkSuQmCC
</value> </value>
</data> </data>
<data name="tsbReload.ImageAlign" type="System.Drawing.ContentAlignment, System.Drawing"> <data name="tsbReload.ImageAlign" type="System.Drawing.ContentAlignment, System.Drawing">
@ -852,9 +852,9 @@
</data> </data>
<data name="tsbClose.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> <data name="tsbClose.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value> <value>
iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAySURBVFhH7c6xDQAgCEVBRnVTHU2ZABuMxV3yOvJDAAA/ wwAADsMBx2+oZAAAADJJREFUWEftzrENACAIRUFGdVMdTZkAG4zFXfI68kMAAD8ap9lUbpfyaDV19QAA
GqfZVG6X8mg1dfUAAPBQxAZd0SJruVXHWwAAAABJRU5ErkJggg== 8FDEBl3RImu5VcdbAAAAAElFTkSuQmCC
</value> </value>
</data> </data>
<data name="tsbClose.ImageTransparentColor" type="System.Drawing.Color, System.Drawing"> <data name="tsbClose.ImageTransparentColor" type="System.Drawing.Color, System.Drawing">
@ -890,12 +890,12 @@
<data name="&gt;&gt;tsMain.ZOrder" xml:space="preserve"> <data name="&gt;&gt;tsMain.ZOrder" xml:space="preserve">
<value>5</value> <value>5</value>
</data> </data>
<metadata name="$this.Localizable" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> <data name="$this.Localizable" type="System.Boolean, mscorlib">
<value>True</value> <value>True</value>
</metadata> </data>
<metadata name="$this.TrayHeight" type="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> <data name="$this.TrayHeight" type="System.Int32, mscorlib">
<value>65</value> <value>65</value>
</metadata> </data>
<data name="$this.AutoScaleDimensions" type="System.Drawing.SizeF, System.Drawing"> <data name="$this.AutoScaleDimensions" type="System.Drawing.SizeF, System.Drawing">
<value>6, 12</value> <value>6, 12</value>
</data> </data>

View File

@ -456,4 +456,7 @@
<data name="menuRemoveDuplicateServer.Text" xml:space="preserve"> <data name="menuRemoveDuplicateServer.Text" xml:space="preserve">
<value>移除重复的服务器</value> <value>移除重复的服务器</value>
</data> </data>
<data name="toolSslBlank4.Text" xml:space="preserve">
<value>未启用</value>
</data>
</root> </root>

View File

@ -1,5 +1,6 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics;
using System.Drawing; using System.Drawing;
using System.Drawing.Text; using System.Drawing.Text;
using System.Windows.Forms; using System.Windows.Forms;
@ -326,6 +327,7 @@ namespace v2rayN.Forms
config.allowLANConn = chkAllowLANConn.Checked; config.allowLANConn = chkAllowLANConn.Checked;
var lastEnableStatistics = config.enableStatistics;
config.enableStatistics = chkEnableStatistics.Checked; config.enableStatistics = chkEnableStatistics.Checked;
uint days = 0; uint days = 0;
@ -336,6 +338,15 @@ namespace v2rayN.Forms
config.statisticsFreshRate = (int)cbFreshrate.SelectedValue; config.statisticsFreshRate = (int)cbFreshrate.SelectedValue;
if(lastEnableStatistics != config.enableStatistics)
{
/// https://stackoverflow.com/questions/779405/how-do-i-restart-my-c-sharp-winform-application
// Shut down the current app instance.
Application.Exit();
// Restart the app passing "/restart [processId]" as cmd line args
Process.Start(Application.ExecutablePath, "/restart " + Process.GetCurrentProcess().Id);
}
return 0; return 0;
} }

View File

@ -62,7 +62,7 @@ namespace v2rayN.Handler
DeleteExpiredLog(); DeleteExpiredLog();
foreach (var server in config.vmess) foreach (var server in config.vmess)
{ {
var statistic = new ServerStatistics(server.remarks, server.address, server.port, 0, 0, 0, 0); var statistic = new ServerStatistics(server.remarks, server.address, server.port, server.path, 0, 0, 0, 0);
Statistic.Add(statistic); Statistic.Add(statistic);
} }
@ -211,7 +211,7 @@ namespace v2rayN.Handler
overallWriter.WriteLine($"DOWN {string.Format("{0:f2}", down_amount)}{down_unit} {TotalDown}"); overallWriter.WriteLine($"DOWN {string.Format("{0:f2}", down_amount)}{down_unit} {TotalDown}");
foreach(var s in Statistic) foreach(var s in Statistic)
{ {
overallWriter.WriteLine($"* {s.name} {s.address} {s.port} {s.totalUp} {s.totalDown}"); overallWriter.WriteLine($"* {s.name} {s.address} {s.port} {s.path} {s.totalUp} {s.totalDown}");
} }
} }
} }
@ -230,7 +230,7 @@ namespace v2rayN.Handler
dailyWriter.WriteLine($"LastUpdate {DateTime.Now.ToLongDateString()} {DateTime.Now.ToLongTimeString()}"); dailyWriter.WriteLine($"LastUpdate {DateTime.Now.ToLongDateString()} {DateTime.Now.ToLongTimeString()}");
foreach (var s in Statistic) foreach (var s in Statistic)
{ {
dailyWriter.WriteLine($"* {s.name} {s.address} {s.port} {s.todayUp} {s.todayDown}"); dailyWriter.WriteLine($"* {s.name} {s.address} {s.port} {s.path} {s.todayUp} {s.todayDown}");
} }
} }
} }
@ -282,8 +282,9 @@ namespace v2rayN.Handler
var name = datas[1]; var name = datas[1];
var address = datas[2]; var address = datas[2];
var port = int.Parse(datas[3]); var port = int.Parse(datas[3]);
var totalUp = ulong.Parse(datas[4]); var path = datas[4];
var totalDown = ulong.Parse(datas[5]); var totalUp = ulong.Parse(datas[5]);
var totalDown = ulong.Parse(datas[6]);
var index = Statistic.FindIndex(item => item.address == address && item.port == port); var index = Statistic.FindIndex(item => item.address == address && item.port == port);
if (index != -1) if (index != -1)
@ -293,7 +294,7 @@ namespace v2rayN.Handler
} }
else else
{ {
var s = new Mode.ServerStatistics(name, address, port, totalUp, totalDown, 0, 0); var s = new Mode.ServerStatistics(name, address, port, path, totalUp, totalDown, 0, 0);
Statistic.Add(s); Statistic.Add(s);
} }
} }
@ -325,8 +326,9 @@ namespace v2rayN.Handler
var name = datas[1]; var name = datas[1];
var address = datas[2]; var address = datas[2];
var port = int.Parse(datas[3]); var port = int.Parse(datas[3]);
var todayUp = ulong.Parse(datas[4]); var path = datas[4];
var todayDown = ulong.Parse(datas[5]); var todayUp = ulong.Parse(datas[5]);
var todayDown = ulong.Parse(datas[6]);
var index = Statistic.FindIndex(item => item.address == address && item.port == port); var index = Statistic.FindIndex(item => item.address == address && item.port == port);
if (index != -1) if (index != -1)
@ -336,7 +338,7 @@ namespace v2rayN.Handler
} }
else else
{ {
var s = new Mode.ServerStatistics(name, address, port, 0, 0, todayUp, todayDown); var s = new Mode.ServerStatistics(name, address, port, path, 0, 0, todayUp, todayDown);
Statistic.Add(s); Statistic.Add(s);
} }
} }

View File

@ -11,17 +11,19 @@ namespace v2rayN.Mode
public string name; public string name;
public string address; public string address;
public int port; public int port;
public string path;
public ulong totalUp; public ulong totalUp;
public ulong totalDown; public ulong totalDown;
public ulong todayUp; public ulong todayUp;
public ulong todayDown; public ulong todayDown;
public ServerStatistics() { } public ServerStatistics() { }
public ServerStatistics(string name, string addr, int port, ulong totalUp, ulong totalDown, ulong todayUp, ulong todayDown) public ServerStatistics(string name, string addr, int port, string path, ulong totalUp, ulong totalDown, ulong todayUp, ulong todayDown)
{ {
this.name = name; this.name = name;
this.address = addr; this.address = addr;
this.port = port; this.port = port;
this.path = path;
this.totalUp = totalUp; this.totalUp = totalUp;
this.totalDown = totalDown; this.totalDown = totalDown;
this.todayUp = todayUp; this.todayUp = todayUp;

View File

@ -28,6 +28,25 @@ namespace v2rayN
AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve; AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;
var args = Environment.GetCommandLineArgs();
bool _isRestart = args.Length > 1 && args[1] == "/restart";
if (_isRestart)
{
try
{
// get old process and wait UP TO 5 secs then give up!
int _restartProcessId = int.Parse(args[2]);
Process oldProcess = Process.GetProcessById(_restartProcessId);
oldProcess.WaitForExit();
}
catch
{
// the process did not exist - probably already closed!
//TODO: --> LOG
}
}
Process instance = RunningInstance(); Process instance = RunningInstance();
if (instance == null) if (instance == null)
{ {
@ -43,7 +62,7 @@ namespace v2rayN
} }
else else
{ {
UI.Show("v2rayN is already running(v2rayN已经运行)"); UI.Show($"v2rayN is already running(v2rayN已经运行){args[1]} {args[2]}");
} }
} }

View File

@ -316,7 +316,7 @@ namespace v2rayN
var list = new List<Mode.VmessItem>(); var list = new List<Mode.VmessItem>();
foreach (var item in source) foreach (var item in source)
{ {
if(!list.Exists(i => item.address == i.address && item.port == i.port)) if(!list.Exists(i => item.address == i.address && item.port == i.port && item.path == i.path))
{ {
list.Add(item); list.Add(item);
} }

View File

@ -14,4 +14,8 @@
<PropertyGroup> <PropertyGroup>
<EnableSecurityDebugging>false</EnableSecurityDebugging> <EnableSecurityDebugging>false</EnableSecurityDebugging>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|AnyCPU'">
<StartAction>Project</StartAction>
<StartArguments>/restart 1001</StartArguments>
</PropertyGroup>
</Project> </Project>