浏览代码

添加扩展工具类包

yuzhengyang 8 年之前
父节点
当前提交
5c651c6ad5
共有 34 个文件被更改,包括 1515 次插入50 次删除
  1. 二进制
      Fork.Net/.vs/Fork.Net/v15/sqlite3/storage.ide
  2. 53 0
      Fork.Net/Azylee.Utils/Azylee.Core/Azylee.Core.csproj
  3. 44 0
      Fork.Net/Azylee.Utils/Azylee.Core/Data/Collections/ListTool.cs
  4. 89 0
      Fork.Net/Azylee.Utils/Azylee.Core/Data/String/StringTool.cs
  5. 112 0
      Fork.Net/Azylee.Utils/Azylee.Core/Diagnostics/ProcessTool.cs
  6. 206 0
      Fork.Net/Azylee.Utils/Azylee.Core/IO/Dir/DirTool.cs
  7. 36 0
      Fork.Net/Azylee.Utils/Azylee.Core/Properties/AssemblyInfo.cs
  8. 14 0
      Fork.Net/Azylee.Utils/Azylee.Core/Readme.cs
  9. 52 0
      Fork.Net/Azylee.Utils/Azylee.ExeLaunch/Azylee.ExeLaunch.csproj
  10. 61 0
      Fork.Net/Azylee.Utils/Azylee.ExeLaunch/Launch.cs
  11. 36 0
      Fork.Net/Azylee.Utils/Azylee.ExeLaunch/Properties/AssemblyInfo.cs
  12. 0 0
      Fork.Net/Azylee.Utils/Yuzhyn.WebUtils/HttpUtils/HttpTool.cs
  13. 0 0
      Fork.Net/Azylee.Utils/Yuzhyn.WebUtils/Properties/AssemblyInfo.cs
  14. 0 0
      Fork.Net/Azylee.Utils/Yuzhyn.WebUtils/Yuzhyn.WebUtils.csproj
  15. 101 40
      Fork.Net/Fork.Net.Tools/Y.Utils/AppUtils/AppLaunchTool.cs
  16. 71 0
      Fork.Net/Fork.Net.Tools/Y.Utils/AppUtils/AppSettleTool.cs
  17. 17 0
      Fork.Net/Fork.Net.Tools/Y.Utils/IOUtils/FileUtils/FileTool.cs
  18. 1 1
      Fork.Net/Fork.Net.Tools/Y.Utils/Readme.cs
  19. 6 3
      Fork.Net/Fork.Net.Tools/Y.Utils/WindowsUtils/ProcessUtils/ProcessTool.cs
  20. 1 0
      Fork.Net/Fork.Net.Tools/Y.Utils/Y.Utils.csproj
  21. 39 4
      Fork.Net/Fork.Net.sln
  22. 83 0
      Fork.Net/Test/AppSettle.Test/AppSettle.Test.csproj
  23. 48 0
      Fork.Net/Test/AppSettle.Test/Form1.Designer.cs
  24. 24 0
      Fork.Net/Test/AppSettle.Test/Form1.cs
  25. 120 0
      Fork.Net/Test/AppSettle.Test/Form1.resx
  26. 29 0
      Fork.Net/Test/AppSettle.Test/Program.cs
  27. 36 0
      Fork.Net/Test/AppSettle.Test/Properties/AssemblyInfo.cs
  28. 71 0
      Fork.Net/Test/AppSettle.Test/Properties/Resources.Designer.cs
  29. 117 0
      Fork.Net/Test/AppSettle.Test/Properties/Resources.resx
  30. 30 0
      Fork.Net/Test/AppSettle.Test/Properties/Settings.Designer.cs
  31. 7 0
      Fork.Net/Test/AppSettle.Test/Properties/Settings.settings
  32. 0 2
      Fork.Net/Test/Y.Test/Commons/R.cs
  33. 1 0
      Fork.Net/Test/Y.Test/Program.cs
  34. 10 0
      Fork.Net/Test/Y.Test/Y.Test.csproj

二进制
Fork.Net/.vs/Fork.Net/v15/sqlite3/storage.ide


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

@@ -0,0 +1,53 @@
+<?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>{88DC61FA-95F0-41B7-9D7D-AB0F3CBD169C}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>Azylee.Core</RootNamespace>
+    <AssemblyName>Azylee.Core</AssemblyName>
+    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <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' ">
+    <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="Data\Collections\ListTool.cs" />
+    <Compile Include="Data\String\StringTool.cs" />
+    <Compile Include="Diagnostics\ProcessTool.cs" />
+    <Compile Include="IO\Dir\DirTool.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="Readme.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <Folder Include="IO\Path\" />
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+</Project>

+ 44 - 0
Fork.Net/Azylee.Utils/Azylee.Core/Data/Collections/ListTool.cs

@@ -0,0 +1,44 @@
+//************************************************************************
+//      https://github.com/yuzhengyang
+//      author:     yuzhengyang
+//      date:       2017.10.12 - 2017.10.12
+//      desc:       元素列表工具类
+//      Copyright (c) yuzhengyang. All rights reserved.
+//************************************************************************
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace Azylee.Core.Data.Collections
+{
+    /// <summary>
+    /// 元素列表工具类
+    /// </summary>
+    public sealed class ListTool
+    {
+        /// <summary>
+        /// 列表为空(null 或 count 等于 0)
+        /// </summary>
+        /// <typeparam name="T">元素类型</typeparam>
+        /// <param name="list">元素列表</param>
+        /// <returns></returns>
+        [Obsolete("Please Use HasElements(list)", false)]
+        public static bool IsNullOrEmpty<T>(IEnumerable<T> list)
+        {
+            if (list != null && list.Count() > 0)
+                return false;
+            return true;
+        }
+        /// <summary>
+        /// 列表至少有一个元素
+        /// </summary>
+        /// <typeparam name="T">元素类型</typeparam>
+        /// <param name="list">元素列表</param>
+        /// <returns></returns>
+        public static bool HasElements<T>(IEnumerable<T> list)
+        {
+            return !IsNullOrEmpty(list);
+        }
+    }
+}

+ 89 - 0
Fork.Net/Azylee.Utils/Azylee.Core/Data/String/StringTool.cs

@@ -0,0 +1,89 @@
+//************************************************************************
+//      https://github.com/yuzhengyang
+//      author:     yuzhengyang
+//      date:       2017.10.12 - 2017.10.12
+//      desc:       字符串工具类
+//      Copyright (c) yuzhengyang. All rights reserved.
+//************************************************************************
+using Azylee.Core.Data.Collections;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Text.RegularExpressions;
+
+namespace Azylee.Core.Data.String
+{
+    public sealed class StringTool
+    {
+        /// <summary>
+        /// 判断字符串为null或为空格
+        /// </summary>
+        /// <param name="str"></param>
+        /// <returns></returns>
+        public static bool IsNullOrWhiteSpace(string str)
+        {
+            if (str == null)
+                return true;
+            if (str.Trim().Length == 0)
+                return true;
+
+            return false;
+        }
+        /// <summary>
+        /// 分割字符串
+        /// </summary>
+        /// <param name="str"></param>
+        /// <param name="separator"></param>
+        /// <param name="result"></param>
+        /// <returns></returns>
+        public static int Split(string str, char separator, out string[] result)
+        {
+            if (!string.IsNullOrWhiteSpace(str))
+            {
+                string[] list = str.Split(separator);
+                if (ListTool.HasElements(list))
+                {
+                    result = list;
+                    return result.Length;
+                }
+            }
+            result = null;
+            return 0;
+        }
+        /// <summary>
+        /// 字符串中字符出现次数
+        /// </summary>
+        /// <param name="s"></param>
+        /// <param name="sub"></param>
+        /// <returns></returns>
+        public static int SubStringCount(string s, string sub)
+        {
+            if (s.Contains(sub))
+            {
+                string sReplaced = s.Replace(sub, "");
+                return (s.Length - sReplaced.Length) / sub.Length;
+            }
+            return 0;
+        }
+        /// <summary>
+        /// 根据通配符验证字符串
+        /// </summary>
+        /// <param name="s">字符串</param>
+        /// <param name="pattern">通配符:%和_</param>
+        /// <returns></returns>
+        public static bool IsMatch(string s, string pattern)
+        {
+            try
+            {
+                //key = key.Replace("%", @"[\s\S]*").Replace("_", @"[\s\S]");
+                pattern = pattern.Replace("%", ".*").Replace("_", ".");
+                return Regex.IsMatch(s, pattern);
+            }
+            catch
+            {
+                return false;
+            }
+        }
+    }
+}

+ 112 - 0
Fork.Net/Azylee.Utils/Azylee.Core/Diagnostics/ProcessTool.cs

@@ -0,0 +1,112 @@
+//************************************************************************
+//      https://github.com/yuzhengyang
+//      author:     yuzhengyang
+//      date:       2017.10.12 - 2017.10.12
+//      desc:       启动进程工具
+//      Copyright (c) yuzhengyang. All rights reserved.
+//************************************************************************
+using Azylee.Core.Data.Collections;
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.IO;
+using System.Linq;
+using System.Text;
+
+namespace Azylee.Core.Diagnostics
+{
+    public static class ProcessTool
+    {
+        public static void StartProcess(string appFile)
+        {
+            try
+            {
+                if (File.Exists(appFile))
+                {
+                    Process p = new Process();
+                    p.StartInfo.FileName = appFile;
+                    //p.StartInfo.Arguments = "";
+                    p.StartInfo.UseShellExecute = true;
+                    p.Start();
+                    p.WaitForInputIdle(3000);
+                }
+            }
+            catch (Exception ex) { }
+        }
+        public static bool CheckProcessExists(string name)
+        {
+            Process[] processes = Process.GetProcessesByName(name);
+            foreach (Process p in processes)
+            {
+                return true;
+            }
+            return false;
+        }
+        public static void KillProcess(string name)
+        {
+            try
+            {
+                Process[] processes = Process.GetProcessesByName(name);
+                foreach (Process p in processes)
+                {
+                    p.Kill();
+                    p.Close();
+                }
+            }
+            catch (Exception e) { }
+        }
+        public static void KillCurrentProcess()
+        {
+            Process current = Process.GetCurrentProcess();
+            Process[] processes = Process.GetProcessesByName(current.ProcessName);
+            foreach (Process process in processes)
+            {
+                if (process.Id == current.Id)
+                {
+                    process.Kill();
+                }
+            }
+        }
+
+        public static bool Start(string file, string args = "")
+        {
+            try
+            {
+                if (File.Exists(file))
+                {
+                    Process p = new Process();
+                    p.StartInfo.FileName = file;
+                    p.StartInfo.Arguments = "";
+                    p.StartInfo.UseShellExecute = true;
+                    p.Start();
+                    p.WaitForInputIdle(3000);
+                    return true;
+                }
+            }
+            catch (Exception ex) { }
+            return false;
+        }
+        public static void Starts(string[] files)
+        {
+            if (ListTool.HasElements(files))
+            {
+                foreach (var f in files)
+                {
+                    if (!string.IsNullOrWhiteSpace(f))
+                        StartProcess(f);
+                }
+            }
+        }
+        public static void Kills(string[] pro)
+        {
+            if (ListTool.HasElements(pro))
+            {
+                foreach (var p in pro)
+                {
+                    if (!string.IsNullOrWhiteSpace(p))
+                        KillProcess(p);
+                }
+            }
+        }
+    }
+}

+ 206 - 0
Fork.Net/Azylee.Utils/Azylee.Core/IO/Dir/DirTool.cs

@@ -0,0 +1,206 @@
+//************************************************************************
+//      https://github.com/yuzhengyang
+//      author:     yuzhengyang
+//      date:       2017.10.12 - 2017.10.12
+//      desc:       文件目录工具类
+//      Copyright (c) yuzhengyang. All rights reserved.
+//************************************************************************
+using Azylee.Core.Data.Collections;
+using Azylee.Core.Data.String;
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Text;
+
+namespace Azylee.Core.IO.Dir
+{
+    /// <summary>
+    /// 文件目录工具类
+    /// </summary>
+    public class DirTool
+    {
+        /// <summary>
+        /// 创建文件目录(文件不存在则创建)
+        /// </summary>
+        /// <param name="path"></param>
+        /// <returns>
+        /// 如果文件已存在,返回true
+        /// 如果文件不存在,则创建文件,成功返回true,失败返回false
+        /// </returns>
+        public static bool Create(string path)
+        {
+            if (Directory.Exists(path))
+                return true;
+            else
+                try
+                {
+                    Directory.CreateDirectory(path); return true;
+                }
+                catch (Exception e)
+                {
+                }
+            return false;
+        }
+        /// <summary>
+        /// 获取目录的父目录
+        /// </summary>
+        /// <param name="path"></param>
+        /// <returns></returns>
+        public static string Parent(string path)
+        {
+            string p = path;
+            if (!string.IsNullOrWhiteSpace(p))
+            {
+                while (p.EndsWith("\\")) p = p.Substring(0, p.Length - 1);
+                if (StringTool.SubStringCount(p, "\\") >= 1)
+                {
+                    try
+                    {
+                        return Directory.GetParent(p).ToString();
+                    }
+                    catch (Exception e) { }
+                }
+            }
+            return p;
+        }
+        /// <summary>
+        /// 获取目录下的目录(一层)
+        /// </summary>
+        /// <param name="path"></param>
+        /// <returns></returns>
+        public static List<string> GetPath(string path)
+        {
+            if (Directory.Exists(path))
+                try { return Directory.EnumerateDirectories(path).ToList(); } catch (Exception e) { }
+            return null;
+        }
+        /// <summary>
+        /// 获取目录下所有目录(递归)
+        /// </summary>
+        /// <param name="path"></param>
+        /// <returns></returns>
+        public static List<string> GetAllPath(string path)
+        {
+            List<string> result = GetPath(path);
+            if (!ListTool.IsNullOrEmpty(result))
+            {
+                List<string> temp = new List<string>();
+                foreach (var item in result)
+                {
+                    List<string> t = GetAllPath(item);
+                    if (!ListTool.IsNullOrEmpty(t))
+                        temp.AddRange(t);
+                }
+                result.AddRange(temp);
+                return result;
+            }
+            return null;
+        }
+        /// <summary>
+        /// 判断目录是否为磁盘
+        /// </summary>
+        /// <param name="path"></param>
+        /// <returns></returns>
+        public static bool IsDriver(string path)
+        {
+            if (path != null && path.Length >= 2)
+            {
+                if (path.Substring(1, 1) == ":")
+                {
+                    return true;
+                }
+            }
+            return false;
+        }
+        /// <summary>
+        /// 获取文件所在的目录
+        /// </summary>
+        /// <param name="filePath"></param>
+        /// <returns></returns>
+        public static string GetFilePath(string filePath)
+        {
+            string result = "";
+            if (!string.IsNullOrWhiteSpace(filePath))
+            {
+                string fileName = Path.GetFileName(filePath);
+                result = filePath.Substring(0, filePath.Length - fileName.Length);
+            }
+            return result;
+        }
+        /// <summary>
+        /// 连接多个string构成目录
+        /// </summary>
+        /// <param name="paths"></param>
+        /// <returns></returns>
+        public static string Combine(params string[] paths)
+        {
+            if (ListTool.HasElements(paths))
+            {
+                if (paths.Length > 1)
+                {
+                    StringBuilder result = new StringBuilder(paths[0]);
+                    for (int i = 1; i < paths.Length; i++)
+                    {
+                        result.Append("\\");
+                        result.Append(paths[i]);
+                    }
+                    while (result.ToString().IndexOf("\\\\") >= 0)
+                    {
+                        result.Replace("\\\\", "\\");
+                    }
+                    return result.ToString();
+                }
+                else
+                {
+                    return paths[0];
+                }
+            }
+            return "";
+        }
+        /// <summary>
+        /// 路径包含关系
+        /// </summary>
+        /// <param name="path1"></param>
+        /// <param name="path2"></param>
+        /// <returns>
+        /// -1:不存在包含关系
+        /// 0:两个目录相同
+        /// 1:path1 包含 path2(path1 大)
+        /// 2:path2 包含 path1(path2 大)
+        /// </returns>
+        public static int Include(string path1, string path2)
+        {
+            if (path1 == path2) return 0;//两个目录相同
+
+            string p1 = Combine(path1 + "\\");
+            string p2 = Combine(path2 + "\\");
+
+            if (p1 == p2) return 0;//两个目录相同(防止路径后有带\或不带\的情况)
+            if (p1.Length > p2.Length && p1.Contains(p2)) return 1;//path1 包含 path2(path1 大)
+            if (p2.Length > p1.Length && p2.Contains(p1)) return 2;//path2 包含 path1(path2 大)
+
+            return -1;//不存在包含关系
+        }
+        public static string GetPathName(string s)
+        {
+            StringBuilder sb = new StringBuilder();
+            if (!string.IsNullOrWhiteSpace(s))
+            {
+                char[] c = s.ToArray();
+                for (int i = c.Length - 1; i >= 0; i--)
+                {
+                    if (c[i] != '\\') { sb.Append(c[i]); }
+                    else { if (sb.Length > 0) break; }
+                }
+                char[] mirror = sb.ToString().ToArray();
+                sb.Clear();
+                for (int i = mirror.Length - 1; i >= 0; i--)
+                {
+                    sb.Append(mirror[i]);
+                }
+            }
+            return sb.ToString();
+        }
+    }
+}

+ 36 - 0
Fork.Net/Azylee.Utils/Azylee.Core/Properties/AssemblyInfo.cs

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

+ 14 - 0
Fork.Net/Azylee.Utils/Azylee.Core/Readme.cs

@@ -0,0 +1,14 @@
+namespace Azylee.Core
+{
+    class Readme
+    {
+    }
+}
+
+//************************************************************************
+//      https://github.com/yuzhengyang
+//      author:     yuzhengyang
+//      date:       2017.3.29 - 2017.6.10
+//      desc:       工具描述
+//      Copyright (c) yuzhengyang. All rights reserved.
+//************************************************************************

+ 52 - 0
Fork.Net/Azylee.Utils/Azylee.ExeLaunch/Azylee.ExeLaunch.csproj

@@ -0,0 +1,52 @@
+<?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>{1AB11F85-BA96-4F82-8122-BB89E63FCCB1}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>Azylee.ExeLaunch</RootNamespace>
+    <AssemblyName>Azylee.ExeLaunch</AssemblyName>
+    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <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' ">
+    <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="Launch.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\Azylee.Core\Azylee.Core.csproj">
+      <Project>{88dc61fa-95f0-41b7-9d7d-ab0f3cbd169c}</Project>
+      <Name>Azylee.Core</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+</Project>

+ 61 - 0
Fork.Net/Azylee.Utils/Azylee.ExeLaunch/Launch.cs

@@ -0,0 +1,61 @@
+using Azylee.Core.Data.Collections;
+using Azylee.Core.Data.String;
+using Azylee.Core.Diagnostics;
+using Azylee.Core.IO.Dir;
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Text;
+
+namespace Azylee.ExeLaunch
+{
+    public class Launch
+    {
+        /// <summary>
+        /// 启动最新版本程序
+        /// </summary>
+        /// <param name="path"></param>
+        /// <param name="exe"></param>
+        /// <returns></returns>
+        public static bool Run(string appPath, string startfilename)
+        {
+            if (Directory.Exists(appPath))
+            {
+                //获取运行目录下所有文件
+                List<string> paths = DirTool.GetPath(appPath);
+                if (ListTool.HasElements(paths))
+                {
+                    //解析属于版本号的文件
+                    Version version = null;
+                    string startfile = null;
+                    foreach (var path in paths)
+                    {
+                        //只解析文件名带三个点的文件夹
+                        string filename = Path.GetFileName(path);
+                        if (StringTool.SubStringCount(filename, ".") == 3)
+                        {
+                            try
+                            {
+                                Version tempVersion = new Version(filename);
+                                string tempFile = DirTool.Combine(path, startfilename);
+                                if ((version == null || tempVersion > version) && File.Exists(tempFile))
+                                {
+                                    version = tempVersion;
+                                    startfile = tempFile;
+                                }
+                            }
+                            catch { }
+                        }
+                    }
+                    //准备启动
+                    if (startfile != null)
+                    {
+                        return ProcessTool.Start(startfile);
+                    }
+                }
+            }
+            return false;
+        } 
+    }
+}

+ 36 - 0
Fork.Net/Azylee.Utils/Azylee.ExeLaunch/Properties/AssemblyInfo.cs

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

Fork.Net/Fork.Net.Tools/Yuzhyn.WebUtils/HttpUtils/HttpTool.cs → Fork.Net/Azylee.Utils/Yuzhyn.WebUtils/HttpUtils/HttpTool.cs


Fork.Net/Fork.Net.Tools/Yuzhyn.WebUtils/Properties/AssemblyInfo.cs → Fork.Net/Azylee.Utils/Yuzhyn.WebUtils/Properties/AssemblyInfo.cs


Fork.Net/Fork.Net.Tools/Yuzhyn.WebUtils/Yuzhyn.WebUtils.csproj → Fork.Net/Azylee.Utils/Yuzhyn.WebUtils/Yuzhyn.WebUtils.csproj


+ 101 - 40
Fork.Net/Fork.Net.Tools/Y.Utils/AppUtils/AppLaunchTool.cs

