ソースを参照

工具类调整CMD工具类,添加读取进程CPU占用,添加获取进程实例方法。Oreo工具组中,新增Java发布工具,用于管理Java服务的发布(工作用,尚未完成,持续更新中...)

yuzhengyang 8 年 前
コミット
e12b350cab
34 ファイル変更1548 行追加13 行削除
  1. BIN
      Fork.Net/.vs/Fork.Net/v15/Server/sqlite3/storage.ide
  2. BIN
      Fork.Net/.vs/Fork.Net/v15/sqlite3/storage.ide
  3. 50 1
      Fork.Net/Azylee.Utils/Azylee.Core/AppUtils/AppInfoTool.cs
  4. 1 0
      Fork.Net/Azylee.Utils/Azylee.Core/Azylee.Core.csproj
  5. 1 0
      Fork.Net/Azylee.Utils/Azylee.Core/IOUtils/DirUtils/DirTool.cs
  6. 35 4
      Fork.Net/Azylee.Utils/Azylee.Core/ProcessUtils/ProcessTool.cs
  7. 79 0
      Fork.Net/Azylee.Utils/Azylee.Core/WindowsUtils/APIUtils/ExplorerAPI.cs
  8. 5 5
      Fork.Net/Azylee.Utils/Azylee.Core/WindowsUtils/CMDUtils/CMDNetstatTool.cs
  9. 5 2
      Fork.Net/Azylee.Utils/Azylee.Core/WindowsUtils/CMDUtils/CMDProcessTool.cs
  10. 22 0
      Fork.Net/Fork.Net.sln
  11. 11 0
      Fork.Net/Oreo.Plugins/Oreo.BigBirdDeployer/Commons/R.cs
  12. 4 0
      Fork.Net/Oreo.Plugins/Oreo.BigBirdDeployer/FodyWeavers.xml
  13. 43 0
      Fork.Net/Oreo.Plugins/Oreo.BigBirdDeployer/Models/ProjectModel.cs
  14. 23 0
      Fork.Net/Oreo.Plugins/Oreo.BigBirdDeployer/Models/VersionModel.cs
  15. 20 0
      Fork.Net/Oreo.Plugins/Oreo.BigBirdDeployer/Models/WorkStatus.cs
  16. 138 0
      Fork.Net/Oreo.Plugins/Oreo.BigBirdDeployer/Oreo.BigBirdDeployer.csproj
  17. 26 0
      Fork.Net/Oreo.Plugins/Oreo.BigBirdDeployer/Program.cs
  18. 36 0
      Fork.Net/Oreo.Plugins/Oreo.BigBirdDeployer/Properties/AssemblyInfo.cs
  19. 71 0
      Fork.Net/Oreo.Plugins/Oreo.BigBirdDeployer/Properties/Resources.Designer.cs
  20. 117 0
      Fork.Net/Oreo.Plugins/Oreo.BigBirdDeployer/Properties/Resources.resx
  21. 30 0
      Fork.Net/Oreo.Plugins/Oreo.BigBirdDeployer/Properties/Settings.Designer.cs
  22. 7 0
      Fork.Net/Oreo.Plugins/Oreo.BigBirdDeployer/Properties/Settings.settings
  23. 41 0
      Fork.Net/Oreo.Plugins/Oreo.BigBirdDeployer/Utils/ConsoleCodeTool.cs
  24. 107 0
      Fork.Net/Oreo.Plugins/Oreo.BigBirdDeployer/Views/MainForm.Designer.cs
  25. 41 0
      Fork.Net/Oreo.Plugins/Oreo.BigBirdDeployer/Views/MainForm.cs
  26. 120 0
      Fork.Net/Oreo.Plugins/Oreo.BigBirdDeployer/Views/MainForm.resx
  27. 201 0
      Fork.Net/Oreo.Plugins/Oreo.BigBirdDeployer/Views/ProjectConfigForm.Designer.cs
  28. 64 0
      Fork.Net/Oreo.Plugins/Oreo.BigBirdDeployer/Views/ProjectConfigForm.cs
  29. 120 0
      Fork.Net/Oreo.Plugins/Oreo.BigBirdDeployer/Views/ProjectConfigForm.resx
  30. 5 0
      Fork.Net/Oreo.Plugins/Oreo.BigBirdDeployer/packages.config
  31. 1 1
      Fork.Net/Test/Test.CmdTool/Form1.cs
  32. 41 0
      Fork.Net/Test/Test.CpuTime/Program.cs
  33. 36 0
      Fork.Net/Test/Test.CpuTime/Properties/AssemblyInfo.cs
  34. 47 0
      Fork.Net/Test/Test.CpuTime/Test.CpuTime.csproj

BIN
Fork.Net/.vs/Fork.Net/v15/Server/sqlite3/storage.ide


BIN
Fork.Net/.vs/Fork.Net/v15/sqlite3/storage.ide


+ 50 - 1
Fork.Net/Azylee.Utils/Azylee.Core/AppUtils/AppInfoTool.cs

@@ -1,4 +1,5 @@
-using System;
+using Azylee.Core.ProcessUtils;
+using System;
 using System.Collections.Generic;
 using System.Diagnostics;
 using System.Linq;
@@ -25,6 +26,43 @@ namespace Azylee.Core.AppUtils
             return processor;
         }
         /// <summary>
+        /// 读取进程CPU使用率(同名进程无法支持)
+        /// </summary>
+        /// <param name="p"></param>
+        /// <returns></returns>
+        [Obsolete]
+        public static PerformanceCounter Processor(Process p)
+        {
+            PerformanceCounter processor = null;
+            try
+            {
+                string name = ProcessTool.GetInstanceNameById(p.Id);
+                if (!string.IsNullOrWhiteSpace(name))
+                {
+                    processor = new PerformanceCounter("Process", "% Processor Time", name);
+                }
+            }
+            catch { }
+            return processor;
+        }
+        /// <summary>
+        /// 计算CPU占用率
+        /// </summary>
+        /// <param name="process"></param>
+        /// <param name="begin"></param>
+        /// <param name="end"></param>
+        /// <param name="interval"></param>
+        /// <returns></returns>
+        public static double CalcCpuRate(Process process, TimeSpan begin, int interval)
+        {
+            //当前时间
+            var current = process.TotalProcessorTime;
+            //间隔时间内的CPU运行时间除以逻辑CPU数量
+            double value = (current - begin).TotalMilliseconds / interval / Environment.ProcessorCount * 100;
+            if (value < 0 || 100 < value) return 0;
+            return value;
+        }
+        /// <summary>
         /// 读取APP占用内存(单位:KB)
         /// </summary>
         /// <returns></returns>
