懒得勤快 2 年之前
父节点
当前提交
7c90531034

+ 1 - 1
Masuit.Tools.Abstractions/Masuit.Tools.Abstractions.csproj

@@ -3,7 +3,7 @@
         <TargetFrameworks>netstandard2.0;netstandard2.1;net461;net5;net6;net7</TargetFrameworks>
         <LangVersion>latest</LangVersion>
         <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
-        <Version>2.6.6.2</Version>
+        <Version>2.6.6.3</Version>
         <Authors>懒得勤快</Authors>
         <Description>新手友好的C#万能工具库,码数吐司库,Masuit.Tools基础公共库(适用于.NET4.6.1/.NET Standard2.0及以上项目),包含一些常用的操作类,大都是静态类,加密解密,反射操作,Excel简单导出,权重随机筛选算法,分布式短id,表达式树,linq扩展,文件压缩,多线程下载和FTP客户端,硬件信息,字符串扩展方法,日期时间扩展操作,中国农历,大文件拷贝,图像裁剪,验证码,断点续传,集合扩展等常用封装。
             官网教程:https://tools.masuit.org

+ 147 - 142
Masuit.Tools.Abstractions/Systems/SnowFlake.cs

@@ -6,146 +6,151 @@ using System.Net.NetworkInformation;
 
 namespace Masuit.Tools.Systems
 {
-    /// <summary>
-    /// 动态生产有规律的分布式ID
-    /// </summary>
-    public class SnowFlake
-    {
-        #region 私有字段
-
-        private static long _machineId; //机器码
-        private static long _sequence; //计数从零开始
-        private static long _lastTimestamp = -1L; //最后时间戳
-
-        private const long Twepoch = 687888001020L; //唯一时间随机量
-
-        private const int MachineBits = 10; //机器码字节数
-
-        private const int SequenceBits = 12; //计数器字节数,12个字节用来保存计数码
-        private const int MachineLeft = SequenceBits; //机器码数据左移位数,就是后面计数器占用的位数
-        private const long TimestampLeft = MachineBits + SequenceBits; //时间戳左移动位数就是机器码+计数器总字节数+数据字节数
-        private const long SequenceMask = -1L ^ -1L << SequenceBits; //一毫秒内可以产生计数,如果达到该值则等到下一毫秒在进行生成
-
-        private static readonly object SyncRoot = new object(); //加锁对象
-        private static NumberFormater _numberFormater = new NumberFormater(36);
-        private static SnowFlake _snowFlake;
-
-        #endregion 私有字段
-
-        /// <summary>
-        /// 获取一个新的id
-        /// </summary>
-        public static string NewId => GetInstance().GetUniqueId();
-
-        /// <summary>
-        /// 创建一个实例
-        /// </summary>
-        /// <returns></returns>
-        public static SnowFlake GetInstance()
-        {
-            return _snowFlake ??= new SnowFlake();
-        }
-
-        /// <summary>
-        /// 默认构造函数
-        /// </summary>
-        public SnowFlake()
-        {
-            var bytes = NetworkInterface.GetAllNetworkInterfaces().FirstOrDefault().GetPhysicalAddress().GetAddressBytes();
-            Snowflakes(bytes[4] << 4 | bytes[5]);
-        }
-
-        /// <summary>
-        /// 构造函数
-        /// </summary>
-        /// <param name="machineId">机器码</param>
-        public SnowFlake(long machineId)
-        {
-            Snowflakes(machineId);
-        }
-
-        private void Snowflakes(long machineId)
-        {
-            if (machineId >= 0)
-            {
-                if (machineId > 1024)
-                {
-                    throw new Exception("机器码ID非法");
-                }
-
-                _machineId = machineId;
-            }
-        }
-
-        /// <summary>
-        /// 设置数制格式化器
-        /// </summary>
-        /// <param name="nf"></param>
-        public static void SetNumberFormater(NumberFormater nf)
-        {
-            _numberFormater = nf;
-        }
-
-        /// <summary>
-        /// 获取长整形的ID
-        /// </summary>
-        /// <returns></returns>
-        public long GetLongId()
-        {
-            lock (SyncRoot)
-            {
-                var timestamp = DateTime.UtcNow.GetTotalMilliseconds();
-                if (_lastTimestamp == timestamp)
-                {
-                    //同一毫秒中生成ID
-                    _sequence = (_sequence + 1) & SequenceMask; //用&运算计算该毫秒内产生的计数是否已经到达上限
-                    if (_sequence == 0)
-                    {
-                        //一毫秒内产生的ID计数已达上限,等待下一毫秒
-                        timestamp = DateTime.UtcNow.GetTotalMilliseconds();
-                    }
-                }
-                else
-                {
-                    //不同毫秒生成ID
-                    _sequence = 0L;
-                }
-
-                _lastTimestamp = timestamp; //把当前时间戳保存为最后生成ID的时间戳
-                long id = ((timestamp - Twepoch) << (int)TimestampLeft) | (_machineId << MachineLeft) | _sequence;
-                return id;
-            }
-        }
-
-        /// <summary>
-        /// 获取一个字符串表示形式的id
-        /// </summary>
-        /// <returns></returns>
-        public string GetUniqueId()
-        {
-            return _numberFormater.ToString(GetLongId());
-        }
-
-        /// <summary>
-        /// 获取一个字符串表示形式的id
-        /// </summary>
-        /// <param name="maxLength">最大长度,至少6位</param>
-        /// <returns></returns>
-        public string GetUniqueShortId(int maxLength = 8)
-        {
-            if (maxLength < 6)
-            {
-                throw new ArgumentException("最大长度至少需要6位");
-            }
-
-            string id = GetUniqueId();
-            int index = id.Length - maxLength;
-            if (index < 0)
-            {
-                index = 0;
-            }
-
-            return id.Substring(index);
-        }
-    }
+	/// <summary>
+	/// 动态生产有规律的分布式ID
+	/// </summary>
+	public class SnowFlake
+	{
+		#region 私有字段
+
+		private static long _machineId; //机器码
+		private static long _sequence; //计数从零开始
+		private static long _lastTimestamp = -1L; //最后时间戳
+
+		private const long Twepoch = 687888001020L; //唯一时间随机量
+
+		private const int MachineBits = 10; //机器码字节数
+
+		private const int SequenceBits = 12; //计数器字节数,12个字节用来保存计数码
+		private const int MachineLeft = SequenceBits; //机器码数据左移位数,就是后面计数器占用的位数
+		private const long TimestampLeft = MachineBits + SequenceBits; //时间戳左移动位数就是机器码+计数器总字节数+数据字节数
+		private const long SequenceMask = -1L ^ -1L << SequenceBits; //一毫秒内可以产生计数,如果达到该值则等到下一毫秒在进行生成
+
+		private static readonly object SyncRoot = new object(); //加锁对象
+		private static NumberFormater _numberFormater = new NumberFormater(36);
+		private static SnowFlake _snowFlake;
+
+		#endregion 私有字段
+
+		/// <summary>
+		/// 获取一个新的id
+		/// </summary>
+		public static string NewId => GetInstance().GetUniqueId();
+
+		/// <summary>
+		/// 获取一个新的id
+		/// </summary>
+		public static long LongId => GetInstance().GetLongId();
+
+		/// <summary>
+		/// 创建一个实例
+		/// </summary>
+		/// <returns></returns>
+		public static SnowFlake GetInstance()
+		{
+			return _snowFlake ??= new SnowFlake();
+		}
+
+		/// <summary>
+		/// 默认构造函数
+		/// </summary>
+		public SnowFlake()
+		{
+			var bytes = NetworkInterface.GetAllNetworkInterfaces().FirstOrDefault().GetPhysicalAddress().GetAddressBytes();
+			Snowflakes(bytes[4] << 4 | bytes[5]);
+		}
+
+		/// <summary>
+		/// 构造函数
+		/// </summary>
+		/// <param name="machineId">机器码</param>
+		public SnowFlake(long machineId)
+		{
+			Snowflakes(machineId);
+		}
+
+		private void Snowflakes(long machineId)
+		{
+			if (machineId >= 0)
+			{
+				if (machineId > 1024)
+				{
+					throw new Exception("机器码ID非法");
+				}
+
+				_machineId = machineId;
+			}
+		}
+
+		/// <summary>
+		/// 设置数制格式化器
+		/// </summary>
+		/// <param name="nf"></param>
+		public static void SetNumberFormater(NumberFormater nf)
+		{
+			_numberFormater = nf;
+		}
+
+		/// <summary>
+		/// 获取长整形的ID
+		/// </summary>
+		/// <returns></returns>
+		public long GetLongId()
+		{
+			lock (SyncRoot)
+			{
+				var timestamp = DateTime.UtcNow.GetTotalMilliseconds();
+				if (_lastTimestamp == timestamp)
+				{
+					//同一毫秒中生成ID
+					_sequence = (_sequence + 1) & SequenceMask; //用&运算计算该毫秒内产生的计数是否已经到达上限
+					if (_sequence == 0)
+					{
+						//一毫秒内产生的ID计数已达上限,等待下一毫秒
+						timestamp = DateTime.UtcNow.GetTotalMilliseconds();
+					}
+				}
+				else
+				{
+					//不同毫秒生成ID
+					_sequence = 0L;
+				}
+
+				_lastTimestamp = timestamp; //把当前时间戳保存为最后生成ID的时间戳
+				long id = ((timestamp - Twepoch) << (int)TimestampLeft) | (_machineId << MachineLeft) | _sequence;
+				return id;
+			}
+		}
+
+		/// <summary>
+		/// 获取一个字符串表示形式的id
+		/// </summary>
+		/// <returns></returns>
+		public string GetUniqueId()
+		{
+			return _numberFormater.ToString(GetLongId());
+		}
+
+		/// <summary>
+		/// 获取一个字符串表示形式的id
+		/// </summary>
+		/// <param name="maxLength">最大长度,至少6位</param>
+		/// <returns></returns>
+		public string GetUniqueShortId(int maxLength = 8)
+		{
+			if (maxLength < 6)
+			{
+				throw new ArgumentException("最大长度至少需要6位");
+			}
+
+			string id = GetUniqueId();
+			int index = id.Length - maxLength;
+			if (index < 0)
+			{
+				index = 0;
+			}
+
+			return id.Substring(index);
+		}
+	}
 }

+ 108 - 103
Masuit.Tools.Abstractions/Systems/SnowFlakeNew.cs

@@ -11,117 +11,122 @@ namespace Masuit.Tools.Systems;
 /// </summary>
 public class SnowFlakeNew
 {
-    private readonly long _workerId; //机器ID
-    private const long Twepoch = 1692079923000L; //唯一时间随机量
-    private static long _sequence;
-    private const int SequenceBits = 12; //计数器字节数,10个字节用来保存计数码
-    private const long SequenceMask = -1L ^ -1L << SequenceBits; //一微秒内可以产生计数,如果达到该值则等到下一微妙在进行生成
-    private static long _lastTimestamp = -1L;
-    private static readonly object LockObj = new object();
-    private static NumberFormater _numberFormater = new NumberFormater(36);
-    private static SnowFlakeNew _snowFlake;
+	private readonly long _workerId; //机器ID
+	private const long Twepoch = 1692079923000L; //唯一时间随机量
+	private static long _sequence;
+	private const int SequenceBits = 12; //计数器字节数,10个字节用来保存计数码
+	private const long SequenceMask = -1L ^ -1L << SequenceBits; //一微秒内可以产生计数,如果达到该值则等到下一微妙在进行生成
+	private static long _lastTimestamp = -1L;
+	private static readonly object LockObj = new object();
+	private static NumberFormater _numberFormater = new NumberFormater(36);
+	private static SnowFlakeNew _snowFlake;
 
-    /// <summary>
-    /// 获取一个新的id
-    /// </summary>
-    public static string NewId => GetInstance().GetUniqueId();
+	/// <summary>
+	/// 获取一个新的id
+	/// </summary>
+	public static string NewId => GetInstance().GetUniqueId();
 
-    /// <summary>
-    /// 创建一个实例
-    /// </summary>
-    /// <returns></returns>
-    public static SnowFlakeNew GetInstance()
-    {
-        return _snowFlake ??= new SnowFlakeNew();
-    }
+	/// <summary>
+	/// 获取一个新的id
+	/// </summary>
+	public static long LongId => GetInstance().GetLongId();
 
-    /// <summary>
-    /// 默认构造函数
-    /// </summary>
-    public SnowFlakeNew()
-    {
-        var bytes = NetworkInterface.GetAllNetworkInterfaces().FirstOrDefault().GetPhysicalAddress().GetAddressBytes();
-        _workerId = bytes[4] << 4 | bytes[5];
-    }
+	/// <summary>
+	/// 创建一个实例
+	/// </summary>
+	/// <returns></returns>
+	public static SnowFlakeNew GetInstance()
+	{
+		return _snowFlake ??= new SnowFlakeNew();
+	}
 
-    /// <summary>
-    /// 构造函数
-    /// </summary>
-    /// <param name="machineId">机器码</param>
-    public SnowFlakeNew(int machineId)
-    {
-        _workerId = machineId;
-    }
+	/// <summary>
+	/// 默认构造函数
+	/// </summary>
+	public SnowFlakeNew()
+	{
+		var bytes = NetworkInterface.GetAllNetworkInterfaces().FirstOrDefault().GetPhysicalAddress().GetAddressBytes();
+		_workerId = bytes[4] << 4 | bytes[5];
+	}
 
-    /// <summary>
-    /// 设置数制格式化器
-    /// </summary>
-    /// <param name="nf"></param>
-    public static void SetNumberFormater(NumberFormater nf)
-    {
-        _numberFormater = nf;
-    }
+	/// <summary>
+	/// 构造函数
+	/// </summary>
+	/// <param name="machineId">机器码</param>
+	public SnowFlakeNew(int machineId)
+	{
+		_workerId = machineId;
+	}
 
-    public long GetLongId()
-    {
-        lock (LockObj)
-        {
-            long timestamp = DateTime.Now.GetTotalMilliseconds();
-            if (_lastTimestamp == timestamp)
-            { //同一微妙中生成ID
-                _sequence = (_sequence + 1) & SequenceMask; //用&运算计算该微秒内产生的计数是否已经到达上限
-                if (_sequence == 0)
-                {
-                    //一微妙内产生的ID计数已达上限,等待下一微妙
-                    timestamp = DateTime.Now.GetTotalMilliseconds();
-                    while (timestamp <= _lastTimestamp)
-                    {
-                        timestamp = DateTime.Now.GetTotalMilliseconds();
-                    }
-                    return timestamp;
-                }
-            }
-            else
-            { //不同微秒生成ID
-                _sequence = 0; //计数清0
-            }
-            if (timestamp < _lastTimestamp)
-            { //如果当前时间戳比上一次生成ID时时间戳还小,抛出异常,因为不能保证现在生成的ID之前没有生成过
-                throw new Exception($"Clock moved backwards.  Refusing to generate id for {_lastTimestamp - timestamp} milliseconds");
-            }
-            _lastTimestamp = timestamp; //把当前时间戳保存为最后生成ID的时间戳
-            return _workerId << 52 | (timestamp - Twepoch << 12) | _sequence;
-        }
-    }
+	/// <summary>
+	/// 设置数制格式化器
+	/// </summary>
+	/// <param name="nf"></param>
+	public static void SetNumberFormater(NumberFormater nf)
+	{
+		_numberFormater = nf;
+	}
 
-    /// <summary>
-    /// 获取一个字符串表示形式的id
-    /// </summary>
-    /// <returns></returns>
-    public string GetUniqueId()
-    {
-        return _numberFormater.ToString(GetLongId());
-    }
+	public long GetLongId()
+	{
+		lock (LockObj)
+		{
+			long timestamp = DateTime.Now.GetTotalMilliseconds();
+			if (_lastTimestamp == timestamp)
+			{ //同一微妙中生成ID
+				_sequence = (_sequence + 1) & SequenceMask; //用&运算计算该微秒内产生的计数是否已经到达上限
+				if (_sequence == 0)
+				{
+					//一微妙内产生的ID计数已达上限,等待下一微妙
+					timestamp = DateTime.Now.GetTotalMilliseconds();
+					while (timestamp <= _lastTimestamp)
+					{
+						timestamp = DateTime.Now.GetTotalMilliseconds();
+					}
+					return timestamp;
+				}
+			}
+			else
+			{ //不同微秒生成ID
+				_sequence = 0; //计数清0
+			}
+			if (timestamp < _lastTimestamp)
+			{ //如果当前时间戳比上一次生成ID时时间戳还小,抛出异常,因为不能保证现在生成的ID之前没有生成过
+				throw new Exception($"Clock moved backwards.  Refusing to generate id for {_lastTimestamp - timestamp} milliseconds");
+			}
+			_lastTimestamp = timestamp; //把当前时间戳保存为最后生成ID的时间戳
+			return _workerId << 52 | (timestamp - Twepoch << 12) | _sequence;
+		}
+	}
 
-    /// <summary>
-    /// 获取一个字符串表示形式的id
-    /// </summary>
-    /// <param name="maxLength">最大长度,至少6位</param>
-    /// <returns></returns>
-    public string GetUniqueShortId(int maxLength = 8)
-    {
-        if (maxLength < 6)
-        {
-            throw new ArgumentException("最大长度至少需要6位");
-        }
+	/// <summary>
+	/// 获取一个字符串表示形式的id
+	/// </summary>
+	/// <returns></returns>
+	public string GetUniqueId()
+	{
+		return _numberFormater.ToString(GetLongId());
+	}
 
-        string id = GetUniqueId();
-        int index = id.Length - maxLength;
-        if (index < 0)
-        {
-            index = 0;
-        }
+	/// <summary>
+	/// 获取一个字符串表示形式的id
+	/// </summary>
+	/// <param name="maxLength">最大长度,至少6位</param>
+	/// <returns></returns>
+	public string GetUniqueShortId(int maxLength = 8)
+	{
+		if (maxLength < 6)
+		{
+			throw new ArgumentException("最大长度至少需要6位");
+		}
 
-        return id.Substring(index);
-    }
+		string id = GetUniqueId();
+		int index = id.Length - maxLength;
+		if (index < 0)
+		{
+			index = 0;
+		}
+
+		return id.Substring(index);
+	}
 }

+ 1 - 1
Masuit.Tools.AspNetCore/Masuit.Tools.AspNetCore.csproj

@@ -18,7 +18,7 @@
         <Product>Masuit.Tools.AspNetCore</Product>
         <PackageId>Masuit.Tools.AspNetCore</PackageId>
         <LangVersion>latest</LangVersion>
-        <Version>1.2.6.4</Version>
+        <Version>1.2.6.5</Version>
         <RepositoryType></RepositoryType>
         <GeneratePackageOnBuild>True</GeneratePackageOnBuild>
         <FileVersion>1.1.9</FileVersion>

+ 1 - 1
Masuit.Tools.Core/Masuit.Tools.Core.csproj

@@ -6,7 +6,7 @@
 官网教程:https://tools.masuit.org
 github:https://github.com/ldqk/Masuit.Tools
         </Description>
-        <Version>2.6.6.2</Version>
+        <Version>2.6.6.3</Version>
         <Copyright>Copyright © 懒得勤快</Copyright>
         <PackageProjectUrl>https://github.com/ldqk/Masuit.Tools</PackageProjectUrl>
         <PackageTags>Masuit.Tools,工具库,Utility,Crypt,Extensions</PackageTags>

+ 71 - 2
Masuit.Tools.Net45/Masuit.Tools.Net45.csproj

@@ -195,8 +195,77 @@
     <Compile Include="..\Masuit.Tools.Abstractions\Strings\UnicodeFormater.cs">
       <Link>Strings\UnicodeFormater.cs</Link>
     </Compile>
-    <Compile Include="..\Masuit.Tools.Abstractions\Systems\*.*">
-      <Link>Systems\%(RecursiveDir)%(FileName)%(Extension)</Link>
+    <Compile Include="..\Masuit.Tools.Abstractions\Systems\CompositeContractResolver.cs">
+      <Link>Systems\CompositeContractResolver.cs</Link>
+    </Compile>
+    <Compile Include="..\Masuit.Tools.Abstractions\Systems\ConcurrentHashSet.cs">
+      <Link>Systems\ConcurrentHashSet.cs</Link>
+    </Compile>
+    <Compile Include="..\Masuit.Tools.Abstractions\Systems\ConcurrentLimitedQueue.cs">
+      <Link>Systems\ConcurrentLimitedQueue.cs</Link>
+    </Compile>
+    <Compile Include="..\Masuit.Tools.Abstractions\Systems\DeserializeOnlyContractResolver.cs">
+      <Link>Systems\DeserializeOnlyContractResolver.cs</Link>
+    </Compile>
+    <Compile Include="..\Masuit.Tools.Abstractions\Systems\DeserializeOnlyJsonPropertyAttribute.cs">
+      <Link>Systems\DeserializeOnlyJsonPropertyAttribute.cs</Link>
+    </Compile>
+    <Compile Include="..\Masuit.Tools.Abstractions\Systems\Disposable.cs">
+      <Link>Systems\Disposable.cs</Link>
+    </Compile>
+    <Compile Include="..\Masuit.Tools.Abstractions\Systems\DisposableConcurrentDictionary.cs">
+      <Link>Systems\DisposableConcurrentDictionary.cs</Link>
+    </Compile>
+    <Compile Include="..\Masuit.Tools.Abstractions\Systems\DisposableDictionary.cs">
+      <Link>Systems\DisposableDictionary.cs</Link>
+    </Compile>
+    <Compile Include="..\Masuit.Tools.Abstractions\Systems\EnumExt.cs">
+      <Link>Systems\EnumExt.cs</Link>
+    </Compile>
+    <Compile Include="..\Masuit.Tools.Abstractions\Systems\FallbackJsonProperty.cs">
+      <Link>Systems\FallbackJsonProperty.cs</Link>
+    </Compile>
+    <Compile Include="..\Masuit.Tools.Abstractions\Systems\FallbackJsonPropertyResolver.cs">
+      <Link>Systems\FallbackJsonPropertyResolver.cs</Link>
+    </Compile>
+    <Compile Include="..\Masuit.Tools.Abstractions\Systems\HiPerfTimer.cs">
+      <Link>Systems\HiPerfTimer.cs</Link>
+    </Compile>
+    <Compile Include="..\Masuit.Tools.Abstractions\Systems\LargeMemoryStream.cs">
+      <Link>Systems\LargeMemoryStream.cs</Link>
+    </Compile>
+    <Compile Include="..\Masuit.Tools.Abstractions\Systems\LimitedQueue.cs">
+      <Link>Systems\LimitedQueue.cs</Link>
+    </Compile>
+    <Compile Include="..\Masuit.Tools.Abstractions\Systems\MaskConverter.cs">
+      <Link>Systems\MaskConverter.cs</Link>
+    </Compile>
+    <Compile Include="..\Masuit.Tools.Abstractions\Systems\MaskEmailConverter.cs">
+      <Link>Systems\MaskEmailConverter.cs</Link>
+    </Compile>
+    <Compile Include="..\Masuit.Tools.Abstractions\Systems\NullableConcurrentDictionary.cs">
+      <Link>Systems\NullableConcurrentDictionary.cs</Link>
+    </Compile>
+    <Compile Include="..\Masuit.Tools.Abstractions\Systems\NullableDictionary.cs">
+      <Link>Systems\NullableDictionary.cs</Link>
+    </Compile>
+    <Compile Include="..\Masuit.Tools.Abstractions\Systems\NullObject.cs">
+      <Link>Systems\NullObject.cs</Link>
+    </Compile>
+    <Compile Include="..\Masuit.Tools.Abstractions\Systems\PooledMemoryStream.cs">
+      <Link>Systems\PooledMemoryStream.cs</Link>
+    </Compile>
+    <Compile Include="..\Masuit.Tools.Abstractions\Systems\SerializeIgnoreAttribute.cs">
+      <Link>Systems\SerializeIgnoreAttribute.cs</Link>
+    </Compile>
+    <Compile Include="..\Masuit.Tools.Abstractions\Systems\SnowFlake.cs">
+      <Link>Systems\SnowFlake.cs</Link>
+    </Compile>
+    <Compile Include="..\Masuit.Tools.Abstractions\Systems\SnowFlakeNew.cs">
+      <Link>Systems\SnowFlakeNew.cs</Link>
+    </Compile>
+    <Compile Include="..\Masuit.Tools.Abstractions\Systems\StopwatchHelper.cs">
+      <Link>Systems\StopwatchHelper.cs</Link>
     </Compile>
     <Compile Include="..\Masuit.Tools.Abstractions\Validator\ComplexPassword.cs">
       <Link>Validator\ComplexPassword.cs</Link>

+ 1 - 1
Masuit.Tools.Net45/package.nuspec

@@ -2,7 +2,7 @@
 <package>
   <metadata>
     <id>Masuit.Tools.Net45</id>
-    <version>2.6.6</version>
+    <version>2.6.6.3</version>
     <title>Masuit.Tools</title>
     <authors>懒得勤快</authors>
     <owners>masuit.com</owners>

+ 1 - 1
Masuit.Tools/package.nuspec

@@ -2,7 +2,7 @@
 <package>
   <metadata>
     <id>Masuit.Tools.Net</id>
-    <version>2.6.6.1</version>
+    <version>2.6.6.3</version>
     <title>Masuit.Tools</title>
     <authors>懒得勤快</authors>
     <owners>masuit.com</owners>

+ 1 - 1
Test/Masuit.Tools.Abstractions.Test/Masuit.Tools.Abstractions.Test.csproj

@@ -13,7 +13,7 @@
   </ItemGroup>
 
   <ItemGroup>
-    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.7.1" />
+    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.7.2" />
     <PackageReference Include="xunit" Version="2.5.0" />
     <PackageReference Include="xunit.runner.visualstudio" Version="2.5.0">
       <PrivateAssets>all</PrivateAssets>

+ 1 - 1
Test/Masuit.Tools.Core.Test/Masuit.Tools.Core.Test.csproj

@@ -11,7 +11,7 @@
   <ItemGroup>
     <PackageReference Include="Microsoft.AspNetCore.TestHost" Version="7.0.10" />
     <PackageReference Include="Microsoft.Extensions.Hosting" Version="7.0.1" />
-    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.7.1" />
+    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.7.2" />
     <PackageReference Include="xunit" Version="2.5.0" />
     <PackageReference Include="xunit.runner.visualstudio" Version="2.5.0">
       <PrivateAssets>all</PrivateAssets>