@@ -1,10 +1,18 @@
-using System;
+//************************************************************************
+//      https://github.com/yuzhengyang
+//      author:     yuzhengyang
+//      date:       2017.10.12 - 2017.10.12
+//      desc:       客户端启动器
+//      Copyright (c) yuzhengyang. All rights reserved.
+//************************************************************************
+using System;
 using System.Collections.Generic;
 using System.IO;
 using System.Linq;
 using System.Text;
 using Y.Utils.DataUtils.Collections;
 using Y.Utils.DataUtils.StringUtils;
+using Y.Utils.IOUtils.FileUtils;
 using Y.Utils.IOUtils.PathUtils;
 using Y.Utils.WindowsUtils.ProcessUtils;
 
@@ -12,52 +20,69 @@ namespace Y.Utils.AppUtils
 {
     public static class AppLaunchTool
     {
-        public static bool Start(string appfile, string startfilename)
+        /// <summary>
+        /// 启动最新版本程序
+        /// </summary>
+        /// <param name="route">路径:程序版本文件夹路径</param>
+        /// <param name="startfilename">可执行文件名</param>
+        /// <returns></returns>
+        public static bool StartNewVersion(string route, string startfilename)
         {
-            if (File.Exists(appfile))
+            //判断路径是文件还是文件夹,并统一处理为文件夹
+            string appPath = route;
+            if (FileTool.IsFile(route))
+                appPath = DirTool.GetFilePath(route);
+
+            if (Directory.Exists(appPath))
             {
-                //获取程序运行目录
-                string exePath = DirTool.GetFilePath(appfile);
-                if (Directory.Exists(exePath))
+                //获取运行目录下所有文件
+                List<string> paths = DirTool.GetPath(appPath);
+                if (ListTool.HasElements(paths))
                 {
-                    //获取运行目录下所有文件
-                    List<string> paths = DirTool.GetPath(exePath);
-                    if (ListTool.HasElements(paths))
+                    //解析属于版本号的文件
+                    Version version = null;
+                    string startfile = null;
+                    foreach (var path in paths)
                     {
-                        //解析属于版本号的文件
-                        Version version = null;
-                        string startfile = null;
-                        foreach (var path in paths)
+                        //只解析文件名带三个点的文件夹
+                        string filename = Path.GetFileName(path);
+                        if (StringTool.SubStringCount(filename, ".") == 3)
                         {
-                            //只解析文件名带三个点的文件夹
-                            string filename = Path.GetFileName(path);
-                            if (StringTool.SubStringCount(filename, ".") == 3)
+                            try
                             {
-                                try
+                                Version tempVersion = new Version(filename);
+                                string tempFile = DirTool.Combine(path, startfilename);
+                                if ((version == null || tempVersion > version) && File.Exists(tempFile))
                                 {
-                                    Version tempVersion = new Version(filename);
-                                    string tempFile = DirTool.Combine(path, startfilename);
-                                    if ((version == null || tempVersion > version) && File.Exists(tempFile))
-                                    {
-                                        version = tempVersion;
-                                        startfile = tempFile;
-                                    }
+                                    version = tempVersion;
+                                    startfile = tempFile;
                                 }
-                                catch { }
                             }
-                        }
-                        //准备启动
-                        if (startfile != null)
-                        {
-                            return ProcessTool.Start(startfile);
+                            catch { }
                         }
                     }
+                    //准备启动
+                    if (startfile != null)
+                    {
+                        return ProcessTool.Start(startfile);
+                    }
                 }
             }
             return false;
         }
-        public static bool StartNewVersion(string appPath, string startfilename)
+        /// <summary>
+        /// 查询是否有最新版本程序可以执行
+        /// </summary>
+        /// <param name="route">路径:程序版本文件夹路径</param>
+        /// <param name="startfilename">可执行文件名</param>
+        /// <returns></returns>
+        public static bool HasNewVersion(string route, string startfilename)
         {
+            //判断路径是文件还是文件夹,并统一处理为文件夹
+            string appPath = route;
+            if (FileTool.IsFile(route))
+                appPath = DirTool.GetFilePath(route);
+
             if (Directory.Exists(appPath))
             {
                 //获取运行目录下所有文件
@@ -65,8 +90,49 @@ namespace Y.Utils.AppUtils
                 if (ListTool.HasElements(paths))
                 {
                     //解析属于版本号的文件
-                    Version version = null;
-                    string startfile = null;
+                    foreach (var path in paths)
+                    {
+                        //只解析文件名带三个点的文件夹
+                        string filename = Path.GetFileName(path);
+                        if (StringTool.SubStringCount(filename, ".") == 3)
+                        {
+                            try
+                            {
+                                //有版本命名的文件,且文件中有exe程序
+                                Version tempVersion = new Version(filename);
+                                string tempFile = DirTool.Combine(path, startfilename);
+                                if (File.Exists(tempFile)) return true;
+                            }
+                            catch { }
+                        }
+                    }
+                }
+            }
+            return false;
+        }
+        /// <summary>
+        /// 获取最新版本号
+        /// </summary>
+        /// <param name="route">路径:程序版本文件夹路径</param>
+        /// <param name="startfilename">可执行文件名</param>
+        /// <returns></returns>
+        public static Version GetNewVersion(string route, string startfilename)
+        {
+            //解析属于版本号的文件
+            Version version = null;
+            string startfile = null;
+
+            //判断路径是文件还是文件夹,并统一处理为文件夹
+            string appPath = route;
+            if (FileTool.IsFile(route))
+                appPath = DirTool.GetFilePath(route);
+
+            if (Directory.Exists(appPath))
+            {
+                //获取运行目录下所有文件
+                List<string> paths = DirTool.GetPath(appPath);
+                if (ListTool.HasElements(paths))
+                { 
                     foreach (var path in paths)
                     {
                         //只解析文件名带三个点的文件夹
@@ -85,15 +151,10 @@ namespace Y.Utils.AppUtils
                             }
                             catch { }
                         }
-                    }
-                    //准备启动
-                    if (startfile != null)
-                    {
-                        return ProcessTool.Start(startfile);
-                    }
+                    } 
                 }
             }
-            return false;
+            return version;
         }
     }
 }

+ 71 - 0
Fork.Net/Fork.Net.Tools/Y.Utils/AppUtils/AppSettleTool.cs

@@ -0,0 +1,71 @@
+//************************************************************************
+//      https://github.com/yuzhengyang
+//      author:     yuzhengyang
+//      date:       2017.10.12 - 2017.10.12
+//      desc:       客户端定居工具
+//      Copyright (c) yuzhengyang. All rights reserved.
+//************************************************************************
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Text;
+using Y.Utils.IOUtils.FileUtils;
+using Y.Utils.IOUtils.PathUtils;
+
+namespace Y.Utils.AppUtils
+{
+    /// <summary>
+    /// 客户端定居工具
+    /// </summary>
+    public class AppSettleTool
+    {
+        /// <summary>
+        /// 判断是否已定居
+        /// </summary>
+        /// <param name="path">定居路径</param>
+        /// <param name="list">货物清单</param>
+        /// <returns></returns>
+        public static bool IsSettle(string path, Dictionary<string, string> list)
+        {
+            if (Directory.Exists(path))
+            {
+                if (list != null)
+                {
+                    bool allOk = true;
+                    foreach (var l in list)
+                    {
+                        if (!string.IsNullOrWhiteSpace(l.Value))
+                            allOk &= File.Exists(l.Value);
+                    }
+                    return allOk;
+                }
+                else
+                {
+                    return true;
+                }
+            }
+            return false;
+        }
+        /// <summary>
+        /// 定居
+        /// </summary>
+        /// <param name="path">定居路径</param>
+        /// <param name="list">货物清单</param>
+        /// <returns></returns>
+        public static bool Settle(string path, Dictionary<string, string> list)
+        {
+            if (DirTool.Create(path))
+            {
+                if (list != null)
+                {
+                    foreach (var l in list)
+                    {
+                        FileTool.Copy(l.Key, l.Value, true);
+                    }
+                }
+            }
+            return IsSettle(path, list);
+        }
+    }
+}

+ 17 - 0
Fork.Net/Fork.Net.Tools/Y.Utils/IOUtils/FileUtils/FileTool.cs

@@ -253,5 +253,22 @@ namespace Y.Utils.IOUtils.FileUtils
             }
             return result;
         }
+        public static bool Copy(string sourceFileName, string destFileName, bool overwrite)
+        {
+            if (File.Exists(sourceFileName))
+            {
+                string destPath = DirTool.GetFilePath(destFileName);
+                if (DirTool.Create(destPath))
+                {
+                    try
+                    {
+                        File.Copy(sourceFileName, destFileName, overwrite);
+                        return true;
+                    }
+                    catch { }
+                }
+            }
+            return false;
+        }
     }
 }

+ 1 - 1
Fork.Net/Fork.Net.Tools/Y.Utils/Readme.cs

@@ -8,7 +8,7 @@
 //************************************************************************
 //      https://github.com/yuzhengyang
 //      author:     yuzhengyang
-//      date:       2017.3.29 - 2017.6.10
+//      date:       2017.10.12 - 2017.10.12
 //      desc:       工具描述
 //      Copyright (c) yuzhengyang. All rights reserved.
 //************************************************************************

+ 6 - 3
Fork.Net/Fork.Net.Tools/Y.Utils/WindowsUtils/ProcessUtils/ProcessTool.cs

@@ -43,10 +43,13 @@ namespace Y.Utils.WindowsUtils.ProcessUtils
             try
             {
                 Process[] processes = Process.GetProcessesByName(name);
-                foreach (Process p in processes)
+                if (ListTool.HasElements(processes))
                 {
-                    p.Kill();
-                    p.Close();
+                    foreach (Process p in processes)
+                    {
+                        p.Kill();
+                        p.Close();
+                    }
                 }
             }
             catch (Exception e) { }

+ 1 - 0
Fork.Net/Fork.Net.Tools/Y.Utils/Y.Utils.csproj

@@ -51,6 +51,7 @@
   </ItemGroup>
   <ItemGroup>
     <Compile Include="AppUtils\AppLaunchTool.cs" />
+    <Compile Include="AppUtils\AppSettleTool.cs" />
     <Compile Include="AppUtils\AppUnique.cs" />
     <Compile Include="DataUtils\DateTimeUtils\DateTool.cs" />
     <Compile Include="IOUtils\ImageUtils\ImageSpliter.cs" />

+ 39 - 4
Fork.Net/Fork.Net.sln

@@ -1,7 +1,7 @@
 
 Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio 14
-VisualStudioVersion = 14.0.25420.1
+# Visual Studio 15
+VisualStudioVersion = 15.0.26730.12
 MinimumVisualStudioVersion = 10.0.40219.1
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Fork.Net", "Fork.Net\Fork.Net.csproj", "{A8EBC472-2AF6-41B1-B1A0-C4D28D165C02}"
 EndProject
@@ -53,7 +53,15 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Y.Skin", "Fork.Net.Tools\Y.
 EndProject
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Y.Utils", "Fork.Net.Tools\Y.Utils\Y.Utils.csproj", "{5B8EEEC7-AEB5-407D-9DC1-1C59E53F78D5}"
 EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Yuzhyn.WebUtils", "Fork.Net.Tools\Yuzhyn.WebUtils\Yuzhyn.WebUtils.csproj", "{61FD5609-8D6D-434B-9A90-7719D45DF8D2}"
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Azylee.Utils", "Azylee.Utils", "{C34A95B5-5F83-46E3-868A-56BDDA2D0B87}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Yuzhyn.WebUtils", "Azylee.Utils\Yuzhyn.WebUtils\Yuzhyn.WebUtils.csproj", "{61FD5609-8D6D-434B-9A90-7719D45DF8D2}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Azylee.Core", "Azylee.Utils\Azylee.Core\Azylee.Core.csproj", "{88DC61FA-95F0-41B7-9D7D-AB0F3CBD169C}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Azylee.ExeLaunch", "Azylee.Utils\Azylee.ExeLaunch\Azylee.ExeLaunch.csproj", "{1AB11F85-BA96-4F82-8122-BB89E63FCCB1}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AppSettle.Test", "Test\AppSettle.Test\AppSettle.Test.csproj", "{3C32DCA5-4E44-4701-A0C5-FA19272C128B}"
 EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -231,6 +239,30 @@ Global
 		{61FD5609-8D6D-434B-9A90-7719D45DF8D2}.Release|Any CPU.Build.0 = Release|Any CPU
 		{61FD5609-8D6D-434B-9A90-7719D45DF8D2}.Release|x86.ActiveCfg = Release|Any CPU
 		{61FD5609-8D6D-434B-9A90-7719D45DF8D2}.Release|x86.Build.0 = Release|Any CPU
+		{88DC61FA-95F0-41B7-9D7D-AB0F3CBD169C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{88DC61FA-95F0-41B7-9D7D-AB0F3CBD169C}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{88DC61FA-95F0-41B7-9D7D-AB0F3CBD169C}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{88DC61FA-95F0-41B7-9D7D-AB0F3CBD169C}.Debug|x86.Build.0 = Debug|Any CPU
+		{88DC61FA-95F0-41B7-9D7D-AB0F3CBD169C}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{88DC61FA-95F0-41B7-9D7D-AB0F3CBD169C}.Release|Any CPU.Build.0 = Release|Any CPU
+		{88DC61FA-95F0-41B7-9D7D-AB0F3CBD169C}.Release|x86.ActiveCfg = Release|Any CPU
+		{88DC61FA-95F0-41B7-9D7D-AB0F3CBD169C}.Release|x86.Build.0 = Release|Any CPU
+		{1AB11F85-BA96-4F82-8122-BB89E63FCCB1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{1AB11F85-BA96-4F82-8122-BB89E63FCCB1}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{1AB11F85-BA96-4F82-8122-BB89E63FCCB1}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{1AB11F85-BA96-4F82-8122-BB89E63FCCB1}.Debug|x86.Build.0 = Debug|Any CPU
+		{1AB11F85-BA96-4F82-8122-BB89E63FCCB1}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{1AB11F85-BA96-4F82-8122-BB89E63FCCB1}.Release|Any CPU.Build.0 = Release|Any CPU
+		{1AB11F85-BA96-4F82-8122-BB89E63FCCB1}.Release|x86.ActiveCfg = Release|Any CPU
+		{1AB11F85-BA96-4F82-8122-BB89E63FCCB1}.Release|x86.Build.0 = Release|Any CPU
+		{3C32DCA5-4E44-4701-A0C5-FA19272C128B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{3C32DCA5-4E44-4701-A0C5-FA19272C128B}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{3C32DCA5-4E44-4701-A0C5-FA19272C128B}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{3C32DCA5-4E44-4701-A0C5-FA19272C128B}.Debug|x86.Build.0 = Debug|Any CPU
+		{3C32DCA5-4E44-4701-A0C5-FA19272C128B}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{3C32DCA5-4E44-4701-A0C5-FA19272C128B}.Release|Any CPU.Build.0 = Release|Any CPU
+		{3C32DCA5-4E44-4701-A0C5-FA19272C128B}.Release|x86.ActiveCfg = Release|Any CPU
+		{3C32DCA5-4E44-4701-A0C5-FA19272C128B}.Release|x86.Build.0 = Release|Any CPU
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
@@ -255,7 +287,10 @@ Global
 		{3ECA2CC6-55C2-433F-A617-A7376E455F7C} = {F222E566-DA0C-443C-BB9F-80536F02DB36}
 		{E9A97673-3E27-4A49-90BC-8806411A2F57} = {F222E566-DA0C-443C-BB9F-80536F02DB36}
 		{5B8EEEC7-AEB5-407D-9DC1-1C59E53F78D5} = {F222E566-DA0C-443C-BB9F-80536F02DB36}
-		{61FD5609-8D6D-434B-9A90-7719D45DF8D2} = {F222E566-DA0C-443C-BB9F-80536F02DB36}
+		{61FD5609-8D6D-434B-9A90-7719D45DF8D2} = {C34A95B5-5F83-46E3-868A-56BDDA2D0B87}
+		{88DC61FA-95F0-41B7-9D7D-AB0F3CBD169C} = {C34A95B5-5F83-46E3-868A-56BDDA2D0B87}
+		{1AB11F85-BA96-4F82-8122-BB89E63FCCB1} = {C34A95B5-5F83-46E3-868A-56BDDA2D0B87}
+		{3C32DCA5-4E44-4701-A0C5-FA19272C128B} = {A89FC45A-A907-4487-8719-114530A62684}
 	EndGlobalSection
 	GlobalSection(ExtensibilityGlobals) = postSolution
 		SolutionGuid = {5436696D-5F55-490A-AB40-050B54BE2AB4}

+ 83 - 0
Fork.Net/Test/AppSettle.Test/AppSettle.Test.csproj

@@ -0,0 +1,83 @@
+<?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>{3C32DCA5-4E44-4701-A0C5-FA19272C128B}</ProjectGuid>
+    <OutputType>WinExe</OutputType>
+    <RootNamespace>AppSettle.Test</RootNamespace>
+    <AssemblyName>AppSettle.Test</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.Deployment" />
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Windows.Forms" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Form1.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="Form1.Designer.cs">
+      <DependentUpon>Form1.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Program.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <EmbeddedResource Include="Form1.resx">
+      <DependentUpon>Form1.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>
+    <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>
+    <ProjectReference Include="..\..\Fork.Net.Tools\Y.Utils\Y.Utils.csproj">
+      <Project>{5b8eeec7-aeb5-407d-9dc1-1c59e53f78d5}</Project>
+      <Name>Y.Utils</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+</Project>

+ 48 - 0
Fork.Net/Test/AppSettle.Test/Form1.Designer.cs

@@ -0,0 +1,48 @@
+namespace AppSettle.Test
+{
+    partial class Form1
+    {
+        /// <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()
+        {
+            this.SuspendLayout();
+            // 
+            // Form1
+            // 
+            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.ClientSize = new System.Drawing.Size(284, 261);
+            this.Name = "Form1";
+            this.Text = "Form1";
+            this.Load += new System.EventHandler(this.Form1_Load);
+            this.ResumeLayout(false);
+
+        }
+
+        #endregion
+    }
+}
+

+ 24 - 0
Fork.Net/Test/AppSettle.Test/Form1.cs

@@ -0,0 +1,24 @@
+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 AppSettle.Test
+{
+    public partial class Form1 : Form
+    {
+        public Form1()
+        {
+            InitializeComponent();
+        }
+
+        private void Form1_Load(object sender, EventArgs e)
+        {
+
+        }
+    }
+}

+ 120 - 0
Fork.Net/Test/AppSettle.Test/Form1.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>

+ 29 - 0
Fork.Net/Test/AppSettle.Test/Program.cs

@@ -0,0 +1,29 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Windows.Forms;
+using Y.Utils.AppUtils;
+using Y.Utils.IOUtils.PathUtils;
+
+namespace AppSettle.Test
+{
+    static class Program
+    {
+        /// <summary>
+        /// 应用程序的主入口点。
+        /// </summary>
+        [STAThread]
+        static void Main()
+        {
+            //string path = DirTool.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "AppSettle.Test");
+            //Dictionary<string, string> list = new Dictionary<string, string>();
+            //list.Add(Application.ExecutablePath, DirTool.Combine(path, Path.GetFileName(Application.ExecutablePath)));
+            //bool flag = AppSettleTool.Settle(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), list);
+
+            Application.EnableVisualStyles();
+            Application.SetCompatibleTextRenderingDefault(false);
+            Application.Run(new Form1());
+        }
+    }
+}

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

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

+ 71 - 0
Fork.Net/Test/AppSettle.Test/Properties/Resources.Designer.cs

@@ -0,0 +1,71 @@
+//------------------------------------------------------------------------------
+// <auto-generated>
+//     此代码由工具生成。
+//     运行时版本: 4.0.30319.42000
+//
+//     对此文件的更改可能导致不正确的行为,如果
+//     重新生成代码,则所做更改将丢失。
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace AppSettle.Test.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("AppSettle.Test.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/Test/AppSettle.Test/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/Test/AppSettle.Test/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 AppSettle.Test.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/Test/AppSettle.Test/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>

+ 0 - 2
Fork.Net/Test/Y.Test/Commons/R.cs

@@ -1,7 +1,5 @@
 using System;
 using System.Collections.Generic;
-using System.Linq;
-using System.Text;
 using Y.Utils.IOUtils.PathUtils;
 using Y.Utils.WindowsUtils.FormUtils;
 

+ 1 - 0
Fork.Net/Test/Y.Test/Program.cs

@@ -1,5 +1,6 @@
 using System;
 using System.Collections.Generic;
+using System.IO;
 using System.Linq;
 using System.Text.RegularExpressions;
 using System.Threading.Tasks;

+ 10 - 0
Fork.Net/Test/Y.Test/Y.Test.csproj

@@ -259,6 +259,16 @@
     <None Include="FodyWeavers.xml" />
     <Content Include="Images\BackgroundImages\Rainbow.png" />
   </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\Fork.Net.Tools\Y.Skin\Y.Skin.csproj">
+      <Project>{e9a97673-3e27-4a49-90bc-8806411a2f57}</Project>
+      <Name>Y.Skin</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\Fork.Net.Tools\Y.Utils\Y.Utils.csproj">
+      <Project>{5b8eeec7-aeb5-407d-9dc1-1c59e53f78d5}</Project>
+      <Name>Y.Utils</Name>
+    </ProjectReference>
+  </ItemGroup>
   <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
   <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
     <PropertyGroup>