@@ -41,5 +79,16 @@ namespace Azylee.Core.AppUtils
             finally { p?.Dispose(); }
             return value;
         }
+        public static long RAM(Process p)
+        {
+            long value = 0;
+            try
+            {
+                value = p.WorkingSet64 / 1024;
+            }
+            catch { }
+            finally { p?.Dispose(); }
+            return value;
+        }
     }
 }

+ 1 - 0
Fork.Net/Azylee.Utils/Azylee.Core/Azylee.Core.csproj

@@ -88,6 +88,7 @@
     <Compile Include="TaskUtils\TaskSupport.cs" />
     <Compile Include="VersionUtils\VersionTool.cs" />
     <Compile Include="WindowsUtils\APIUtils\ApplicationAPI.cs" />
+    <Compile Include="WindowsUtils\APIUtils\ExplorerAPI.cs" />
     <Compile Include="WindowsUtils\APIUtils\PermissionAPI.cs" />
     <Compile Include="WindowsUtils\APIUtils\SystemSleepAPI.cs" />
     <Compile Include="WindowsUtils\APIUtils\WindowsAPI.cs" />

+ 1 - 0
Fork.Net/Azylee.Utils/Azylee.Core/IOUtils/DirUtils/DirTool.cs

@@ -9,6 +9,7 @@ using Azylee.Core.DataUtils.CollectionUtils;
 using Azylee.Core.DataUtils.StringUtils;
 using System;
 using System.Collections.Generic;
+using System.Diagnostics;
 using System.IO;
 using System.Linq;
 using System.Text;

+ 35 - 4
Fork.Net/Azylee.Utils/Azylee.Core/ProcessUtils/ProcessTool.cs

@@ -1,7 +1,7 @@
 //************************************************************************
 //      https://github.com/yuzhengyang
 //      author:     yuzhengyang
-//      date:       2017.10.12 - 2018.4.27
+//      date:       2017.10.12 - 2018.5.02
 //      desc:       进程工具
 //      Copyright (c) yuzhengyang. All rights reserved.
 //************************************************************************
@@ -48,9 +48,9 @@ namespace Azylee.Core.ProcessUtils
             return false;
         }
         /// <summary>
-         /// 启动进程(定制启动配置)
-         /// </summary>
-         /// <param name="args"></param>
+        /// 启动进程(定制启动配置)
+        /// </summary>
+        /// <param name="args"></param>
         public static bool StartCustom(string file, string args = "")
         {
             try
@@ -116,5 +116,36 @@ namespace Azylee.Core.ProcessUtils
                 }
             }
         }
+
+        /// <summary>
+        /// 根据PID获取InstanceName(不要用于性能计数器,#1..实例名会自动改变)
+        /// </summary>
+        /// <param name="id"></param>
+        /// <returns></returns>
+        public static string GetInstanceNameById(int id)
+        {
+            try
+            {
+                PerformanceCounterCategory cat = new PerformanceCounterCategory("Process");
+                string[] instances = cat.GetInstanceNames();
+                foreach (string instance in instances)
+                {
+                    try
+                    {
+                        using (PerformanceCounter cnt = new PerformanceCounter("Process", "ID Process", instance, true))
+                        {
+                            int val = (int)cnt.RawValue;
+                            if (val == id)
+                            {
+                                return instance;
+                            }
+                        }
+                    }
+                    catch { }
+                }
+            }
+            catch { }
+            return null;
+        }
     }
 }

+ 79 - 0
Fork.Net/Azylee.Utils/Azylee.Core/WindowsUtils/APIUtils/ExplorerAPI.cs

@@ -0,0 +1,79 @@
+//************************************************************************
+//      https://github.com/yuzhengyang
+//      author:     yuzhengyang
+//      date:       2018.4.27 - 2018.4.27
+//      desc:       Explorer工具类
+//      Copyright (c) yuzhengyang. All rights reserved.
+//      Quote:      https://www.cnblogs.com/crwy/p/SHOpenFolderAndSelectItems.html
+//************************************************************************
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.IO;
+using System.Linq;
+using System.Runtime.InteropServices;
+using System.Text;
+
+namespace Azylee.Core.WindowsUtils.APIUtils
+{
+    public class ExplorerAPI
+    {
+        /// <summary>
+        /// 打开文件夹
+        /// </summary>
+        /// <param name="path"></param>
+        /// <returns></returns>
+        public static bool Open(string path)
+        {
+            try
+            {
+                if (Directory.Exists(path))
+                {
+                    Process.Start(@"explorer.exe", "/select,\"" + path + "\"");
+                    return true;
+                }
+            }
+            catch { }
+            return false;
+        }
+
+        /// <summary>
+        /// 打开路径并定位文件...
+        /// 对于@"h:\Bleacher Report - Hardaway with the safe call ??.mp4"
+        /// 这样的,explorer.exe /select,d:xxx不认,用API整它
+        /// </summary>
+        /// <param name="filePath">文件绝对路径</param>
+        [DllImport("shell32.dll", ExactSpelling = true)]
+        private static extern void ILFree(IntPtr pidlList);
+
+        [DllImport("shell32.dll", CharSet = CharSet.Unicode, ExactSpelling = true)]
+        private static extern IntPtr ILCreateFromPathW(string pszPath);
+
+        [DllImport("shell32.dll", ExactSpelling = true)]
+        private static extern int SHOpenFolderAndSelectItems(IntPtr pidlList, uint cild, IntPtr children, uint dwFlags);
+
+        public static void ExplorerFile(string filePath)
+        {
+            if (!File.Exists(filePath) && !Directory.Exists(filePath))
+                return;
+
+            if (Directory.Exists(filePath))
+                Process.Start(@"explorer.exe", "/select,\"" + filePath + "\"");
+            else
+            {
+                IntPtr pidlList = ILCreateFromPathW(filePath);
+                if (pidlList != IntPtr.Zero)
+                {
+                    try
+                    {
+                        Marshal.ThrowExceptionForHR(SHOpenFolderAndSelectItems(pidlList, 0, IntPtr.Zero, 0));
+                    }
+                    finally
+                    {
+                        ILFree(pidlList);
+                    }
+                }
+            }
+        }
+    }
+}

+ 5 - 5
Fork.Net/Azylee.Utils/Azylee.Core/WindowsUtils/CMDUtils/CMDNetstatTool.cs

@@ -17,10 +17,10 @@ namespace Azylee.Core.WindowsUtils.CMDUtils
     public class CMDNetstatTool
     {
         /// <summary>
-        /// 根据端口号查询列表(item1:端口、item2:pid)
+        /// 根据端口号查询列表,过滤pid0(item1:端口、item2:pid)
         /// </summary>
-        /// <param name="port"></param>
-        /// <param name="fuzzy"></param>
+        /// <param name="port">端口号</param>
+        /// <param name="fuzzy">模糊匹配</param>
         /// <returns></returns>
         public static List<Tuple<int, int>> FindByPort(int port, bool fuzzy = true)
         {
@@ -31,11 +31,11 @@ namespace Azylee.Core.WindowsUtils.CMDUtils
                 {
                     if (fuzzy)
                     {
-                        return list.Where(x => x.Item1.ToString().Contains(port.ToString())).ToList();
+                        return list.Where(x => x.Item1.ToString().Contains(port.ToString()) && x.Item2 != 0).ToList();
                     }
                     else
                     {
-                        return list.Where(x => x.Item1 == port).ToList();
+                        return list.Where(x => x.Item1 == port && x.Item2 != 0).ToList();
                     }
                 }
                 catch { }

+ 5 - 2
Fork.Net/Azylee.Utils/Azylee.Core/WindowsUtils/CMDUtils/CMDProcessTool.cs

@@ -36,8 +36,9 @@ namespace Azylee.Core.WindowsUtils.CMDUtils
         /// 开始运行CMD命令
         /// </summary>
         /// <param name="cmd"></param>
-        public static void StartExecute(string cmd)
-        { 
+        /// <param name="output">输出动作</param>
+        public static void StartExecute(string cmd, Action<string> output)
+        {
             StreamReader reader = null;
             Process process = null;
             try
@@ -45,10 +46,12 @@ namespace Azylee.Core.WindowsUtils.CMDUtils
                 process = GetProcess();
                 process.Start();
                 process.StandardInput.WriteLine(cmd);
+                process.StandardInput.WriteLine("exit");
                 reader = process.StandardOutput;
                 do
                 {
                     string line = reader.ReadLine();
+                    output?.Invoke(line);
                 } while (!reader.EndOfStream);
                 process.WaitForExit();
             }

+ 22 - 0
Fork.Net/Fork.Net.sln

@@ -85,6 +85,10 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Test.BlackBox", "Test\Test.
 EndProject
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Test.CmdTool", "Test\Test.CmdTool\Test.CmdTool.csproj", "{6F974809-DC4F-4490-B6D4-857036A234AB}"
 EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Oreo.BigBirdDeployer", "Oreo.Plugins\Oreo.BigBirdDeployer\Oreo.BigBirdDeployer.csproj", "{09A73EF5-BA8F-4757-A3EA-303D82CEBC85}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Test.CpuTime", "Test\Test.CpuTime\Test.CpuTime.csproj", "{BB602C66-C94B-4258-B606-004227CC6BA3}"
+EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
 		Debug|Any CPU = Debug|Any CPU
@@ -381,6 +385,22 @@ Global
 		{6F974809-DC4F-4490-B6D4-857036A234AB}.Release|Any CPU.Build.0 = Release|Any CPU
 		{6F974809-DC4F-4490-B6D4-857036A234AB}.Release|x86.ActiveCfg = Release|Any CPU
 		{6F974809-DC4F-4490-B6D4-857036A234AB}.Release|x86.Build.0 = Release|Any CPU
+		{09A73EF5-BA8F-4757-A3EA-303D82CEBC85}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{09A73EF5-BA8F-4757-A3EA-303D82CEBC85}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{09A73EF5-BA8F-4757-A3EA-303D82CEBC85}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{09A73EF5-BA8F-4757-A3EA-303D82CEBC85}.Debug|x86.Build.0 = Debug|Any CPU
+		{09A73EF5-BA8F-4757-A3EA-303D82CEBC85}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{09A73EF5-BA8F-4757-A3EA-303D82CEBC85}.Release|Any CPU.Build.0 = Release|Any CPU
+		{09A73EF5-BA8F-4757-A3EA-303D82CEBC85}.Release|x86.ActiveCfg = Release|Any CPU
+		{09A73EF5-BA8F-4757-A3EA-303D82CEBC85}.Release|x86.Build.0 = Release|Any CPU
+		{BB602C66-C94B-4258-B606-004227CC6BA3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{BB602C66-C94B-4258-B606-004227CC6BA3}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{BB602C66-C94B-4258-B606-004227CC6BA3}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{BB602C66-C94B-4258-B606-004227CC6BA3}.Debug|x86.Build.0 = Debug|Any CPU
+		{BB602C66-C94B-4258-B606-004227CC6BA3}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{BB602C66-C94B-4258-B606-004227CC6BA3}.Release|Any CPU.Build.0 = Release|Any CPU
+		{BB602C66-C94B-4258-B606-004227CC6BA3}.Release|x86.ActiveCfg = Release|Any CPU
+		{BB602C66-C94B-4258-B606-004227CC6BA3}.Release|x86.Build.0 = Release|Any CPU
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
@@ -421,6 +441,8 @@ Global
 		{79FCD171-33AC-47BF-B8A7-C19D365D2983} = {A89FC45A-A907-4487-8719-114530A62684}
 		{6C69CF15-398D-4030-AA90-C617E52DC016} = {A89FC45A-A907-4487-8719-114530A62684}
 		{6F974809-DC4F-4490-B6D4-857036A234AB} = {A89FC45A-A907-4487-8719-114530A62684}
+		{09A73EF5-BA8F-4757-A3EA-303D82CEBC85} = {E53B3662-A5FD-4D4C-AFF6-1DC9FF24EA16}
+		{BB602C66-C94B-4258-B606-004227CC6BA3} = {A89FC45A-A907-4487-8719-114530A62684}
 	EndGlobalSection
 	GlobalSection(ExtensibilityGlobals) = postSolution
 		SolutionGuid = {5436696D-5F55-490A-AB40-050B54BE2AB4}

+ 11 - 0
Fork.Net/Oreo.Plugins/Oreo.BigBirdDeployer/Commons/R.cs

@@ -0,0 +1,11 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace Oreo.BigBirdDeployer.Commons
+{
+    public static class R
+    {
+    }
+}

+ 4 - 0
Fork.Net/Oreo.Plugins/Oreo.BigBirdDeployer/FodyWeavers.xml

@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Weavers>
+  <Costura />
+</Weavers>

+ 43 - 0
Fork.Net/Oreo.Plugins/Oreo.BigBirdDeployer/Models/ProjectModel.cs

@@ -0,0 +1,43 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace Oreo.BigBirdDeployer.Models
+{
+    public class ProjectModel
+    {
+        /// <summary>
+        /// Id
+        /// </summary>
+        public Guid Id { get; set; }
+        /// <summary>
+        /// 工程名称
+        /// </summary>
+        public string Name { get; set; }
+        /// <summary>
+        /// 文件夹名称
+        /// </summary>
+        public string Folder { get; set; }
+        /// <summary>
+        /// 运行Jar包名称
+        /// </summary>
+        public string JarFile { get; set; }
+        /// <summary>
+        /// 端口号
+        /// </summary>
+        public int Port { get; set; }
+        /// <summary>
+        /// 最新版本号
+        /// </summary>
+        public int LastVersionNumber { get; set; }
+        /// <summary>
+        /// 版本缓存个数(超出删除)
+        /// </summary>
+        public int VersionCache { get; set; }
+        /// <summary>
+        /// 所有版本列表
+        /// </summary>
+        public List<VersionModel> Versions { get; set; }
+    }
+}

+ 23 - 0
Fork.Net/Oreo.Plugins/Oreo.BigBirdDeployer/Models/VersionModel.cs

@@ -0,0 +1,23 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace Oreo.BigBirdDeployer.Models
+{
+    public class VersionModel
+    {
+        /// <summary>
+        /// 版本号
+        /// </summary>
+        public int Number { get; set; }
+        /// <summary>
+        /// 相对路径
+        /// </summary>
+        public string Path { get; set; }
+        /// <summary>
+        /// 创建时间
+        /// </summary>
+        public string CreateTime { get; set; }
+    }
+}

+ 20 - 0
Fork.Net/Oreo.Plugins/Oreo.BigBirdDeployer/Models/WorkStatus.cs

@@ -0,0 +1,20 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace Oreo.BigBirdDeployer.Models
+{
+    enum WorkStatus
+    {
+        准备就绪 = 0,
+        启动成功 = 1,
+
+        正在启动 = 101,
+        正在关闭 = 102,
+
+        端口占用 = 401,
+
+        启动失败 = 901,//未知原因
+    }
+}

+ 138 - 0
Fork.Net/Oreo.Plugins/Oreo.BigBirdDeployer/Oreo.BigBirdDeployer.csproj

@@ -0,0 +1,138 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="15.0" 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>{09A73EF5-BA8F-4757-A3EA-303D82CEBC85}</ProjectGuid>
+    <OutputType>WinExe</OutputType>
+    <RootNamespace>Oreo.BigBirdDeployer</RootNamespace>
+    <AssemblyName>Oreo.BigBirdDeployer</AssemblyName>
+    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+    <NuGetPackageImportStamp>
+    </NuGetPackageImportStamp>
+  </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>
+  <ItemGroup>
+    <Reference Include="Costura, Version=1.6.2.0, Culture=neutral, PublicKeyToken=9919ef960d84173d, processorArchitecture=MSIL">
+      <HintPath>..\..\packages\Costura.Fody.1.6.2\lib\portable-net+sl+win+wpa+wp\Costura.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <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" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Commons\R.cs" />
+    <Compile Include="Models\WorkStatus.cs" />
+    <Compile Include="Models\ProjectModel.cs" />
+    <Compile Include="Models\VersionModel.cs" />
+    <Compile Include="Parts\ProjectItemPart.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Parts\ProjectItemPart.Designer.cs">
+      <DependentUpon>ProjectItemPart.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Program.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="Utils\ConsoleCodeTool.cs" />
+    <Compile Include="Views\MainForm.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="Views\MainForm.Designer.cs">
+      <DependentUpon>MainForm.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Views\ProjectConfigForm.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="Views\ProjectConfigForm.Designer.cs">
+      <DependentUpon>ProjectConfigForm.cs</DependentUpon>
+    </Compile>
+    <EmbeddedResource Include="Parts\ProjectItemPart.resx">
+      <DependentUpon>ProjectItemPart.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>
+    </Compile>
+    <EmbeddedResource Include="Views\MainForm.resx">
+      <DependentUpon>MainForm.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Views\ProjectConfigForm.resx">
+      <DependentUpon>ProjectConfigForm.cs</DependentUpon>
+    </EmbeddedResource>
+    <None Include="packages.config" />
+    <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 />
+  <ItemGroup>
+    <ProjectReference Include="..\..\Azylee.Utils\Azylee.Core.Plus\Azylee.Core.Plus.csproj">
+      <Project>{915ae524-7efd-4ecc-b731-de1d1f5558f0}</Project>
+      <Name>Azylee.Core.Plus</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\Azylee.Utils\Azylee.Core\Azylee.Core.csproj">
+      <Project>{88dc61fa-95f0-41b7-9d7d-ab0f3cbd169c}</Project>
+      <Name>Azylee.Core</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\Azylee.Utils\Azylee.WinformMan\Azylee.WinformMan.csproj">
+      <Project>{0783d6b7-a0e9-4e3b-b2e8-c72d318f99ce}</Project>
+      <Name>Azylee.WinformMan</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\Azylee.Utils\Azylee.WinformSkin\Azylee.WinformSkin.csproj">
+      <Project>{d280c16f-fde2-4647-bd76-3514f673426d}</Project>
+      <Name>Azylee.WinformSkin</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="FodyWeavers.xml" />
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <Import Project="..\..\packages\Fody.2.0.0\build\portable-net+sl+win+wpa+wp\Fody.targets" Condition="Exists('..\..\packages\Fody.2.0.0\build\portable-net+sl+win+wpa+wp\Fody.targets')" />
+  <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
+    <PropertyGroup>
+      <ErrorText>这台计算机上缺少此项目引用的 NuGet 程序包。使用“NuGet 程序包还原”可下载这些程序包。有关更多信息,请参见 http://go.microsoft.com/fwlink/?LinkID=322105。缺少的文件是 {0}。</ErrorText>
+    </PropertyGroup>
+    <Error Condition="!Exists('..\..\packages\Fody.2.0.0\build\portable-net+sl+win+wpa+wp\Fody.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\Fody.2.0.0\build\portable-net+sl+win+wpa+wp\Fody.targets'))" />
+    <Error Condition="!Exists('..\..\packages\Costura.Fody.1.6.2\build\portable-net+sl+win+wpa+wp\Costura.Fody.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\Costura.Fody.1.6.2\build\portable-net+sl+win+wpa+wp\Costura.Fody.targets'))" />
+  </Target>
+  <Import Project="..\..\packages\Costura.Fody.1.6.2\build\portable-net+sl+win+wpa+wp\Costura.Fody.targets" Condition="Exists('..\..\packages\Costura.Fody.1.6.2\build\portable-net+sl+win+wpa+wp\Costura.Fody.targets')" />
+</Project>

+ 26 - 0
Fork.Net/Oreo.Plugins/Oreo.BigBirdDeployer/Program.cs

@@ -0,0 +1,26 @@
+using Azylee.Core.AppUtils;
+using Azylee.Core.ProcessUtils;
+using Oreo.BigBirdDeployer.Utils;
+using Oreo.BigBirdDeployer.Views;
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Linq;
+using System.Windows.Forms;
+
+namespace Oreo.BigBirdDeployer
+{
+    static class Program
+    {
+        /// <summary>
+        /// 应用程序的主入口点。
+        /// </summary>
+        [STAThread]
+        static void Main()
+        {
+            Application.EnableVisualStyles();
+            Application.SetCompatibleTextRenderingDefault(false);
+            Application.Run(new MainForm());
+        }
+    }
+}

+ 36 - 0
Fork.Net/Oreo.Plugins/Oreo.BigBirdDeployer/Properties/AssemblyInfo.cs

@@ -0,0 +1,36 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// 有关程序集的一般信息由以下
+// 控制。更改这些特性值可修改
+// 与程序集关联的信息。
+[assembly: AssemblyTitle("Oreo.BigBirdDeployer")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("Oreo.BigBirdDeployer")]
+[assembly: AssemblyCopyright("Copyright ©  2018")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// 将 ComVisible 设置为 false 会使此程序集中的类型
+//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型
+//请将此类型的 ComVisible 特性设置为 true。
+[assembly: ComVisible(false)]
+
+// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID
+[assembly: Guid("09a73ef5-ba8f-4757-a3ea-303d82cebc85")]
+
+// 程序集的版本信息由下列四个值组成: 
+//
+//      主版本
+//      次版本
+//      生成号
+//      修订号
+//
+// 可以指定所有值,也可以使用以下所示的 "*" 预置版本号和修订号
+// 方法是按如下所示使用“*”: :
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]

+ 71 - 0
Fork.Net/Oreo.Plugins/Oreo.BigBirdDeployer/Properties/Resources.Designer.cs

@@ -0,0 +1,71 @@
+//------------------------------------------------------------------------------
+// <auto-generated>
+//     此代码由工具生成。
+//     运行时版本: 4.0.30319.42000
+//
+//     对此文件的更改可能导致不正确的行为,如果
+//     重新生成代码,则所做更改将丢失。
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace Oreo.BigBirdDeployer.Properties
+{
+
+
+    /// <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 ((resourceMan == null))
+                {
+                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Oreo.BigBirdDeployer.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;
+            }
+        }
+    }
+}

+ 117 - 0
Fork.Net/Oreo.Plugins/Oreo.BigBirdDeployer/Properties/Resources.resx

@@ -0,0 +1,117 @@
+<?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.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: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" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+            </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" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+            </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=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>

+ 30 - 0
Fork.Net/Oreo.Plugins/Oreo.BigBirdDeployer/Properties/Settings.Designer.cs

@@ -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 Oreo.BigBirdDeployer.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;
+            }
+        }
+    }
+}

+ 7 - 0
Fork.Net/Oreo.Plugins/Oreo.BigBirdDeployer/Properties/Settings.settings

@@ -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>

+ 41 - 0
Fork.Net/Oreo.Plugins/Oreo.BigBirdDeployer/Utils/ConsoleCodeTool.cs

@@ -0,0 +1,41 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace Oreo.BigBirdDeployer.Utils
+{
+    public static class ConsoleCodeTool
+    {
+        const string HEAD = "***BigBirdDeployer***";
+        const string CODE = "::CODE::";
+        const string LOG = "::LOG::";
+
+        const string BBD_CODE = HEAD + CODE;
+        const string BBD_LOG = HEAD + LOG;
+
+        const string LUNCH_SUCCESS = BBD_CODE + "LaunchedSuccessfully";
+
+        /// <summary>
+        /// 启动成功
+        /// </summary>
+        /// <param name="s"></param>
+        /// <returns></returns>
+        public static bool IsLunchSuccess(string s)
+        {
+            if (!string.IsNullOrWhiteSpace(s) && s.Contains(LUNCH_SUCCESS))
+            {
+                return true;
+            }
+            return false;
+        }
+        public static string GetLogInfo(string s)
+        {
+            if (!string.IsNullOrWhiteSpace(s) && s.Contains(BBD_LOG))
+            {
+                return s.Substring(s.IndexOf(BBD_LOG) + BBD_LOG.Length);
+            }
+            return null;
+        }
+    }
+}

+ 107 - 0
Fork.Net/Oreo.Plugins/Oreo.BigBirdDeployer/Views/MainForm.Designer.cs

@@ -0,0 +1,107 @@
+namespace Oreo.BigBirdDeployer.Views
+{
+    partial class MainForm
+    {
+        /// <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.projectItemPart1 = new Oreo.BigBirdDeployer.Parts.ProjectItemPart();
+            this.projectItemPart2 = new Oreo.BigBirdDeployer.Parts.ProjectItemPart();
+            ((System.ComponentModel.ISupportInitialize)(this.BigIconFormPBHeadIcon)).BeginInit();
+            this.BigIconFormPNContainer.SuspendLayout();
+            this.BigIconFormPNHead.SuspendLayout();
+            this.BigIconFormPNHeadButton.SuspendLayout();
+            this.SuspendLayout();
+            // 
+            // BigIconFormLBHeadTitle
+            // 
+            this.BigIconFormLBHeadTitle.Size = new System.Drawing.Size(508, 68);
+            // 
+            // BigIconFormPNContainer
+            // 
+            this.BigIconFormPNContainer.Controls.Add(this.projectItemPart2);
+            this.BigIconFormPNContainer.Controls.Add(this.projectItemPart1);
+            this.BigIconFormPNContainer.Size = new System.Drawing.Size(775, 445);
+            // 
+            // BigIconFormPNHead
+            // 
+            this.BigIconFormPNHead.Size = new System.Drawing.Size(775, 68);
+            // 
+            // BigIconFormPNHeadButton
+            // 
+            this.BigIconFormPNHeadButton.Location = new System.Drawing.Point(658, 0);
+            // 
+            // BigIconFormBTFormMinBox
+            // 
+            this.BigIconFormBTFormMinBox.FlatAppearance.BorderSize = 0;
+            // 
+            // BigIconFormBTFormMaxBox
+            // 
+            this.BigIconFormBTFormMaxBox.FlatAppearance.BorderSize = 0;
+            // 
+            // BigIconFormBTFormCloseBox
+            // 
+            this.BigIconFormBTFormCloseBox.FlatAppearance.BorderSize = 0;
+            // 
+            // projectItemPart1
+            // 
+            this.projectItemPart1.BackColor = System.Drawing.Color.DimGray;
+            this.projectItemPart1.Location = new System.Drawing.Point(12, 22);
+            this.projectItemPart1.Name = "projectItemPart1";
+            this.projectItemPart1.Size = new System.Drawing.Size(513, 95);
+            this.projectItemPart1.TabIndex = 0;
+            // 
+            // projectItemPart2
+            // 
+            this.projectItemPart2.BackColor = System.Drawing.Color.DimGray;
+            this.projectItemPart2.Location = new System.Drawing.Point(12, 134);
+            this.projectItemPart2.Name = "projectItemPart2";
+            this.projectItemPart2.Size = new System.Drawing.Size(513, 95);
+            this.projectItemPart2.TabIndex = 1;
+            // 
+            // MainForm
+            // 
+            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.ClientSize = new System.Drawing.Size(775, 513);
+            this.Name = "MainForm";
+            this.Text = "MainForm";
+            this.Load += new System.EventHandler(this.MainForm_Load);
+            this.Controls.SetChildIndex(this.BigIconFormPNHead, 0);
+            this.Controls.SetChildIndex(this.BigIconFormPNContainer, 0);
+            ((System.ComponentModel.ISupportInitialize)(this.BigIconFormPBHeadIcon)).EndInit();
+            this.BigIconFormPNContainer.ResumeLayout(false);
+            this.BigIconFormPNHead.ResumeLayout(false);
+            this.BigIconFormPNHeadButton.ResumeLayout(false);
+            this.ResumeLayout(false);
+
+        }
+
+        #endregion
+        private Parts.ProjectItemPart projectItemPart1;
+        private Parts.ProjectItemPart projectItemPart2;
+    }
+}

+ 41 - 0
Fork.Net/Oreo.Plugins/Oreo.BigBirdDeployer/Views/MainForm.cs

@@ -0,0 +1,41 @@
+using Azylee.WinformSkin.FormUI.CustomTitle;
+using Oreo.BigBirdDeployer.Models;
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Diagnostics;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Windows.Forms;
+
+namespace Oreo.BigBirdDeployer.Views
+{
+    public partial class MainForm : BigIconForm
+    {
+        public MainForm()
+        {
+            InitializeComponent();
+        }
+
+        private void MainForm_Load(object sender, EventArgs e)
+        {
+            projectItemPart1.Init(new ProjectModel()
+            {
+                Name = "server",
+                Folder = @"F:\2018_5_2\temp\noah_cloud_supply_platform_jar",
+                JarFile = "noah-cloud-supply-platform.jar",
+                Port = 9090,
+            });
+
+            projectItemPart2.Init(new ProjectModel()
+            {
+                Name = "web",
+                Folder = @"F:\2018_5_2\temp\noah_cloud_supply_platform_web_jar",
+                JarFile = "noah-cloud-supply-platform-web.jar",
+                Port = 9091,
+            });
+        }
+    }
+}

+ 120 - 0
Fork.Net/Oreo.Plugins/Oreo.BigBirdDeployer/Views/MainForm.resx

@@ -0,0 +1,120 @@
+<?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>
+</root>

+ 201 - 0
Fork.Net/Oreo.Plugins/Oreo.BigBirdDeployer/Views/ProjectConfigForm.Designer.cs

@@ -0,0 +1,201 @@
+namespace Oreo.BigBirdDeployer.Views
+{
+    partial class ProjectConfigForm
+    {
+        /// <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.BTSave = new System.Windows.Forms.Button();
+            this.BTCancel = new System.Windows.Forms.Button();
+            this.label1 = new System.Windows.Forms.Label();
+            this.label2 = new System.Windows.Forms.Label();
+            this.TBName = new System.Windows.Forms.TextBox();
+            this.TBFolder = new System.Windows.Forms.TextBox();
+            this.TBJarFile = new System.Windows.Forms.TextBox();
+            this.TBPort = new System.Windows.Forms.TextBox();
+            this.TBVersionCache = new System.Windows.Forms.TextBox();
+            this.label3 = new System.Windows.Forms.Label();
+            this.label4 = new System.Windows.Forms.Label();
+            this.label5 = new System.Windows.Forms.Label();
+            this.LBDesc = new System.Windows.Forms.Label();
+            this.SuspendLayout();
+            // 
+            // BTSave
+            // 
+            this.BTSave.Location = new System.Drawing.Point(262, 268);
+            this.BTSave.Name = "BTSave";
+            this.BTSave.Size = new System.Drawing.Size(75, 23);
+            this.BTSave.TabIndex = 0;
+            this.BTSave.Text = "保存";
+            this.BTSave.UseVisualStyleBackColor = true;
+            this.BTSave.Click += new System.EventHandler(this.BTSave_Click);
+            // 
+            // BTCancel
+            // 
+            this.BTCancel.Location = new System.Drawing.Point(368, 268);
+            this.BTCancel.Name = "BTCancel";
+            this.BTCancel.Size = new System.Drawing.Size(75, 23);
+            this.BTCancel.TabIndex = 1;
+            this.BTCancel.Text = "取消";
+            this.BTCancel.UseVisualStyleBackColor = true;
+            this.BTCancel.Click += new System.EventHandler(this.BTCancel_Click);
+            // 
+            // label1
+            // 
+            this.label1.AutoSize = true;
+            this.label1.Location = new System.Drawing.Point(27, 34);
+            this.label1.Name = "label1";
+            this.label1.Size = new System.Drawing.Size(53, 12);
+            this.label1.TabIndex = 2;
+            this.label1.Text = "工程名称";
+            // 
+            // label2
+            // 
+            this.label2.AutoSize = true;
+            this.label2.Location = new System.Drawing.Point(27, 79);
+            this.label2.Name = "label2";
+            this.label2.Size = new System.Drawing.Size(65, 12);
+            this.label2.TabIndex = 3;
+            this.label2.Text = "文件夹名称";
+            // 
+            // TBName
+            // 
+            this.TBName.Location = new System.Drawing.Point(140, 30);
+            this.TBName.Name = "TBName";
+            this.TBName.Size = new System.Drawing.Size(303, 21);
+            this.TBName.TabIndex = 4;
+            // 
+            // TBFolder
+            // 
+            this.TBFolder.Location = new System.Drawing.Point(140, 75);
+            this.TBFolder.Name = "TBFolder";
+            this.TBFolder.Size = new System.Drawing.Size(303, 21);
+            this.TBFolder.TabIndex = 5;
+            // 
+            // TBJarFile
+            // 
+            this.TBJarFile.Location = new System.Drawing.Point(140, 120);
+            this.TBJarFile.Name = "TBJarFile";
+            this.TBJarFile.Size = new System.Drawing.Size(303, 21);
+            this.TBJarFile.TabIndex = 6;
+            // 
+            // TBPort
+            // 
+            this.TBPort.Location = new System.Drawing.Point(140, 165);
+            this.TBPort.Name = "TBPort";
+            this.TBPort.Size = new System.Drawing.Size(303, 21);
+            this.TBPort.TabIndex = 7;
+            // 
+            // TBVersionCache
+            // 
+            this.TBVersionCache.Location = new System.Drawing.Point(140, 210);
+            this.TBVersionCache.Name = "TBVersionCache";
+            this.TBVersionCache.Size = new System.Drawing.Size(303, 21);
+            this.TBVersionCache.TabIndex = 8;
+            // 
+            // label3
+            // 
+            this.label3.AutoSize = true;
+            this.label3.Location = new System.Drawing.Point(27, 124);
+            this.label3.Name = "label3";
+            this.label3.Size = new System.Drawing.Size(83, 12);
+            this.label3.TabIndex = 10;
+            this.label3.Text = "运行Jar包名称";
+            // 
+            // label4
+            // 
+            this.label4.AutoSize = true;
+            this.label4.Location = new System.Drawing.Point(27, 169);
+            this.label4.Name = "label4";
+            this.label4.Size = new System.Drawing.Size(41, 12);
+            this.label4.TabIndex = 11;
+            this.label4.Text = "端口号";
+            // 
+            // label5
+            // 
+            this.label5.AutoSize = true;
+            this.label5.Location = new System.Drawing.Point(27, 214);
+            this.label5.Name = "label5";
+            this.label5.Size = new System.Drawing.Size(83, 12);
+            this.label5.TabIndex = 12;
+            this.label5.Text = " 版本缓存个数";
+            // 
+            // LBDesc
+            // 
+            this.LBDesc.AutoSize = true;
+            this.LBDesc.Location = new System.Drawing.Point(29, 278);
+            this.LBDesc.Name = "LBDesc";
+            this.LBDesc.Size = new System.Drawing.Size(77, 12);
+            this.LBDesc.TabIndex = 13;
+            this.LBDesc.Text = "执行结果描述";
+            // 
+            // ProjectConfigForm
+            // 
+            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.ClientSize = new System.Drawing.Size(475, 321);
+            this.Controls.Add(this.LBDesc);
+            this.Controls.Add(this.label5);
+            this.Controls.Add(this.label4);
+            this.Controls.Add(this.label3);
+            this.Controls.Add(this.TBVersionCache);
+            this.Controls.Add(this.TBPort);
+            this.Controls.Add(this.TBJarFile);
+            this.Controls.Add(this.TBFolder);
+            this.Controls.Add(this.TBName);
+            this.Controls.Add(this.label2);
+            this.Controls.Add(this.label1);
+            this.Controls.Add(this.BTCancel);
+            this.Controls.Add(this.BTSave);
+            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
+            this.MaximizeBox = false;
+            this.MinimizeBox = false;
+            this.Name = "ProjectConfigForm";
+            this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+            this.Text = "工程配置";
+            this.Load += new System.EventHandler(this.ProjectConfigForm_Load);
+            this.ResumeLayout(false);
+            this.PerformLayout();
+
+        }
+
+        #endregion
+
+        private System.Windows.Forms.Button BTSave;
+        private System.Windows.Forms.Button BTCancel;
+        private System.Windows.Forms.Label label1;
+        private System.Windows.Forms.Label label2;
+        private System.Windows.Forms.TextBox TBName;
+        private System.Windows.Forms.TextBox TBFolder;
+        private System.Windows.Forms.TextBox TBJarFile;
+        private System.Windows.Forms.TextBox TBPort;
+        private System.Windows.Forms.TextBox TBVersionCache;
+        private System.Windows.Forms.Label label3;
+        private System.Windows.Forms.Label label4;
+        private System.Windows.Forms.Label label5;
+        private System.Windows.Forms.Label LBDesc;
+    }
+}

+ 64 - 0
Fork.Net/Oreo.Plugins/Oreo.BigBirdDeployer/Views/ProjectConfigForm.cs

@@ -0,0 +1,64 @@
+using Oreo.BigBirdDeployer.Models;
+using Oreo.BigBirdDeployer.Parts;
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Windows.Forms;
+
+namespace Oreo.BigBirdDeployer.Views
+{
+    public partial class ProjectConfigForm : Form
+    {
+        public ProjectItemPart ProjectItem { get; set; }
+        private ProjectModel Project { get; set; }
+        public ProjectConfigForm(ProjectItemPart item, ProjectModel project)
+        {
+            InitializeComponent();
+            Project = project;
+            ProjectItem = item;
+        }
+        private void ProjectConfigForm_Load(object sender, EventArgs e)
+        {
+            TBName.Text = Project.Name;
+            TBFolder.Text = Project.Folder;
+            TBJarFile.Text = Project.JarFile;
+            TBPort.Text = Project.Port.ToString();
+            TBVersionCache.Text = Project.VersionCache.ToString();
+        }
+
+        private void BTSave_Click(object sender, EventArgs e)
+        {
+            if (Save()) Close();
+        }
+
+        private void BTCancel_Click(object sender, EventArgs e)
+        {
+            Close();
+        }
+
+        #region 方法函数
+        public bool Save()
+        {
+            try
+            {
+                Project.Name = TBName.Text;
+                Project.Folder = TBFolder.Text;
+                Project.JarFile = TBJarFile.Text;
+                Project.Port = int.Parse(TBPort.Text);
+                Project.VersionCache = int.Parse(TBVersionCache.Text);
+                ProjectItem.Init(Project);
+                LBDesc.Text = "保存成功并更新到管理面板";
+                return true;
+            }
+            catch { LBDesc.Text = "配置填写有误,请检查修改"; }
+            return false;
+        }
+        #endregion
+
+
+    }
+}

+ 120 - 0
Fork.Net/Oreo.Plugins/Oreo.BigBirdDeployer/Views/ProjectConfigForm.resx

@@ -0,0 +1,120 @@
+<?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>
+</root>

+ 5 - 0
Fork.Net/Oreo.Plugins/Oreo.BigBirdDeployer/packages.config

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<packages>
+  <package id="Costura.Fody" version="1.6.2" targetFramework="net40" developmentDependency="true" />
+  <package id="Fody" version="2.0.0" targetFramework="net40" developmentDependency="true" />
+</packages>

+ 1 - 1
Fork.Net/Test/Test.CmdTool/Form1.cs

@@ -79,7 +79,7 @@ namespace Test.CmdTool
 
         private void TMStatus_Tick(object sender, EventArgs e)
         {
-            LBStatus.Text = $"comcpu:{(int)ComCpu.NextValue()}, appcpu:{(int)AppCpu.NextValue()}, appram:{AppInfoTool.RAM()/1024}";
+            LBStatus.Text = $"comcpu:{(int)ComCpu.NextValue()}, appcpu:{(int)AppCpu.NextValue()}, appram:{AppInfoTool.RAM() / 1024}";
         }
     }
 }

+ 41 - 0
Fork.Net/Test/Test.CpuTime/Program.cs

@@ -0,0 +1,41 @@
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Linq;
+using System.Text;
+using System.Threading;
+
+namespace Test.CpuTime
+{
+    class Program
+    {
+        static void Main(string[] args)
+        {
+            UsingProcess("Marx");
+        }
+        //+ using System.Diagnostics
+        //+ using System.Threading
+        static void UsingProcess(string pname)
+        {
+            using (var pro = Process.GetProcessesByName(pname)[0])
+            {
+                //间隔时间(毫秒)
+                int interval = 1000;
+                //上次记录的CPU时间
+                var prevCpuTime = TimeSpan.Zero;
+                while (true)
+                {
+                    //当前时间
+                    var curTime = pro.TotalProcessorTime;
+                    //间隔时间内的CPU运行时间除以逻辑CPU数量
+                    var value = (curTime - prevCpuTime).TotalMilliseconds / interval / Environment.ProcessorCount * 100;
+                    prevCpuTime = curTime;
+                    //输出
+                    Console.WriteLine($"{curTime}-{prevCpuTime}, CPU: {value} %");
+
+                    Thread.Sleep(interval);
+                }
+            }
+        }
+    }
+}

+ 36 - 0
Fork.Net/Test/Test.CpuTime/Properties/AssemblyInfo.cs

@@ -0,0 +1,36 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// 有关程序集的一般信息由以下
+// 控制。更改这些特性值可修改
+// 与程序集关联的信息。
+[assembly: AssemblyTitle("Test.CpuTime")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("Test.CpuTime")]
+[assembly: AssemblyCopyright("Copyright ©  2018")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// 将 ComVisible 设置为 false 会使此程序集中的类型
+//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型
+//请将此类型的 ComVisible 特性设置为 true。
+[assembly: ComVisible(false)]
+
+// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID
+[assembly: Guid("bb602c66-c94b-4258-b606-004227cc6ba3")]
+
+// 程序集的版本信息由下列四个值组成: 
+//
+//      主版本
+//      次版本
+//      生成号
+//      修订号
+//
+// 可以指定所有值,也可以使用以下所示的 "*" 预置版本号和修订号
+// 方法是按如下所示使用“*”: :
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]

+ 47 - 0
Fork.Net/Test/Test.CpuTime/Test.CpuTime.csproj

@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="15.0" 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>{BB602C66-C94B-4258-B606-004227CC6BA3}</ProjectGuid>
+    <OutputType>Exe</OutputType>
+    <RootNamespace>Test.CpuTime</RootNamespace>
+    <AssemblyName>Test.CpuTime</AssemblyName>
+    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+  </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>
+  <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.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Program.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+</Project>