init
This commit is contained in:
commit
28af5dc64c
Binary file not shown.
|
@ -0,0 +1,22 @@
|
|||
|
||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
# Visual Studio 2013
|
||||
VisualStudioVersion = 12.0.21005.1
|
||||
MinimumVisualStudioVersion = 10.0.40219.1
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Ultron.Ngrok", "Ultron.Ngrok\Ultron.Ngrok.csproj", "{D44A2DC3-FADD-47E7-A311-35C4B3404DFF}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Any CPU = Debug|Any CPU
|
||||
Release|Any CPU = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{D44A2DC3-FADD-47E7-A311-35C4B3404DFF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{D44A2DC3-FADD-47E7-A311-35C4B3404DFF}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{D44A2DC3-FADD-47E7-A311-35C4B3404DFF}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{D44A2DC3-FADD-47E7-A311-35C4B3404DFF}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
EndGlobalSection
|
||||
EndGlobal
|
Binary file not shown.
|
@ -0,0 +1,6 @@
|
|||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<configuration>
|
||||
<startup>
|
||||
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
|
||||
</startup>
|
||||
</configuration>
|
|
@ -0,0 +1,172 @@
|
|||
namespace Ultron.Ngrok
|
||||
{
|
||||
partial class AboutBox
|
||||
{
|
||||
/// <summary>
|
||||
/// 必需的设计器变量。
|
||||
/// </summary>
|
||||
private System.ComponentModel.IContainer components = null;
|
||||
|
||||
/// <summary>
|
||||
/// 清理所有正在使用的资源。
|
||||
/// </summary>
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
if (disposing && (components != null))
|
||||
{
|
||||
components.Dispose();
|
||||
}
|
||||
base.Dispose(disposing);
|
||||
}
|
||||
|
||||
#region Windows 窗体设计器生成的代码
|
||||
|
||||
/// <summary>
|
||||
/// 设计器支持所需的方法 - 不要
|
||||
/// 使用代码编辑器修改此方法的内容。
|
||||
/// </summary>
|
||||
private void InitializeComponent()
|
||||
{
|
||||
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(AboutBox));
|
||||
this.tableLayoutPanel = new System.Windows.Forms.TableLayoutPanel();
|
||||
this.logoPictureBox = new System.Windows.Forms.PictureBox();
|
||||
this.labelProductName = new System.Windows.Forms.Label();
|
||||
this.labelVersion = new System.Windows.Forms.Label();
|
||||
this.labelCopyright = new System.Windows.Forms.Label();
|
||||
this.textBoxDescription = new System.Windows.Forms.TextBox();
|
||||
this.okButton = new System.Windows.Forms.Button();
|
||||
this.tableLayoutPanel.SuspendLayout();
|
||||
((System.ComponentModel.ISupportInitialize)(this.logoPictureBox)).BeginInit();
|
||||
this.SuspendLayout();
|
||||
//
|
||||
// tableLayoutPanel
|
||||
//
|
||||
this.tableLayoutPanel.ColumnCount = 2;
|
||||
this.tableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 33F));
|
||||
this.tableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 67F));
|
||||
this.tableLayoutPanel.Controls.Add(this.logoPictureBox, 0, 0);
|
||||
this.tableLayoutPanel.Controls.Add(this.labelProductName, 1, 0);
|
||||
this.tableLayoutPanel.Controls.Add(this.labelVersion, 1, 1);
|
||||
this.tableLayoutPanel.Controls.Add(this.labelCopyright, 1, 2);
|
||||
this.tableLayoutPanel.Controls.Add(this.textBoxDescription, 1, 4);
|
||||
this.tableLayoutPanel.Controls.Add(this.okButton, 1, 5);
|
||||
this.tableLayoutPanel.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||
this.tableLayoutPanel.Location = new System.Drawing.Point(9, 8);
|
||||
this.tableLayoutPanel.Name = "tableLayoutPanel";
|
||||
this.tableLayoutPanel.RowCount = 6;
|
||||
this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 14.89362F));
|
||||
this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 16.31206F));
|
||||
this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 14.89362F));
|
||||
this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 6.382979F));
|
||||
this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 26.24113F));
|
||||
this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 24.11348F));
|
||||
this.tableLayoutPanel.Size = new System.Drawing.Size(417, 141);
|
||||
this.tableLayoutPanel.TabIndex = 0;
|
||||
//
|
||||
// logoPictureBox
|
||||
//
|
||||
this.logoPictureBox.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||
this.logoPictureBox.Image = ((System.Drawing.Image)(resources.GetObject("logoPictureBox.Image")));
|
||||
this.logoPictureBox.Location = new System.Drawing.Point(3, 3);
|
||||
this.logoPictureBox.Name = "logoPictureBox";
|
||||
this.tableLayoutPanel.SetRowSpan(this.logoPictureBox, 6);
|
||||
this.logoPictureBox.Size = new System.Drawing.Size(131, 135);
|
||||
this.logoPictureBox.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom;
|
||||
this.logoPictureBox.TabIndex = 12;
|
||||
this.logoPictureBox.TabStop = false;
|
||||
//
|
||||
// labelProductName
|
||||
//
|
||||
this.labelProductName.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||
this.labelProductName.Location = new System.Drawing.Point(143, 0);
|
||||
this.labelProductName.Margin = new System.Windows.Forms.Padding(6, 0, 3, 0);
|
||||
this.labelProductName.MaximumSize = new System.Drawing.Size(0, 16);
|
||||
this.labelProductName.Name = "labelProductName";
|
||||
this.labelProductName.Size = new System.Drawing.Size(271, 16);
|
||||
this.labelProductName.TabIndex = 19;
|
||||
this.labelProductName.Text = "产品名称";
|
||||
this.labelProductName.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
|
||||
//
|
||||
// labelVersion
|
||||
//
|
||||
this.labelVersion.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||
this.labelVersion.Location = new System.Drawing.Point(143, 20);
|
||||
this.labelVersion.Margin = new System.Windows.Forms.Padding(6, 0, 3, 0);
|
||||
this.labelVersion.MaximumSize = new System.Drawing.Size(0, 16);
|
||||
this.labelVersion.Name = "labelVersion";
|
||||
this.labelVersion.Size = new System.Drawing.Size(271, 16);
|
||||
this.labelVersion.TabIndex = 0;
|
||||
this.labelVersion.Text = "版本";
|
||||
this.labelVersion.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
|
||||
//
|
||||
// labelCopyright
|
||||
//
|
||||
this.labelCopyright.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||
this.labelCopyright.Location = new System.Drawing.Point(143, 42);
|
||||
this.labelCopyright.Margin = new System.Windows.Forms.Padding(6, 0, 3, 0);
|
||||
this.labelCopyright.MaximumSize = new System.Drawing.Size(0, 16);
|
||||
this.labelCopyright.Name = "labelCopyright";
|
||||
this.labelCopyright.Size = new System.Drawing.Size(271, 16);
|
||||
this.labelCopyright.TabIndex = 21;
|
||||
this.labelCopyright.Text = "版权";
|
||||
this.labelCopyright.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
|
||||
//
|
||||
// textBoxDescription
|
||||
//
|
||||
this.textBoxDescription.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||
this.textBoxDescription.Location = new System.Drawing.Point(143, 73);
|
||||
this.textBoxDescription.Margin = new System.Windows.Forms.Padding(6, 3, 3, 3);
|
||||
this.textBoxDescription.Multiline = true;
|
||||
this.textBoxDescription.Name = "textBoxDescription";
|
||||
this.textBoxDescription.ReadOnly = true;
|
||||
this.textBoxDescription.ScrollBars = System.Windows.Forms.ScrollBars.Both;
|
||||
this.textBoxDescription.Size = new System.Drawing.Size(271, 29);
|
||||
this.textBoxDescription.TabIndex = 23;
|
||||
this.textBoxDescription.TabStop = false;
|
||||
this.textBoxDescription.Text = "说明";
|
||||
//
|
||||
// okButton
|
||||
//
|
||||
this.okButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.okButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;
|
||||
this.okButton.Location = new System.Drawing.Point(339, 117);
|
||||
this.okButton.Name = "okButton";
|
||||
this.okButton.Size = new System.Drawing.Size(75, 21);
|
||||
this.okButton.TabIndex = 24;
|
||||
this.okButton.Text = "确定(&O)";
|
||||
this.okButton.Click += new System.EventHandler(this.okButton_Click);
|
||||
//
|
||||
// AboutBox
|
||||
//
|
||||
this.AcceptButton = this.okButton;
|
||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
|
||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||
this.ClientSize = new System.Drawing.Size(435, 157);
|
||||
this.Controls.Add(this.tableLayoutPanel);
|
||||
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
|
||||
this.MaximizeBox = false;
|
||||
this.MinimizeBox = false;
|
||||
this.Name = "AboutBox";
|
||||
this.Padding = new System.Windows.Forms.Padding(9, 8, 9, 8);
|
||||
this.ShowIcon = false;
|
||||
this.ShowInTaskbar = false;
|
||||
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
|
||||
this.Text = "AboutBox";
|
||||
this.tableLayoutPanel.ResumeLayout(false);
|
||||
this.tableLayoutPanel.PerformLayout();
|
||||
((System.ComponentModel.ISupportInitialize)(this.logoPictureBox)).EndInit();
|
||||
this.ResumeLayout(false);
|
||||
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
private System.Windows.Forms.TableLayoutPanel tableLayoutPanel;
|
||||
private System.Windows.Forms.PictureBox logoPictureBox;
|
||||
private System.Windows.Forms.Label labelProductName;
|
||||
private System.Windows.Forms.Label labelVersion;
|
||||
private System.Windows.Forms.Label labelCopyright;
|
||||
private System.Windows.Forms.TextBox textBoxDescription;
|
||||
private System.Windows.Forms.Button okButton;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,110 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using System.Reflection;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows.Forms;
|
||||
|
||||
namespace Ultron.Ngrok
|
||||
{
|
||||
partial class AboutBox : Form
|
||||
{
|
||||
public AboutBox()
|
||||
{
|
||||
InitializeComponent();
|
||||
this.Text = String.Format("关于 {0}", AssemblyTitle);
|
||||
this.labelProductName.Text = AssemblyProduct;
|
||||
this.labelVersion.Text = String.Format("版本 {0}", AssemblyVersion);
|
||||
this.labelCopyright.Text = AssemblyCopyright;
|
||||
this.textBoxDescription.Text = AssemblyDescription;
|
||||
}
|
||||
|
||||
#region 程序集特性访问器
|
||||
|
||||
public string AssemblyTitle
|
||||
{
|
||||
get
|
||||
{
|
||||
object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyTitleAttribute), false);
|
||||
if (attributes.Length > 0)
|
||||
{
|
||||
AssemblyTitleAttribute titleAttribute = (AssemblyTitleAttribute)attributes[0];
|
||||
if (titleAttribute.Title != "")
|
||||
{
|
||||
return titleAttribute.Title;
|
||||
}
|
||||
}
|
||||
return System.IO.Path.GetFileNameWithoutExtension(Assembly.GetExecutingAssembly().CodeBase);
|
||||
}
|
||||
}
|
||||
|
||||
public string AssemblyVersion
|
||||
{
|
||||
get
|
||||
{
|
||||
return Assembly.GetExecutingAssembly().GetName().Version.ToString();
|
||||
}
|
||||
}
|
||||
|
||||
public string AssemblyDescription
|
||||
{
|
||||
get
|
||||
{
|
||||
object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyDescriptionAttribute), false);
|
||||
if (attributes.Length == 0)
|
||||
{
|
||||
return "";
|
||||
}
|
||||
return ((AssemblyDescriptionAttribute)attributes[0]).Description;
|
||||
}
|
||||
}
|
||||
|
||||
public string AssemblyProduct
|
||||
{
|
||||
get
|
||||
{
|
||||
object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyProductAttribute), false);
|
||||
if (attributes.Length == 0)
|
||||
{
|
||||
return "";
|
||||
}
|
||||
return ((AssemblyProductAttribute)attributes[0]).Product;
|
||||
}
|
||||
}
|
||||
|
||||
public string AssemblyCopyright
|
||||
{
|
||||
get
|
||||
{
|
||||
object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyCopyrightAttribute), false);
|
||||
if (attributes.Length == 0)
|
||||
{
|
||||
return "";
|
||||
}
|
||||
return ((AssemblyCopyrightAttribute)attributes[0]).Copyright;
|
||||
}
|
||||
}
|
||||
|
||||
public string AssemblyCompany
|
||||
{
|
||||
get
|
||||
{
|
||||
object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyCompanyAttribute), false);
|
||||
if (attributes.Length == 0)
|
||||
{
|
||||
return "";
|
||||
}
|
||||
return ((AssemblyCompanyAttribute)attributes[0]).Company;
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
|
||||
private void okButton_Click(object sender, EventArgs e)
|
||||
{
|
||||
this.Close();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
|
@ -0,0 +1,406 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
|
||||
<data name="logoPictureBox.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>
|
||||
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
|
||||
</value>
|
||||
</data>
|
||||
</root>
|
|
@ -0,0 +1,276 @@
|
|||
namespace Ultron.Ngrok
|
||||
{
|
||||
partial class SettingForm
|
||||
{
|
||||
/// <summary>
|
||||
/// Required designer variable.
|
||||
/// </summary>
|
||||
private System.ComponentModel.IContainer components = null;
|
||||
|
||||
/// <summary>
|
||||
/// Clean up any resources being used.
|
||||
/// </summary>
|
||||
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
if (disposing && (components != null))
|
||||
{
|
||||
components.Dispose();
|
||||
}
|
||||
base.Dispose(disposing);
|
||||
}
|
||||
|
||||
#region Windows Form Designer generated code
|
||||
|
||||
/// <summary>
|
||||
/// Required method for Designer support - do not modify
|
||||
/// the contents of this method with the code editor.
|
||||
/// </summary>
|
||||
private void InitializeComponent()
|
||||
{
|
||||
this.TunnelConfigGroupBox = new System.Windows.Forms.GroupBox();
|
||||
this.enableCBX = new System.Windows.Forms.CheckBox();
|
||||
this.ipTB = new System.Windows.Forms.TextBox();
|
||||
this.delButton = new System.Windows.Forms.Button();
|
||||
this.addButton = new System.Windows.Forms.Button();
|
||||
this.portTB = new System.Windows.Forms.TextBox();
|
||||
this.tunnelNameTB = new System.Windows.Forms.TextBox();
|
||||
this.subdomainTB = new System.Windows.Forms.TextBox();
|
||||
this.label1 = new System.Windows.Forms.Label();
|
||||
this.label2 = new System.Windows.Forms.Label();
|
||||
this.label5 = new System.Windows.Forms.Label();
|
||||
this.tunnelTypeLabelPort = new System.Windows.Forms.Label();
|
||||
this.subdomainLBL = new System.Windows.Forms.Label();
|
||||
this.label3 = new System.Windows.Forms.Label();
|
||||
this.tunnelTypeLabel = new System.Windows.Forms.Label();
|
||||
this.tunnelTypeCMB = new System.Windows.Forms.ComboBox();
|
||||
this.tunnelListBox = new System.Windows.Forms.ListBox();
|
||||
this.saveButton = new System.Windows.Forms.Button();
|
||||
this.TunnelConfigGroupBox.SuspendLayout();
|
||||
this.SuspendLayout();
|
||||
//
|
||||
// TunnelConfigGroupBox
|
||||
//
|
||||
this.TunnelConfigGroupBox.Controls.Add(this.enableCBX);
|
||||
this.TunnelConfigGroupBox.Controls.Add(this.ipTB);
|
||||
this.TunnelConfigGroupBox.Controls.Add(this.delButton);
|
||||
this.TunnelConfigGroupBox.Controls.Add(this.addButton);
|
||||
this.TunnelConfigGroupBox.Controls.Add(this.portTB);
|
||||
this.TunnelConfigGroupBox.Controls.Add(this.tunnelNameTB);
|
||||
this.TunnelConfigGroupBox.Controls.Add(this.subdomainTB);
|
||||
this.TunnelConfigGroupBox.Controls.Add(this.label1);
|
||||
this.TunnelConfigGroupBox.Controls.Add(this.label2);
|
||||
this.TunnelConfigGroupBox.Controls.Add(this.label5);
|
||||
this.TunnelConfigGroupBox.Controls.Add(this.tunnelTypeLabelPort);
|
||||
this.TunnelConfigGroupBox.Controls.Add(this.subdomainLBL);
|
||||
this.TunnelConfigGroupBox.Controls.Add(this.label3);
|
||||
this.TunnelConfigGroupBox.Controls.Add(this.tunnelTypeLabel);
|
||||
this.TunnelConfigGroupBox.Controls.Add(this.tunnelTypeCMB);
|
||||
this.TunnelConfigGroupBox.Controls.Add(this.tunnelListBox);
|
||||
this.TunnelConfigGroupBox.Location = new System.Drawing.Point(12, 12);
|
||||
this.TunnelConfigGroupBox.Name = "TunnelConfigGroupBox";
|
||||
this.TunnelConfigGroupBox.Size = new System.Drawing.Size(291, 201);
|
||||
this.TunnelConfigGroupBox.TabIndex = 8;
|
||||
this.TunnelConfigGroupBox.TabStop = false;
|
||||
this.TunnelConfigGroupBox.Text = "通道配置";
|
||||
//
|
||||
// enableCBX
|
||||
//
|
||||
this.enableCBX.AutoSize = true;
|
||||
this.enableCBX.Location = new System.Drawing.Point(193, 154);
|
||||
this.enableCBX.Name = "enableCBX";
|
||||
this.enableCBX.Size = new System.Drawing.Size(15, 14);
|
||||
this.enableCBX.TabIndex = 10;
|
||||
this.enableCBX.UseVisualStyleBackColor = true;
|
||||
//
|
||||
// ipTB
|
||||
//
|
||||
this.ipTB.Location = new System.Drawing.Point(193, 100);
|
||||
this.ipTB.Name = "ipTB";
|
||||
this.ipTB.Size = new System.Drawing.Size(92, 21);
|
||||
this.ipTB.TabIndex = 9;
|
||||
//
|
||||
// delButton
|
||||
//
|
||||
this.delButton.Location = new System.Drawing.Point(76, 172);
|
||||
this.delButton.Name = "delButton";
|
||||
this.delButton.Size = new System.Drawing.Size(50, 23);
|
||||
this.delButton.TabIndex = 1;
|
||||
this.delButton.Text = "删除";
|
||||
this.delButton.UseVisualStyleBackColor = true;
|
||||
this.delButton.Click += new System.EventHandler(this.delButton_Click);
|
||||
//
|
||||
// addButton
|
||||
//
|
||||
this.addButton.Location = new System.Drawing.Point(6, 172);
|
||||
this.addButton.Name = "addButton";
|
||||
this.addButton.Size = new System.Drawing.Size(50, 23);
|
||||
this.addButton.TabIndex = 1;
|
||||
this.addButton.Text = "新增";
|
||||
this.addButton.UseVisualStyleBackColor = true;
|
||||
this.addButton.Click += new System.EventHandler(this.addButton_Click);
|
||||
//
|
||||
// portTB
|
||||
//
|
||||
this.portTB.Location = new System.Drawing.Point(193, 127);
|
||||
this.portTB.Name = "portTB";
|
||||
this.portTB.Size = new System.Drawing.Size(92, 21);
|
||||
this.portTB.TabIndex = 9;
|
||||
//
|
||||
// tunnelNameTB
|
||||
//
|
||||
this.tunnelNameTB.Location = new System.Drawing.Point(193, 20);
|
||||
this.tunnelNameTB.Name = "tunnelNameTB";
|
||||
this.tunnelNameTB.Size = new System.Drawing.Size(92, 21);
|
||||
this.tunnelNameTB.TabIndex = 9;
|
||||
//
|
||||
// subdomainTB
|
||||
//
|
||||
this.subdomainTB.Location = new System.Drawing.Point(193, 47);
|
||||
this.subdomainTB.Name = "subdomainTB";
|
||||
this.subdomainTB.Size = new System.Drawing.Size(92, 21);
|
||||
this.subdomainTB.TabIndex = 9;
|
||||
//
|
||||
// label1
|
||||
//
|
||||
this.label1.AutoSize = true;
|
||||
this.label1.Location = new System.Drawing.Point(158, 154);
|
||||
this.label1.Name = "label1";
|
||||
this.label1.Size = new System.Drawing.Size(29, 12);
|
||||
this.label1.TabIndex = 8;
|
||||
this.label1.Text = "启用";
|
||||
//
|
||||
// label2
|
||||
//
|
||||
this.label2.AutoSize = true;
|
||||
this.label2.Location = new System.Drawing.Point(158, 130);
|
||||
this.label2.Name = "label2";
|
||||
this.label2.Size = new System.Drawing.Size(29, 12);
|
||||
this.label2.TabIndex = 8;
|
||||
this.label2.Text = "端口";
|
||||
//
|
||||
// label5
|
||||
//
|
||||
this.label5.AutoSize = true;
|
||||
this.label5.Location = new System.Drawing.Point(158, 24);
|
||||
this.label5.Name = "label5";
|
||||
this.label5.Size = new System.Drawing.Size(29, 12);
|
||||
this.label5.TabIndex = 8;
|
||||
this.label5.Text = "名称";
|
||||
//
|
||||
// tunnelTypeLabelPort
|
||||
//
|
||||
this.tunnelTypeLabelPort.AutoSize = true;
|
||||
this.tunnelTypeLabelPort.Location = new System.Drawing.Point(134, 50);
|
||||
this.tunnelTypeLabelPort.Name = "tunnelTypeLabelPort";
|
||||
this.tunnelTypeLabelPort.Size = new System.Drawing.Size(53, 12);
|
||||
this.tunnelTypeLabelPort.TabIndex = 8;
|
||||
this.tunnelTypeLabelPort.Text = "远程端口";
|
||||
this.tunnelTypeLabelPort.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
|
||||
this.tunnelTypeLabelPort.Visible = false;
|
||||
//
|
||||
// subdomainLBL
|
||||
//
|
||||
this.subdomainLBL.AutoSize = true;
|
||||
this.subdomainLBL.Location = new System.Drawing.Point(146, 50);
|
||||
this.subdomainLBL.Name = "subdomainLBL";
|
||||
this.subdomainLBL.Size = new System.Drawing.Size(41, 12);
|
||||
this.subdomainLBL.TabIndex = 8;
|
||||
this.subdomainLBL.Text = "子域名";
|
||||
this.subdomainLBL.Visible = false;
|
||||
//
|
||||
// label3
|
||||
//
|
||||
this.label3.AutoSize = true;
|
||||
this.label3.Location = new System.Drawing.Point(146, 103);
|
||||
this.label3.Name = "label3";
|
||||
this.label3.RightToLeft = System.Windows.Forms.RightToLeft.No;
|
||||
this.label3.Size = new System.Drawing.Size(41, 12);
|
||||
this.label3.TabIndex = 7;
|
||||
this.label3.Text = "IP地址";
|
||||
//
|
||||
// tunnelTypeLabel
|
||||
//
|
||||
this.tunnelTypeLabel.AutoSize = true;
|
||||
this.tunnelTypeLabel.Location = new System.Drawing.Point(134, 77);
|
||||
this.tunnelTypeLabel.Name = "tunnelTypeLabel";
|
||||
this.tunnelTypeLabel.Size = new System.Drawing.Size(53, 12);
|
||||
this.tunnelTypeLabel.TabIndex = 7;
|
||||
this.tunnelTypeLabel.Text = "通道类型";
|
||||
//
|
||||
// tunnelTypeCMB
|
||||
//
|
||||
this.tunnelTypeCMB.FormattingEnabled = true;
|
||||
this.tunnelTypeCMB.Items.AddRange(new object[] {
|
||||
"TCP",
|
||||
"HTTP"});
|
||||
this.tunnelTypeCMB.Location = new System.Drawing.Point(193, 74);
|
||||
this.tunnelTypeCMB.Name = "tunnelTypeCMB";
|
||||
this.tunnelTypeCMB.Size = new System.Drawing.Size(92, 20);
|
||||
this.tunnelTypeCMB.TabIndex = 6;
|
||||
this.tunnelTypeCMB.SelectedIndexChanged += new System.EventHandler(this.tunnelTypeCMB_SelectedIndexChanged);
|
||||
//
|
||||
// tunnelListBox
|
||||
//
|
||||
this.tunnelListBox.Font = new System.Drawing.Font("宋体", 10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
|
||||
this.tunnelListBox.FormattingEnabled = true;
|
||||
this.tunnelListBox.ItemHeight = 14;
|
||||
this.tunnelListBox.Location = new System.Drawing.Point(6, 20);
|
||||
this.tunnelListBox.Name = "tunnelListBox";
|
||||
this.tunnelListBox.Size = new System.Drawing.Size(120, 144);
|
||||
this.tunnelListBox.TabIndex = 5;
|
||||
this.tunnelListBox.SelectedIndexChanged += new System.EventHandler(this.tunnelListBox_SelectedValueChanged);
|
||||
//
|
||||
// saveButton
|
||||
//
|
||||
this.saveButton.Location = new System.Drawing.Point(228, 219);
|
||||
this.saveButton.Name = "saveButton";
|
||||
this.saveButton.Size = new System.Drawing.Size(75, 23);
|
||||
this.saveButton.TabIndex = 1;
|
||||
this.saveButton.Text = "保存";
|
||||
this.saveButton.UseVisualStyleBackColor = true;
|
||||
this.saveButton.Click += new System.EventHandler(this.saveButton_Click);
|
||||
//
|
||||
// SettingForm
|
||||
//
|
||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
|
||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||
this.ClientSize = new System.Drawing.Size(309, 247);
|
||||
this.Controls.Add(this.TunnelConfigGroupBox);
|
||||
this.Controls.Add(this.saveButton);
|
||||
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
|
||||
this.MaximizeBox = false;
|
||||
this.MinimizeBox = false;
|
||||
this.Name = "SettingForm";
|
||||
this.ShowIcon = false;
|
||||
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
|
||||
this.Text = "设置";
|
||||
this.FormClosed += new System.Windows.Forms.FormClosedEventHandler(this.SettingForm_FormClosed);
|
||||
this.TunnelConfigGroupBox.ResumeLayout(false);
|
||||
this.TunnelConfigGroupBox.PerformLayout();
|
||||
this.ResumeLayout(false);
|
||||
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
private System.Windows.Forms.GroupBox TunnelConfigGroupBox;
|
||||
private System.Windows.Forms.CheckBox enableCBX;
|
||||
private System.Windows.Forms.TextBox ipTB;
|
||||
private System.Windows.Forms.Button delButton;
|
||||
private System.Windows.Forms.Button addButton;
|
||||
private System.Windows.Forms.Button saveButton;
|
||||
private System.Windows.Forms.TextBox portTB;
|
||||
private System.Windows.Forms.TextBox tunnelNameTB;
|
||||
private System.Windows.Forms.TextBox subdomainTB;
|
||||
private System.Windows.Forms.Label label2;
|
||||
private System.Windows.Forms.Label label5;
|
||||
private System.Windows.Forms.Label subdomainLBL;
|
||||
private System.Windows.Forms.Label label3;
|
||||
private System.Windows.Forms.Label tunnelTypeLabel;
|
||||
private System.Windows.Forms.ComboBox tunnelTypeCMB;
|
||||
private System.Windows.Forms.ListBox tunnelListBox;
|
||||
private System.Windows.Forms.Label label1;
|
||||
private System.Windows.Forms.Label tunnelTypeLabelPort;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,332 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel;
|
||||
using System.Data;
|
||||
using System.Drawing;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows.Forms;
|
||||
using Ultron.Ngrok.Model;
|
||||
using Ultron.Ngrok.Properties;
|
||||
using YamlDotNet.Serialization;
|
||||
using YamlDotNet.Serialization.NamingConventions;
|
||||
|
||||
namespace Ultron.Ngrok
|
||||
{
|
||||
public partial class SettingForm : Form
|
||||
{
|
||||
public delegate void WriteLog(string message);
|
||||
|
||||
public event WriteLog WriteLogToForm;
|
||||
|
||||
/// <summary>
|
||||
/// 配置
|
||||
/// </summary>
|
||||
public Config ServerConfig { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 配置文件
|
||||
/// </summary>
|
||||
public string ConfigFile { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 执行命令
|
||||
/// </summary>
|
||||
public string ExecuteCommand { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 执行文件名
|
||||
/// </summary>
|
||||
public string ExeFile { get; set; }
|
||||
|
||||
public SettingForm()
|
||||
{
|
||||
InitializeComponent();
|
||||
|
||||
InitFile();
|
||||
|
||||
InitConfig();
|
||||
|
||||
LoadConfig();
|
||||
}
|
||||
|
||||
public void InitFile()
|
||||
{
|
||||
string path = System.IO.Directory.GetCurrentDirectory();
|
||||
string ngrokFile = string.Empty;
|
||||
if (Environment.Is64BitOperatingSystem)//判断是否为64位操作系统
|
||||
{
|
||||
ngrokFile = path + @"\ngrok_x64.exe";
|
||||
if (!File.Exists(ngrokFile))
|
||||
{
|
||||
FileStream str = new FileStream(ngrokFile, FileMode.OpenOrCreate);
|
||||
str.Write(Resources.ngrok_x64, 0, Resources.ngrok_x64.Length);
|
||||
str.Close();
|
||||
}
|
||||
ExeFile = "ngrok_x64";
|
||||
}
|
||||
else
|
||||
{
|
||||
ngrokFile = path + @"\ngrok_x86.exe";
|
||||
if (!File.Exists(ngrokFile))
|
||||
{
|
||||
FileStream str = new FileStream(ngrokFile, FileMode.OpenOrCreate);
|
||||
str.Write(Resources.ngrok_x86, 0, Resources.ngrok_x86.Length);
|
||||
str.Close();
|
||||
}
|
||||
ExeFile = "ngrok_x86";
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 初始化配置文件
|
||||
/// </summary>
|
||||
public void InitConfig()
|
||||
{
|
||||
string path = System.IO.Directory.GetCurrentDirectory();
|
||||
|
||||
ConfigFile = path + @"\ngrok.cfg";
|
||||
if (!File.Exists(ConfigFile))
|
||||
{
|
||||
FileStream fs1 = new FileStream(ConfigFile, FileMode.Create, FileAccess.Write);//创建写入文件
|
||||
StreamWriter sw = new StreamWriter(fs1);
|
||||
|
||||
ServerConfig = new Config
|
||||
{
|
||||
ServerAddr = "ngrok.aaqbee.com:8083",
|
||||
TrustHostRootCerts = false,
|
||||
Tunnels = new Dictionary<string, Tunnel>()
|
||||
};
|
||||
Tunnel httpTunnel = new Tunnel
|
||||
{
|
||||
SubDomain = "test",
|
||||
TunnelName = "test",
|
||||
Proto = new Dictionary<string, string>(),
|
||||
Enable = true,
|
||||
TunnelID = Guid.NewGuid().ToString()
|
||||
};
|
||||
httpTunnel.Proto.Add("http", "127.0.0.1:5000");
|
||||
ServerConfig.Tunnels.Add(httpTunnel.TunnelID, httpTunnel);
|
||||
Tunnel tcpTunnel = new Tunnel
|
||||
{
|
||||
TunnelName = "mstsc",
|
||||
RemotePort = 33099,
|
||||
Proto = new Dictionary<string, string>(),
|
||||
Enable = true,
|
||||
TunnelID = Guid.NewGuid().ToString()
|
||||
};
|
||||
tcpTunnel.Proto.Add("tcp", "127.0.0.1:1433");
|
||||
ServerConfig.Tunnels.Add(tcpTunnel.TunnelID, tcpTunnel);
|
||||
|
||||
var serializer = new Serializer();
|
||||
serializer.Serialize(sw, ServerConfig);
|
||||
sw.Close();
|
||||
fs1.Close();
|
||||
}
|
||||
else
|
||||
{
|
||||
string configText = File.ReadAllText(ConfigFile, Encoding.UTF8);
|
||||
var input = new StringReader(configText);
|
||||
var deserializer = new Deserializer(namingConvention: new CamelCaseNamingConvention());
|
||||
ServerConfig = deserializer.Deserialize<Config>(input);
|
||||
}
|
||||
|
||||
this.tunnelListBox.DisplayMember = "TunnelName";
|
||||
this.tunnelListBox.ValueMember = "TunnelID";
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 加载配置文件
|
||||
/// </summary>
|
||||
public void LoadConfig()
|
||||
{
|
||||
tunnelListBox.Items.Clear();
|
||||
foreach(var item in ServerConfig.Tunnels)
|
||||
{
|
||||
tunnelListBox.Items.Add(item.Value);
|
||||
}
|
||||
if (tunnelListBox.Items.Count>0)
|
||||
tunnelListBox.SelectedIndex = 0;
|
||||
|
||||
string tunnelName = string.Empty;
|
||||
foreach (var item in ServerConfig.Tunnels.Where(p => p.Value.Enable))
|
||||
{
|
||||
tunnelName += " " + item.Key;
|
||||
}
|
||||
|
||||
ExecuteCommand = ExeFile + ".exe -config ngrok.cfg start" + tunnelName;
|
||||
}
|
||||
|
||||
public void ReLoadConfig()
|
||||
{
|
||||
string configText = File.ReadAllText(ConfigFile, Encoding.UTF8);
|
||||
var input = new StringReader(configText);
|
||||
var deserializer = new Deserializer(namingConvention: new CamelCaseNamingConvention());
|
||||
ServerConfig = deserializer.Deserialize<Config>(input);
|
||||
|
||||
LoadConfig();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 通道类型选择
|
||||
/// </summary>
|
||||
/// <param name="sender"></param>
|
||||
/// <param name="e"></param>
|
||||
private void tunnelTypeCMB_SelectedIndexChanged(object sender, EventArgs e)
|
||||
{
|
||||
ComboBox cmb = sender as ComboBox;
|
||||
|
||||
if (cmb.SelectedItem.ToString() == "HTTP")
|
||||
{
|
||||
subdomainLBL.Visible = true;
|
||||
tunnelTypeLabelPort.Visible = false;
|
||||
subdomainTB.KeyPress -= subdomainTB_KeyPress;
|
||||
}
|
||||
else
|
||||
{
|
||||
tunnelTypeLabelPort.Visible = true;
|
||||
subdomainLBL.Visible = false;
|
||||
subdomainTB.KeyPress += subdomainTB_KeyPress;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 子域名框按键释放
|
||||
/// </summary>
|
||||
/// <param name="sender"></param>
|
||||
/// <param name="e"></param>
|
||||
void subdomainTB_KeyPress(object sender, KeyPressEventArgs e)
|
||||
{
|
||||
//阻止从键盘输入键
|
||||
e.Handled = true;
|
||||
if((e.KeyChar>='0' && e.KeyChar <='9') || e.KeyChar == '\b')
|
||||
e.Handled = false;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 切换通道
|
||||
/// </summary>
|
||||
/// <param name="sender"></param>
|
||||
/// <param name="e"></param>
|
||||
private void tunnelListBox_SelectedValueChanged(object sender, EventArgs e)
|
||||
{
|
||||
ListBox lbx = sender as ListBox;
|
||||
|
||||
if(lbx != null && lbx.SelectedItem != null)
|
||||
{
|
||||
Tunnel tunl = lbx.SelectedItem as Tunnel;
|
||||
tunnelNameTB.Text = tunl.TunnelName;
|
||||
tunnelTypeCMB.Text = tunl.Proto.ContainsKey("http") ? "HTTP" : "TCP";
|
||||
if (tunnelTypeCMB.Text == "HTTP")
|
||||
{
|
||||
subdomainLBL.Visible = true;
|
||||
tunnelTypeLabelPort.Visible = false;
|
||||
subdomainTB.Text = tunl.SubDomain;
|
||||
}
|
||||
else
|
||||
{
|
||||
tunnelTypeLabelPort.Visible = true;
|
||||
subdomainLBL.Visible = false;
|
||||
subdomainTB.Text = tunl.RemotePort.ToString();
|
||||
}
|
||||
string ipPort = tunl.Proto.FirstOrDefault().Value;
|
||||
|
||||
ipTB.Text = ipPort.Substring(0, ipPort.IndexOf(":"));
|
||||
portTB.Text = ipPort.Substring(ipPort.IndexOf(":")+1);
|
||||
|
||||
enableCBX.Checked = tunl.Enable;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 删除
|
||||
/// </summary>
|
||||
/// <param name="sender"></param>
|
||||
/// <param name="e"></param>
|
||||
private void delButton_Click(object sender, EventArgs e)
|
||||
{
|
||||
ListBox lbx = tunnelListBox as ListBox;
|
||||
|
||||
if (lbx != null && lbx.SelectedItem != null)
|
||||
{
|
||||
Tunnel tunl = lbx.SelectedItem as Tunnel;
|
||||
ServerConfig.Tunnels.Remove(tunl.TunnelID);
|
||||
//SaveConfig();
|
||||
}
|
||||
LoadConfig();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 新增
|
||||
/// </summary>
|
||||
/// <param name="sender"></param>
|
||||
/// <param name="e"></param>
|
||||
private void addButton_Click(object sender, EventArgs e)
|
||||
{
|
||||
Tunnel tunl = new Tunnel
|
||||
{
|
||||
RemotePort = 33000,
|
||||
Proto = new Dictionary<string, string>(),
|
||||
Enable = true,
|
||||
TunnelID = Guid.NewGuid().ToString(),
|
||||
TunnelName = "新增通道"
|
||||
};
|
||||
tunl.Proto.Add("tcp", "127.0.0.1:80");
|
||||
ServerConfig.Tunnels.Add(tunl.TunnelID, tunl);
|
||||
LoadConfig();
|
||||
tunnelListBox.SelectedItem = tunl;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 保存
|
||||
/// </summary>
|
||||
/// <param name="sender"></param>
|
||||
/// <param name="e"></param>
|
||||
private void saveButton_Click(object sender, EventArgs e)
|
||||
{
|
||||
if (tunnelListBox != null && tunnelListBox.SelectedItem != null)
|
||||
{
|
||||
Tunnel tunl = tunnelListBox.SelectedItem as Tunnel;
|
||||
if (tunnelTypeCMB.Text == "HTTP")
|
||||
{
|
||||
tunl.Proto.Clear();
|
||||
tunl.Proto.Add("http", ipTB.Text + ":" + portTB.Text);
|
||||
tunl.SubDomain = subdomainTB.Text;
|
||||
}
|
||||
else
|
||||
{
|
||||
tunl.Proto.Clear();
|
||||
tunl.Proto.Add("tcp", ipTB.Text + ":" + portTB.Text);
|
||||
tunl.RemotePort = Int32.Parse(subdomainTB.Text);
|
||||
}
|
||||
tunl.TunnelName = tunnelNameTB.Text;
|
||||
tunl.Enable = enableCBX.Checked;
|
||||
|
||||
SaveConfig();
|
||||
|
||||
LoadConfig();
|
||||
}
|
||||
WriteLogToForm("保存成功");
|
||||
this.Close();
|
||||
}
|
||||
public void SaveConfig()
|
||||
{
|
||||
FileStream fs1 = new FileStream(ConfigFile, FileMode.OpenOrCreate, FileAccess.Write);
|
||||
fs1.Seek(0, SeekOrigin.Begin);
|
||||
fs1.SetLength(0); //清空文件
|
||||
var serializer = new Serializer();
|
||||
StreamWriter sw = new StreamWriter(fs1);
|
||||
serializer.Serialize(sw, ServerConfig);
|
||||
sw.Close();
|
||||
fs1.Close();
|
||||
}
|
||||
|
||||
private void SettingForm_FormClosed(object sender, FormClosedEventArgs e)
|
||||
{
|
||||
ReLoadConfig();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
|
@ -0,0 +1,123 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<metadata name="$this.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>True</value>
|
||||
</metadata>
|
||||
</root>
|
|
@ -0,0 +1,142 @@
|
|||
namespace Ultron.Ngrok
|
||||
{
|
||||
partial class FormMain
|
||||
{
|
||||
/// <summary>
|
||||
/// 必需的设计器变量。
|
||||
/// </summary>
|
||||
private System.ComponentModel.IContainer components = null;
|
||||
|
||||
/// <summary>
|
||||
/// 清理所有正在使用的资源。
|
||||
/// </summary>
|
||||
/// <param name="disposing">如果应释放托管资源,为 true;否则为 false。</param>
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
if (disposing && (components != null))
|
||||
{
|
||||
components.Dispose();
|
||||
}
|
||||
base.Dispose(disposing);
|
||||
}
|
||||
|
||||
#region Windows 窗体设计器生成的代码
|
||||
|
||||
/// <summary>
|
||||
/// 设计器支持所需的方法 - 不要
|
||||
/// 使用代码编辑器修改此方法的内容。
|
||||
/// </summary>
|
||||
private void InitializeComponent()
|
||||
{
|
||||
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormMain));
|
||||
this.cmdLogTextArea = new System.Windows.Forms.TextBox();
|
||||
this.startBtn = new System.Windows.Forms.Button();
|
||||
this.endBtn = new System.Windows.Forms.Button();
|
||||
this.menuStrip1 = new System.Windows.Forms.MenuStrip();
|
||||
this.设置ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
||||
this.帮助ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
||||
this.关于ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
||||
this.menuStrip1.SuspendLayout();
|
||||
this.SuspendLayout();
|
||||
//
|
||||
// cmdLogTextArea
|
||||
//
|
||||
this.cmdLogTextArea.BackColor = System.Drawing.SystemColors.Window;
|
||||
this.cmdLogTextArea.ForeColor = System.Drawing.SystemColors.InfoText;
|
||||
this.cmdLogTextArea.Location = new System.Drawing.Point(12, 28);
|
||||
this.cmdLogTextArea.Multiline = true;
|
||||
this.cmdLogTextArea.Name = "cmdLogTextArea";
|
||||
this.cmdLogTextArea.ReadOnly = true;
|
||||
this.cmdLogTextArea.Size = new System.Drawing.Size(339, 129);
|
||||
this.cmdLogTextArea.TabIndex = 0;
|
||||
//
|
||||
// startBtn
|
||||
//
|
||||
this.startBtn.Location = new System.Drawing.Point(12, 163);
|
||||
this.startBtn.Name = "startBtn";
|
||||
this.startBtn.Size = new System.Drawing.Size(75, 23);
|
||||
this.startBtn.TabIndex = 1;
|
||||
this.startBtn.Text = "启动";
|
||||
this.startBtn.UseVisualStyleBackColor = true;
|
||||
this.startBtn.Click += new System.EventHandler(this.startBtn_Click);
|
||||
//
|
||||
// endBtn
|
||||
//
|
||||
this.endBtn.Enabled = false;
|
||||
this.endBtn.Location = new System.Drawing.Point(276, 163);
|
||||
this.endBtn.Name = "endBtn";
|
||||
this.endBtn.Size = new System.Drawing.Size(75, 23);
|
||||
this.endBtn.TabIndex = 2;
|
||||
this.endBtn.Text = "结束";
|
||||
this.endBtn.UseVisualStyleBackColor = true;
|
||||
this.endBtn.Click += new System.EventHandler(this.endBtn_Click);
|
||||
//
|
||||
// menuStrip1
|
||||
//
|
||||
this.menuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
|
||||
this.设置ToolStripMenuItem,
|
||||
this.帮助ToolStripMenuItem,
|
||||
this.关于ToolStripMenuItem});
|
||||
this.menuStrip1.Location = new System.Drawing.Point(0, 0);
|
||||
this.menuStrip1.Name = "menuStrip1";
|
||||
this.menuStrip1.Size = new System.Drawing.Size(362, 25);
|
||||
this.menuStrip1.TabIndex = 4;
|
||||
this.menuStrip1.Text = "menuStrip1";
|
||||
//
|
||||
// 设置ToolStripMenuItem
|
||||
//
|
||||
this.设置ToolStripMenuItem.Name = "设置ToolStripMenuItem";
|
||||
this.设置ToolStripMenuItem.Size = new System.Drawing.Size(44, 21);
|
||||
this.设置ToolStripMenuItem.Text = "设置";
|
||||
this.设置ToolStripMenuItem.Click += new System.EventHandler(this.设置ToolStripMenuItem_Click);
|
||||
//
|
||||
// 帮助ToolStripMenuItem
|
||||
//
|
||||
this.帮助ToolStripMenuItem.Name = "帮助ToolStripMenuItem";
|
||||
this.帮助ToolStripMenuItem.Size = new System.Drawing.Size(44, 21);
|
||||
this.帮助ToolStripMenuItem.Text = "帮助";
|
||||
this.帮助ToolStripMenuItem.Click += new System.EventHandler(this.帮助ToolStripMenuItem_Click);
|
||||
//
|
||||
// 关于ToolStripMenuItem
|
||||
//
|
||||
this.关于ToolStripMenuItem.Name = "关于ToolStripMenuItem";
|
||||
this.关于ToolStripMenuItem.Size = new System.Drawing.Size(44, 21);
|
||||
this.关于ToolStripMenuItem.Text = "关于";
|
||||
this.关于ToolStripMenuItem.Click += new System.EventHandler(this.关于ToolStripMenuItem_Click);
|
||||
//
|
||||
// FormMain
|
||||
//
|
||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
|
||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||
this.ClientSize = new System.Drawing.Size(362, 194);
|
||||
this.Controls.Add(this.endBtn);
|
||||
this.Controls.Add(this.startBtn);
|
||||
this.Controls.Add(this.cmdLogTextArea);
|
||||
this.Controls.Add(this.menuStrip1);
|
||||
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
|
||||
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
|
||||
this.MainMenuStrip = this.menuStrip1;
|
||||
this.MaximizeBox = false;
|
||||
this.Name = "FormMain";
|
||||
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
|
||||
this.Text = "uNgrok";
|
||||
this.Load += new System.EventHandler(this.FormMain_Load);
|
||||
this.menuStrip1.ResumeLayout(false);
|
||||
this.menuStrip1.PerformLayout();
|
||||
this.ResumeLayout(false);
|
||||
this.PerformLayout();
|
||||
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
public System.Windows.Forms.TextBox cmdLogTextArea;
|
||||
private System.Windows.Forms.Button startBtn;
|
||||
private System.Windows.Forms.Button endBtn;
|
||||
private System.Windows.Forms.MenuStrip menuStrip1;
|
||||
private System.Windows.Forms.ToolStripMenuItem 帮助ToolStripMenuItem;
|
||||
private System.Windows.Forms.ToolStripMenuItem 关于ToolStripMenuItem;
|
||||
private System.Windows.Forms.ToolStripMenuItem 设置ToolStripMenuItem;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,181 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel;
|
||||
using System.Data;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows.Forms;
|
||||
using System.Diagnostics;
|
||||
using System.Reflection;
|
||||
using System.Resources;
|
||||
using System.Threading;
|
||||
using System.Text.RegularExpressions;
|
||||
using System.IO;
|
||||
using System.Net.NetworkInformation;
|
||||
using YamlDotNet.Serialization;
|
||||
using YamlDotNet.Serialization.NamingConventions;
|
||||
using Ultron.Ngrok.Utils;
|
||||
using Ultron.Ngrok.Model;
|
||||
using Ultron.Ngrok.Properties;
|
||||
|
||||
namespace Ultron.Ngrok
|
||||
{
|
||||
public partial class FormMain : Form
|
||||
{
|
||||
CmdUtils cmd = new CmdUtils();
|
||||
|
||||
SettingForm setting;
|
||||
|
||||
public FormMain()
|
||||
{
|
||||
//引用资源处理
|
||||
AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;
|
||||
|
||||
//初始化
|
||||
InitializeComponent();
|
||||
|
||||
//初始化配置
|
||||
InitSetting();
|
||||
}
|
||||
|
||||
Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
|
||||
{
|
||||
string dllName = args.Name.Contains(",") ? args.Name.Substring(0, args.Name.IndexOf(',')) : args.Name.Replace(".dll", "");
|
||||
dllName = dllName.Replace(".", "_");
|
||||
if (dllName.EndsWith("_resources")) return null;
|
||||
ResourceManager rm = new ResourceManager(GetType().Namespace + ".Properties.Resources", Assembly.GetExecutingAssembly());
|
||||
byte[] bytes = (byte[])rm.GetObject(dllName);
|
||||
return Assembly.Load(bytes);
|
||||
}
|
||||
|
||||
public void CheckProcessAndKill(string processName)
|
||||
{
|
||||
Process[] proces = Process.GetProcessesByName(processName);
|
||||
foreach (var item in proces)
|
||||
{
|
||||
WriteLog("检测到进程:" + item.ProcessName + ",ID:" + item.Id + "");
|
||||
item.Kill();
|
||||
WriteLog("结束进程:" + item.Id + "");
|
||||
}
|
||||
}
|
||||
|
||||
public void CheckProcessAndKill(int id)
|
||||
{
|
||||
Process proces = Process.GetProcessById(id);
|
||||
if (proces != null)
|
||||
{
|
||||
WriteLog("检测到进程:" + proces.ProcessName + ",ID:" + proces.Id + "");
|
||||
proces.Kill();
|
||||
WriteLog("结束进程:" + proces.Id + "");
|
||||
}
|
||||
}
|
||||
|
||||
public void InitSetting()
|
||||
{
|
||||
setting = new SettingForm();
|
||||
setting.WriteLogToForm += WriteLog;
|
||||
}
|
||||
|
||||
private void InitCmd() {
|
||||
//创建CMD
|
||||
cmd.ProcessMessageEvent += DealMessage;
|
||||
cmd.ProcessKilled += cmd_Exited;
|
||||
}
|
||||
|
||||
private void startBtn_Click(object sender, EventArgs e)
|
||||
{
|
||||
//网络检测
|
||||
NetworkUtils.CheckServeStatus(this);
|
||||
cmd.SendMsg(setting.ExecuteCommand);
|
||||
|
||||
startBtn.Enabled = false;
|
||||
endBtn.Enabled = true;
|
||||
}
|
||||
|
||||
private void endBtn_Click(object sender, EventArgs e)
|
||||
{
|
||||
CheckProcessAndKill(setting.ExeFile);
|
||||
cmd.CloseCmd();
|
||||
startBtn.Enabled = true;
|
||||
endBtn.Enabled = false;
|
||||
}
|
||||
|
||||
private void 关于ToolStripMenuItem_Click(object sender, EventArgs e)
|
||||
{
|
||||
AboutBox about = new AboutBox();
|
||||
about.ShowDialog();
|
||||
}
|
||||
|
||||
private void FormMain_Load(object sender, EventArgs e)
|
||||
{
|
||||
//进程检测
|
||||
CheckProcessAndKill(setting.ExeFile);
|
||||
|
||||
//初始化CMD
|
||||
new Thread(new ThreadStart(InitCmd)).Start();
|
||||
|
||||
}
|
||||
|
||||
public void DealMessage(int proId,string message)
|
||||
{
|
||||
if (message.StartsWith("Server failed to allocate tunnel"))
|
||||
{
|
||||
if (message.Contains("address already in use"))
|
||||
{
|
||||
string tcpErr = message.Substring(message.IndexOf("listen tcp"));
|
||||
WriteLog(tcpErr);
|
||||
int domainIndex = message.IndexOf("0.0.0.0:") + 8;
|
||||
int portIndex = message.IndexOf(": bind:");
|
||||
string port = message.Substring(domainIndex, portIndex - domainIndex);
|
||||
MessageBox.Show("通道分配失败,端口:" + port + "已被使用!");
|
||||
}
|
||||
else if (message.Contains("is already registered"))
|
||||
{
|
||||
string tcpErr = message.Substring(message.IndexOf("The tunnel "));
|
||||
WriteLog(tcpErr);
|
||||
int domainIndex = message.IndexOf("http://");
|
||||
int strIndex = message.IndexOf("is already");
|
||||
string domain = message.Substring(domainIndex, strIndex - domainIndex);
|
||||
MessageBox.Show("通道分配失败,域名:" + domain + "已被使用!");
|
||||
}
|
||||
|
||||
CheckProcessAndKill(proId);
|
||||
startBtn.Enabled = true;
|
||||
endBtn.Enabled = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (message.Contains("Microsoft Windows") || message.Contains("Microsoft Corporation") || message.Contains(".exe -config ngrok.cfg start"))
|
||||
return;
|
||||
WriteLog(message);
|
||||
}
|
||||
}
|
||||
|
||||
public void WriteLog(string message)
|
||||
{
|
||||
StringBuilder sb = new StringBuilder(cmdLogTextArea.Text);
|
||||
cmdLogTextArea.Text = sb.AppendLine(DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss ") + message).ToString();
|
||||
cmdLogTextArea.SelectionStart = cmdLogTextArea.Text.Length;
|
||||
cmdLogTextArea.ScrollToCaret();
|
||||
}
|
||||
|
||||
public void cmd_Exited(object sender, EventArgs e)
|
||||
{
|
||||
WriteLog("结束运行!");
|
||||
startBtn.Enabled = true;
|
||||
endBtn.Enabled = false;
|
||||
}
|
||||
|
||||
private void 设置ToolStripMenuItem_Click(object sender, EventArgs e)
|
||||
{
|
||||
setting.ReLoadConfig();
|
||||
setting.ShowDialog();
|
||||
}
|
||||
|
||||
private void 帮助ToolStripMenuItem_Click(object sender, EventArgs e)
|
||||
{
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,200 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<metadata name="menuStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||
<value>17, 17</value>
|
||||
</metadata>
|
||||
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
|
||||
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>
|
||||
AAABAAEAICAAAAEAIACoEAAAFgAAACgAAAAgAAAAQAAAAAEAIAAAAAAAABAAAMMOAADDDgAAAAAAAAAA
|
||||
AAA/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/
|
||||
P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/
|
||||
P/8/Pz//Pj4+/z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/
|
||||
P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/
|
||||
P/8/Pz//Pz8//z8/P/8+Pj7/Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/
|
||||
P/8/Pz//QEBA/0BAQP8/Pz//QUFB/0BAQP8/Pz//QEBA/z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/
|
||||
P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z4+Pv8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/
|
||||
P/8/Pz//Pz8//z8/P/87Ozv/PDw8/0BAQP81NTX/OTk5/0BAQP86Ojr/PT09/z8/P/9AQED/Pz8//z8/
|
||||
P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pj4+/z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/
|
||||
P/8/Pz//Pz8//z4+Pv8+Pj7/Pz8//0dHR/9ERET/Ojo6/3Fxcf9cXFz/Nzc3/0tLS/9FRUX/Pz8//z09
|
||||
Pf8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8+Pj7/Pz8//z8/P/8/Pz//Pz8//z8/
|
||||
P/8/Pz//Pz8//0BAQP9AQED/Pj4+/0FBQf8vLy//ioqK/4mJif8sLCz/qKio/3l5ef8yMjL/ra2t/2ho
|
||||
aP8xMTH/R0dH/z09Pf9BQUH/QEBA/z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z4+Pv8/Pz//Pz8//z8/
|
||||
P/8/Pz//Pz8//z8/P/9AQED/Ozs7/zU1Nf9sbGz/paWl/0JCQv+Ojo7/sbGx/5mZmf+rq6v/p6en/52d
|
||||
nf+3t7f/ZmZm/1tbW/+zs7P/UlJS/zU1Nf88PDz/QEBA/z8/P/8/Pz//Pz8//z8/P/8/Pz//Pj4+/z8/
|
||||
P/8/Pz//Pz8//z8/P/8/Pz//QEBA/zw8PP9SUlL/Pj4+/0NDQ/+0tLT/s7Oz/7e3t/+3t7f/urq6/7Oz
|
||||
s/+1tbX/urq6/7e3t/+2trb/ubm5/5+fn/8uLi7/UlJS/0pKSv89PT3/Pz8//z8/P/8/Pz//Pz8//z8/
|
||||
P/8+Pj7/Pz8//z8/P/8/Pz//Pz8//z8/P/9BQUH/Ojo6/5iYmP+pqan/k5OT/7u7u/+9vb3/r6+v/5qa
|
||||
mv+MjIz/h4eH/4iIiP+QkJD/oqKi/7a2tv+9vb3/tbW1/4qKiv/AwMD/d3d3/zY2Nv9BQUH/Pz8//z8/
|
||||
P/8/Pz//Pz8//z4+Pv8/Pz//Pz8//z8/P/8/Pz//Pz8//zw8PP8vLy//SEhI/8LCwv/IyMj/vb29/5yc
|
||||
nP+EhIT/eHh4/2xsbP9fX1//Y2Nj/3BwcP98fHz/i4uL/6urq//CwsL/zMzM/6Wlpf8wMDD/ODg4/zw8
|
||||
PP9AQED/Pz8//z8/P/8/Pz//Pj4+/z8/P/8/Pz//Pz8//0FBQf82Njb/fn5+/62trf+Wlpb/ycnJ/8HB
|
||||
wf+bm5v/ioqK/25ubv9MTEz/QUFB/zw8PP89PT3/QUFB/1JSUv93d3f/jY2N/62trf/Jycn/wMDA/46O
|
||||
jv+9vb3/XFxc/zo6Ov9AQED/Pz8//z8/P/8+Pj7/Pz8//z8/P/8/Pz//QEBA/zk5Of9GRkb/qqqq/9bW
|
||||
1v/Kysr/q6ur/5SUlP9lZWX/Pj4+/z09Pf8/Pz//QEBA/0BAQP8+Pj7/PT09/0FBQf92dnb/m5ub/7y8
|
||||
vP/Nzc3/1tbW/4qKiv87Ozv/PDw8/0BAQP8/Pz//Pz8//z4+Pv8/Pz//Pz8//0BAQP88PDz/Tk5O/0VF
|
||||
Rf+ZmZn/2dnZ/8HBwf+srKz/rKys/0RERP8vLy//QEBA/0JCQv8/Pz//QEBA/0NDQ/87Ozv/LCws/2tr
|
||||
a/+0tLT/rq6u/83Nzf/U1NT/ZWVl/0tLS/9HR0f/PT09/z8/P/8/Pz//Pj4+/z8/P/8/Pz//QUFB/zU1
|
||||
Nf+UlJT/39/f/9PT0//W1tb/xsbG/7W1tf+tra3/vr6+/3l5ef82Njb/NDQ0/0FBQf89PT3/Ly8v/0tL
|
||||
S/+dnZ3/vLy8/6ioqP+8vLz/zMzM/9bW1v/T09P/39/f/2tra/83Nzf/QUFB/z8/P/8+Pj7/Pz8//z8/
|
||||
P/8/Pz//QEBA/y8vL/96enr/4uLi/9PT0//X19f/mJiY/z09Pf+Dg4P/zc3N/7+/v/9kZGT/NDQ0/z4+
|
||||
Pv+Li4v/09PT/7Kysv9bW1v/TU1N/8TExP/U1NT/29vb/87Ozv9MTEz/Nzc3/0BAQP8/Pz//Pz8//z4+
|
||||
Pv8/Pz//Pz8//z8/P/9CQkL/WVlZ/5ubm//k5OT/2dnZ/+Tk5P96enr/MzMz/zk5Of9MTEz/oKCg/+fn
|
||||
5/+Ojo7/vLy8/9fX1/91dXX/PT09/zo6Ov87Ozv/uLi4/+Pj4//d3d3/1tbW/3l5ef9RUVH/PT09/0BA
|
||||
QP8/Pz//Pj4+/z8/P/9AQED/PT09/0dHR//S0tL/6enp/9/f3//f39//8PDw/3V1df81NTX/Q0ND/zs7
|
||||
O/81NTX/cXFx/8fHx/+tra3/S0tL/zU1Nf8/Pz//QkJC/zc3N/+2trb/7u7u/97e3v/f39//7+/v/6Oj
|
||||
o/82Njb/QUFB/z8/P/8+Pj7/Pz8//z8/P/8/Pz//QkJC/zQ0NP95eXn/7u7u/9/f3//6+vr/iYmJ/zIy
|
||||
Mv9CQkL/QUFB/z8/P/84ODj/4eHh/5KSkv8tLS3/RERE/0BAQP8/Pz//PT09/87Ozv/x8fH/5OTk/9XV
|
||||
1f9FRUX/Pz8//0BAQP8/Pz//Pz8//z4+Pv8/Pz//Pz8//0BAQP89PT3/TExM/6qqqv/t7e3/4ODg//j4
|
||||
+P+4uLj/MzMz/0JCQv8/Pz//Pz8//z4+Pv/d3d3/lpaW/zIyMv9CQkL/QEBA/zo6Ov9UVFT/7u7u/+np
|
||||
6f/l5eX/4+Pj/4SEhP9ERET/Pj4+/z8/P/8/Pz//Pj4+/z8/P/8/Pz//QUFB/zQ0NP+hoaH/3d3d/9/f
|
||||
3//n5+f/5+fn/+zs7P9WVlb/Nzc3/0NDQ/8+Pj7/Ozs7/9nZ2f+SkpL/MTEx/0FBQf9ERET/Li4u/5yc
|
||||
nP/4+Pj/4eHh/+vr6//S0tL/3Nzc/21tbf82Njb/QUFB/z8/P/8+Pj7/Pz8//z8/P/8/Pz//Pj4+/0ZG
|
||||
Rv8oKCj/np6e//X19f/d3d3/6Ojo/729vf83Nzf/Ojo6/0NDQ/88PDz/zs7O/42Njf81NTX/RUVF/y4u
|
||||
Lv9jY2P/5eXl/97e3v/l5eX/7u7u/1hYWP8wMDD/Q0ND/z4+Pv8/Pz//Pz8//z4+Pv8/Pz//Pz8//z8/
|
||||
P/9BQUH/ODg4/2tra//h4eH/9fX1/+np6f/T09P/3Nzc/66urv9ERET/MDAw/zAwMP/BwcH/gICA/ycn
|
||||
J/8zMzP/ampq/9TU1P/V1dX/3d3d/+3t7f/09PT/wsLC/0pKSv88PDz/QEBA/z8/P/8/Pz//Pj4+/z8/
|
||||
P/8/Pz//Pz8//0FBQf81NTX/gYGB/56env+Li4v/7Ozs/+Xl5f/Ly8v/zMzM/8DAwP+BgYH/X19f/8PD
|
||||
w/+ampr/YWFh/6CgoP/Ozs7/xsbG/9jY2P/v7+//0dHR/2tra/+rq6v/VlZW/zo6Ov9AQED/Pz8//z8/
|
||||
P/8+Pj7/Pz8//z8/P/8/Pz//Pz8//0BAQP86Ojr/LCws/2JiYv/x8fH/8/Pz/+rq6v/Ozs7/vr6+/8LC
|
||||
wv/BwcH/urq6/729vf/CwsL/v7+//8HBwf/a2tr/7e3t//j4+P/Ly8v/Ojo6/zIyMv89PT3/QEBA/z8/
|
||||
P/8/Pz//Pz8//z4+Pv8/Pz//Pz8//z8/P/8/Pz//Pz8//0JCQv84ODj/ubm5/7CwsP+MjIz/5ubm/+/v
|
||||
7//i4uL/z8/P/8HBwf/CwsL/vr6+/8bGxv/W1tb/6urq//Hx8f/MzMz/b29v/8/Pz/9/f3//Nzc3/0JC
|
||||
Qv8/Pz//Pz8//z8/P/8/Pz//Pj4+/z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z4+Pv9ISEj/NjY2/1ZW
|
||||
Vv/o6Oj/xsbG/93d3f/p6en/8fHx/+fn5//r6+v/8fHx/+fn5//Nzc3/zs7O/8nJyf8zMzP/QUFB/0JC
|
||||
Qv8+Pj7/Pz8//z8/P/8/Pz//Pz8//z8/P/8+Pj7/Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/
|
||||
P/82Njb/dnZ2/7CwsP8xMTH/p6en/9nZ2f+bm5v/2NjY/7+/v/+enp7/5+fn/2ZmZv9HR0f/t7e3/1BQ
|
||||
UP86Ojr/Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z4+Pv8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/
|
||||
P/8/Pz//Pz8//0BAQP86Ojr/Ozs7/zQ0NP+fn5//kZGR/yAgIP/Kysr/hYWF/yUlJf+2trb/cnJy/zQ0
|
||||
NP86Ojr/PT09/0BAQP8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pj4+/z8/P/8/Pz//Pz8//z8/
|
||||
P/8/Pz//Pz8//z8/P/8/Pz//Pz8//0BAQP9AQED/QEBA/0BAQP9BQUH/Pz8//15eXv9TU1P/PT09/z8/
|
||||
P/8+Pj7/QEBA/0BAQP8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8+Pj7/Pz8//z8/
|
||||
P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pj4+/z8/P/9AQED/OTk5/zs7
|
||||
O/9AQED/Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z4+
|
||||
Pv8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/
|
||||
P/9AQED/QEBA/z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/
|
||||
P/8/Pz//Pj4+/z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/
|
||||
P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/
|
||||
P/8/Pz//Pz8//z8/P/8+Pj7/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
|
||||
</value>
|
||||
</data>
|
||||
</root>
|
|
@ -0,0 +1,60 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using YamlDotNet.Serialization;
|
||||
|
||||
namespace Ultron.Ngrok.Model
|
||||
{
|
||||
public class Config
|
||||
{
|
||||
[YamlMember(Alias = "http_proxy")]
|
||||
public string HttpProxy { get; set; }
|
||||
|
||||
[YamlMember(Alias = "server_addr")]
|
||||
public string ServerAddr { get; set; }
|
||||
|
||||
[YamlMember(Alias = "inspect_addr")]
|
||||
public string InspectAddr { get; set; }
|
||||
|
||||
[YamlMember(Alias = "trust_host_root_certs")]
|
||||
public bool TrustHostRootCerts { get; set; }
|
||||
|
||||
[YamlMember(Alias = "version")]
|
||||
public string Version { get; set; }
|
||||
|
||||
[YamlMember(Alias = "auth_token")]
|
||||
public string AuthToken { get; set; }
|
||||
|
||||
[YamlMember(Alias = "tunnels")]
|
||||
public Dictionary<string, Tunnel> Tunnels { get; set; }
|
||||
}
|
||||
|
||||
public class Tunnel
|
||||
{
|
||||
[YamlMember(Alias = "tunnel_id")]
|
||||
public string TunnelID { get; set; }
|
||||
|
||||
[YamlMember(Alias = "tunnel_name")]
|
||||
public string TunnelName { get; set; }
|
||||
|
||||
[YamlMember(Alias = "subdomain")]
|
||||
public string SubDomain { get; set; }
|
||||
|
||||
[YamlMember(Alias = "hostname")]
|
||||
public string HostName { get; set; }
|
||||
|
||||
[YamlMember(Alias = "proto")]
|
||||
public Dictionary<string, string> Proto { get; set; }
|
||||
|
||||
[YamlMember(Alias = "auth")]
|
||||
public string Auth { get; set; }
|
||||
|
||||
[YamlMember(Alias = "remote_port")]
|
||||
public int RemotePort { get; set; }
|
||||
|
||||
[YamlMember(Alias = "enable")]
|
||||
public bool Enable { get; set; }
|
||||
}
|
||||
}
|
|
@ -0,0 +1,22 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows.Forms;
|
||||
|
||||
namespace Ultron.Ngrok
|
||||
{
|
||||
static class Program
|
||||
{
|
||||
/// <summary>
|
||||
/// 应用程序的主入口点。
|
||||
/// </summary>
|
||||
[STAThread]
|
||||
static void Main()
|
||||
{
|
||||
Application.EnableVisualStyles();
|
||||
Application.SetCompatibleTextRenderingDefault(false);
|
||||
Application.Run(new FormMain());
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,36 @@
|
|||
using System.Reflection;
|
||||
using System.Runtime.CompilerServices;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
// 有关程序集的常规信息通过以下
|
||||
// 特性集控制。更改这些特性值可修改
|
||||
// 与程序集关联的信息。
|
||||
[assembly: AssemblyTitle("Ultron.Ngrok")]
|
||||
[assembly: AssemblyDescription("内网穿透工具")]
|
||||
[assembly: AssemblyConfiguration("")]
|
||||
[assembly: AssemblyCompany("")]
|
||||
[assembly: AssemblyProduct("Ultron.Ngrok")]
|
||||
[assembly: AssemblyCopyright("Copyright © WangYu 2019")]
|
||||
[assembly: AssemblyTrademark("")]
|
||||
[assembly: AssemblyCulture("")]
|
||||
|
||||
// 将 ComVisible 设置为 false 使此程序集中的类型
|
||||
// 对 COM 组件不可见。 如果需要从 COM 访问此程序集中的类型,
|
||||
// 则将该类型上的 ComVisible 特性设置为 true。
|
||||
[assembly: ComVisible(false)]
|
||||
|
||||
// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID
|
||||
[assembly: Guid("84c08c82-cabc-46af-b99a-7057abbc994d")]
|
||||
|
||||
// 程序集的版本信息由下面四个值组成:
|
||||
//
|
||||
// 主版本
|
||||
// 次版本
|
||||
// 生成号
|
||||
// 修订号
|
||||
//
|
||||
// 可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值,
|
||||
// 方法是按如下所示使用“*”:
|
||||
// [assembly: AssemblyVersion("1.0.*")]
|
||||
[assembly: AssemblyVersion("1.0.0.0")]
|
||||
[assembly: AssemblyFileVersion("1.0.0.0")]
|
|
@ -0,0 +1,93 @@
|
|||
//------------------------------------------------------------------------------
|
||||
// <auto-generated>
|
||||
// 此代码由工具生成。
|
||||
// 运行时版本:4.0.30319.42000
|
||||
//
|
||||
// 对此文件的更改可能会导致不正确的行为,并且如果
|
||||
// 重新生成代码,这些更改将会丢失。
|
||||
// </auto-generated>
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
namespace Ultron.Ngrok.Properties {
|
||||
using System;
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 一个强类型的资源类,用于查找本地化的字符串等。
|
||||
/// </summary>
|
||||
// 此类是由 StronglyTypedResourceBuilder
|
||||
// 类通过类似于 ResGen 或 Visual Studio 的工具自动生成的。
|
||||
// 若要添加或移除成员,请编辑 .ResX 文件,然后重新运行 ResGen
|
||||
// (以 /str 作为命令选项),或重新生成 VS 项目。
|
||||
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
|
||||
internal class Resources {
|
||||
|
||||
private static global::System.Resources.ResourceManager resourceMan;
|
||||
|
||||
private static global::System.Globalization.CultureInfo resourceCulture;
|
||||
|
||||
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
|
||||
internal Resources() {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 返回此类使用的缓存的 ResourceManager 实例。
|
||||
/// </summary>
|
||||
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
|
||||
internal static global::System.Resources.ResourceManager ResourceManager {
|
||||
get {
|
||||
if (object.ReferenceEquals(resourceMan, null)) {
|
||||
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Ultron.Ngrok.Properties.Resources", typeof(Resources).Assembly);
|
||||
resourceMan = temp;
|
||||
}
|
||||
return resourceMan;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 使用此强类型资源类,为所有资源查找
|
||||
/// 重写当前线程的 CurrentUICulture 属性。
|
||||
/// </summary>
|
||||
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
|
||||
internal static global::System.Globalization.CultureInfo Culture {
|
||||
get {
|
||||
return resourceCulture;
|
||||
}
|
||||
set {
|
||||
resourceCulture = value;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找 System.Byte[] 类型的本地化资源。
|
||||
/// </summary>
|
||||
internal static byte[] ngrok_x64 {
|
||||
get {
|
||||
object obj = ResourceManager.GetObject("ngrok_x64", resourceCulture);
|
||||
return ((byte[])(obj));
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找 System.Byte[] 类型的本地化资源。
|
||||
/// </summary>
|
||||
internal static byte[] ngrok_x86 {
|
||||
get {
|
||||
object obj = ResourceManager.GetObject("ngrok_x86", resourceCulture);
|
||||
return ((byte[])(obj));
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找 System.Byte[] 类型的本地化资源。
|
||||
/// </summary>
|
||||
internal static byte[] YamlDotNet {
|
||||
get {
|
||||
object obj = ResourceManager.GetObject("YamlDotNet", resourceCulture);
|
||||
return ((byte[])(obj));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,130 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
|
||||
<data name="ngrok_x64" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>..\Resources\ngrok_x64.exe;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</data>
|
||||
<data name="ngrok_x86" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>..\Resources\ngrok_x86.exe;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</data>
|
||||
<data name="YamlDotNet" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>..\Resources\YamlDotNet.dll;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</data>
|
||||
</root>
|
|
@ -0,0 +1,30 @@
|
|||
//------------------------------------------------------------------------------
|
||||
// <auto-generated>
|
||||
// This code was generated by a tool.
|
||||
// Runtime Version:4.0.30319.42000
|
||||
//
|
||||
// Changes to this file may cause incorrect behavior and will be lost if
|
||||
// the code is regenerated.
|
||||
// </auto-generated>
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
namespace Ultron.Ngrok.Properties
|
||||
{
|
||||
|
||||
|
||||
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
|
||||
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")]
|
||||
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase
|
||||
{
|
||||
|
||||
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
|
||||
|
||||
public static Settings Default
|
||||
{
|
||||
get
|
||||
{
|
||||
return defaultInstance;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,7 @@
|
|||
<?xml version='1.0' encoding='utf-8'?>
|
||||
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)">
|
||||
<Profiles>
|
||||
<Profile Name="(Default)" />
|
||||
</Profiles>
|
||||
<Settings />
|
||||
</SettingsFile>
|
Binary file not shown.
Binary file not shown.
After Width: | Height: | Size: 9.4 KiB |
Binary file not shown.
Binary file not shown.
|
@ -0,0 +1,162 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
|
||||
<PropertyGroup>
|
||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||
<ProjectGuid>{D44A2DC3-FADD-47E7-A311-35C4B3404DFF}</ProjectGuid>
|
||||
<OutputType>WinExe</OutputType>
|
||||
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||
<RootNamespace>Ultron.Ngrok</RootNamespace>
|
||||
<AssemblyName>uNgrok</AssemblyName>
|
||||
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
|
||||
<FileAlignment>512</FileAlignment>
|
||||
<IsWebBootstrapper>false</IsWebBootstrapper>
|
||||
<PublishUrl>发布\</PublishUrl>
|
||||
<Install>true</Install>
|
||||
<InstallFrom>Disk</InstallFrom>
|
||||
<UpdateEnabled>false</UpdateEnabled>
|
||||
<UpdateMode>Foreground</UpdateMode>
|
||||
<UpdateInterval>7</UpdateInterval>
|
||||
<UpdateIntervalUnits>Days</UpdateIntervalUnits>
|
||||
<UpdatePeriodically>false</UpdatePeriodically>
|
||||
<UpdateRequired>false</UpdateRequired>
|
||||
<MapFileExtensions>true</MapFileExtensions>
|
||||
<ApplicationRevision>0</ApplicationRevision>
|
||||
<ApplicationVersion>1.0.0.%2a</ApplicationVersion>
|
||||
<UseApplicationTrust>false</UseApplicationTrust>
|
||||
<BootstrapperEnabled>true</BootstrapperEnabled>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||
<PlatformTarget>AnyCPU</PlatformTarget>
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
<DebugType>full</DebugType>
|
||||
<Optimize>false</Optimize>
|
||||
<OutputPath>bin\Debug\</OutputPath>
|
||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||
<PlatformTarget>AnyCPU</PlatformTarget>
|
||||
<DebugType>pdbonly</DebugType>
|
||||
<Optimize>true</Optimize>
|
||||
<OutputPath>bin\Release\</OutputPath>
|
||||
<DefineConstants>TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup>
|
||||
<ApplicationIcon>Resources\icon.ico</ApplicationIcon>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="System" />
|
||||
<Reference Include="System.Core" />
|
||||
<Reference Include="System.Xml.Linq" />
|
||||
<Reference Include="System.Data.DataSetExtensions" />
|
||||
<Reference Include="Microsoft.CSharp" />
|
||||
<Reference Include="System.Data" />
|
||||
<Reference Include="System.Deployment" />
|
||||
<Reference Include="System.Drawing" />
|
||||
<Reference Include="System.Windows.Forms" />
|
||||
<Reference Include="System.Xml" />
|
||||
<Reference Include="YamlDotNet, Version=3.8.0.0, Culture=neutral, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\YamlDotNet.3.8.0\lib\net35\YamlDotNet.dll</HintPath>
|
||||
<Private>True</Private>
|
||||
<EmbedInteropTypes>False</EmbedInteropTypes>
|
||||
</Reference>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="Form\AboutBox.cs">
|
||||
<SubType>Form</SubType>
|
||||
</Compile>
|
||||
<Compile Include="Form\AboutBox.Designer.cs">
|
||||
<DependentUpon>AboutBox.cs</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="FormMain.cs">
|
||||
<SubType>Form</SubType>
|
||||
</Compile>
|
||||
<Compile Include="FormMain.Designer.cs">
|
||||
<DependentUpon>FormMain.cs</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Model\Config.cs" />
|
||||
<Compile Include="Program.cs" />
|
||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||
<Compile Include="Form\SettingForm.cs">
|
||||
<SubType>Form</SubType>
|
||||
</Compile>
|
||||
<Compile Include="Form\SettingForm.Designer.cs">
|
||||
<DependentUpon>SettingForm.cs</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Utils\CmdUtils.cs" />
|
||||
<Compile Include="Utils\NetworkUtils.cs" />
|
||||
<EmbeddedResource Include="Form\AboutBox.resx">
|
||||
<DependentUpon>AboutBox.cs</DependentUpon>
|
||||
</EmbeddedResource>
|
||||
<EmbeddedResource Include="FormMain.resx">
|
||||
<DependentUpon>FormMain.cs</DependentUpon>
|
||||
</EmbeddedResource>
|
||||
<EmbeddedResource Include="Properties\Resources.resx">
|
||||
<Generator>ResXFileCodeGenerator</Generator>
|
||||
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
|
||||
<SubType>Designer</SubType>
|
||||
</EmbeddedResource>
|
||||
<Compile Include="Properties\Resources.Designer.cs">
|
||||
<AutoGen>True</AutoGen>
|
||||
<DependentUpon>Resources.resx</DependentUpon>
|
||||
<DesignTime>True</DesignTime>
|
||||
</Compile>
|
||||
<EmbeddedResource Include="Form\SettingForm.resx">
|
||||
<DependentUpon>SettingForm.cs</DependentUpon>
|
||||
</EmbeddedResource>
|
||||
<None Include="Properties\Settings.settings">
|
||||
<Generator>SettingsSingleFileGenerator</Generator>
|
||||
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
|
||||
</None>
|
||||
<Compile Include="Properties\Settings.Designer.cs">
|
||||
<AutoGen>True</AutoGen>
|
||||
<DependentUpon>Settings.settings</DependentUpon>
|
||||
<DesignTimeSharedInput>True</DesignTimeSharedInput>
|
||||
</Compile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="App.config" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="Resources\ngrok_x64.exe" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="Resources\ngrok_x86.exe" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<BootstrapperPackage Include=".NETFramework,Version=v4.5">
|
||||
<Visible>False</Visible>
|
||||
<ProductName>Microsoft .NET Framework 4.5 %28x86 和 x64%29</ProductName>
|
||||
<Install>true</Install>
|
||||
</BootstrapperPackage>
|
||||
<BootstrapperPackage Include="Microsoft.Net.Client.3.5">
|
||||
<Visible>False</Visible>
|
||||
<ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
|
||||
<Install>false</Install>
|
||||
</BootstrapperPackage>
|
||||
<BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
|
||||
<Visible>False</Visible>
|
||||
<ProductName>.NET Framework 3.5 SP1</ProductName>
|
||||
<Install>false</Install>
|
||||
</BootstrapperPackage>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="Resources\YamlDotNet.dll" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Content Include="Resources\icon.ico" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||
Other similar extension points exist, see Microsoft.Common.targets.
|
||||
<Target Name="BeforeBuild">
|
||||
</Target>
|
||||
<Target Name="AfterBuild">
|
||||
</Target>
|
||||
-->
|
||||
</Project>
|
|
@ -0,0 +1,14 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup>
|
||||
<PublishUrlHistory>发布\</PublishUrlHistory>
|
||||
<InstallUrlHistory />
|
||||
<SupportUrlHistory />
|
||||
<UpdateUrlHistory />
|
||||
<BootstrapperUrlHistory />
|
||||
<ErrorReportUrlHistory />
|
||||
<FallbackCulture>zh-CN</FallbackCulture>
|
||||
<VerifyUploadedFiles>false</VerifyUploadedFiles>
|
||||
<ProjectView>ProjectFiles</ProjectView>
|
||||
</PropertyGroup>
|
||||
</Project>
|
|
@ -0,0 +1,100 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows.Forms;
|
||||
|
||||
namespace Ultron.Ngrok.Utils
|
||||
{
|
||||
public class CmdUtils
|
||||
{
|
||||
public delegate void ProcessInfomation(int id, string message);
|
||||
|
||||
public event ProcessInfomation ProcessMessageEvent;
|
||||
public event EventHandler ProcessKilled;
|
||||
|
||||
Process cmd = new Process();
|
||||
|
||||
public bool IsInited = false;
|
||||
|
||||
public CmdUtils()
|
||||
{
|
||||
Control.CheckForIllegalCrossThreadCalls = false;
|
||||
|
||||
}
|
||||
|
||||
public void Init()
|
||||
{
|
||||
cmd = new Process();//创建进程对象
|
||||
ProcessStartInfo startInfo = new ProcessStartInfo();
|
||||
startInfo.FileName = "cmd.exe";//设定需要执行的命令
|
||||
startInfo.Arguments = "";//“/C”表示执行完命令后马上退出
|
||||
startInfo.UseShellExecute = false;//不使用系统外壳程序启动
|
||||
startInfo.RedirectStandardInput = true;//不重定向输入
|
||||
startInfo.RedirectStandardOutput = true; //重定向输出
|
||||
startInfo.CreateNoWindow = false;//不创建窗口
|
||||
|
||||
cmd.StartInfo = startInfo;
|
||||
|
||||
cmd.EnableRaisingEvents = true;
|
||||
|
||||
cmd.OutputDataReceived -= new DataReceivedEventHandler(OutputHandler);
|
||||
cmd.OutputDataReceived += new DataReceivedEventHandler(OutputHandler);
|
||||
cmd.Exited += ProcessKilled;
|
||||
|
||||
cmd.Start();
|
||||
cmd.BeginOutputReadLine();
|
||||
}
|
||||
|
||||
void cmd_Exited(object sender, EventArgs e)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
private void OutputHandler(object sender, DataReceivedEventArgs e)
|
||||
{
|
||||
if (!String.IsNullOrEmpty(e.Data))
|
||||
{
|
||||
ProcessMessageEvent(cmd.Id, e.Data);
|
||||
}
|
||||
}
|
||||
|
||||
public void SendMsg(string cmdStr)
|
||||
{
|
||||
ProcessMessageEvent(0, "开始运行...");
|
||||
if (!IsInited || cmd.HasExited)
|
||||
{
|
||||
cmd = new Process();//创建进程对象
|
||||
ProcessStartInfo startInfo = new ProcessStartInfo();
|
||||
startInfo.FileName = "cmd.exe";//设定需要执行的命令
|
||||
startInfo.Arguments = "";//“/C”表示执行完命令后马上退出
|
||||
startInfo.UseShellExecute = false;//不使用系统外壳程序启动
|
||||
startInfo.RedirectStandardInput = true;//不重定向输入
|
||||
startInfo.RedirectStandardOutput = true; //重定向输出
|
||||
startInfo.CreateNoWindow = false;//不创建窗口
|
||||
|
||||
cmd.StartInfo = startInfo;
|
||||
|
||||
cmd.EnableRaisingEvents = true;
|
||||
|
||||
cmd.OutputDataReceived -= new DataReceivedEventHandler(OutputHandler);
|
||||
cmd.OutputDataReceived += new DataReceivedEventHandler(OutputHandler);
|
||||
|
||||
cmd.Exited += ProcessKilled;
|
||||
cmd.Start();
|
||||
cmd.BeginOutputReadLine();
|
||||
|
||||
IsInited = true;
|
||||
}
|
||||
cmd.StandardInput.WriteLine(cmdStr);
|
||||
}
|
||||
|
||||
public void CloseCmd()
|
||||
{
|
||||
if (cmd != null && !cmd.HasExited)
|
||||
cmd.Kill() ;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,135 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Net.NetworkInformation;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows.Forms;
|
||||
|
||||
namespace Ultron.Ngrok.Utils
|
||||
{
|
||||
public class NetworkUtils
|
||||
{
|
||||
|
||||
public static string url = "www.baidu.com;www.sina.com;www.163.com;ngrok.aaqbee.com";
|
||||
|
||||
public static string[] urls = url.Split(new char[] { ';' });
|
||||
|
||||
public static FormMain fm = null;
|
||||
|
||||
public static void RwiteLog(string message)
|
||||
{
|
||||
StringBuilder sb = new StringBuilder(NetworkUtils.fm.cmdLogTextArea.Text);
|
||||
NetworkUtils.fm.cmdLogTextArea.Text = sb.AppendLine(message).ToString();
|
||||
NetworkUtils.fm.cmdLogTextArea.SelectionStart = fm.cmdLogTextArea.Text.Length;
|
||||
NetworkUtils.fm.cmdLogTextArea.ScrollToCaret();
|
||||
}
|
||||
/// <summary>
|
||||
/// 检测网络连接状态
|
||||
/// </summary>
|
||||
/// <param name="urls"></param>
|
||||
public static void CheckServeStatus(FormMain form)
|
||||
{
|
||||
Control.CheckForIllegalCrossThreadCalls = false;
|
||||
|
||||
NetworkUtils.fm = form;
|
||||
|
||||
int errCount = 0;//ping时连接失败个数
|
||||
|
||||
NetworkUtils.RwiteLog("开始检测网络...");
|
||||
|
||||
string checkMsg = string.Empty;
|
||||
|
||||
if (!LocalConnectionStatus())
|
||||
{
|
||||
checkMsg = "网络异常--无连接";
|
||||
}
|
||||
else if (!MyPing(urls, out errCount))
|
||||
{
|
||||
if ((double)errCount / urls.Length >= 0.3)
|
||||
{
|
||||
checkMsg = "网络异常--连接多次无响应";
|
||||
}
|
||||
else
|
||||
{
|
||||
checkMsg = "网络不稳定";
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
checkMsg = "网络正常";
|
||||
}
|
||||
NetworkUtils.RwiteLog(checkMsg);
|
||||
NetworkUtils.RwiteLog("网络检测结束...");
|
||||
}
|
||||
|
||||
private const int INTERNET_CONNECTION_MODEM = 1;
|
||||
private const int INTERNET_CONNECTION_LAN = 2;
|
||||
|
||||
|
||||
[System.Runtime.InteropServices.DllImport("winInet.dll")]
|
||||
private static extern bool InternetGetConnectedState(ref int dwFlag, int dwReserved);
|
||||
/// <summary>
|
||||
/// 判断本地的连接状态
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
private static bool LocalConnectionStatus()
|
||||
{
|
||||
System.Int32 dwFlag = new Int32();
|
||||
if (!InternetGetConnectedState(ref dwFlag, 0))
|
||||
{
|
||||
NetworkUtils.RwiteLog("本地连接状态--未连网!");
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ((dwFlag & INTERNET_CONNECTION_MODEM) != 0)
|
||||
{
|
||||
//NetworkUtils.RwiteLog("本地连接状态--采用调制解调器上网。");
|
||||
return true;
|
||||
}
|
||||
else if ((dwFlag & INTERNET_CONNECTION_LAN) != 0)
|
||||
{
|
||||
//NetworkUtils.RwiteLog("本地连接状态--采用网卡上网。");
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Ping命令检测网络是否畅通
|
||||
/// </summary>
|
||||
/// <param name="urls">URL数据</param>
|
||||
/// <param name="errorCount">ping时连接失败个数</param>
|
||||
/// <returns></returns>
|
||||
public static bool MyPing(string[] urls, out int errorCount)
|
||||
{
|
||||
bool isconn = true;
|
||||
Ping ping = new Ping();
|
||||
errorCount = 0;
|
||||
try
|
||||
{
|
||||
PingReply pr;
|
||||
for (int i = 0; i < urls.Length; i++)
|
||||
{
|
||||
pr = ping.Send(urls[i]);
|
||||
if (pr.Status != IPStatus.Success)
|
||||
{
|
||||
isconn = false;
|
||||
errorCount++;
|
||||
}
|
||||
//NetworkUtils.RwiteLog("Ping " + urls[i] + " " + pr.Status.ToString());
|
||||
}
|
||||
}
|
||||
catch
|
||||
{
|
||||
isconn = false;
|
||||
errorCount = urls.Length;
|
||||
}
|
||||
//if (errorCount > 0 && errorCount < 3)
|
||||
// isconn = true;
|
||||
return isconn;
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue