Shun před 2 roky
rodič
revize
d05a94f4bf

+ 1 - 1
src/YSAI.Core/YSAI.Core.csproj

@@ -17,7 +17,7 @@
   </PropertyGroup>
   <ItemGroup>
     <PackageReference Include="System.IO.Ports" Version="8.0.0" />
-    <PackageReference Include="YSAI.Model" Version="23.328.33871" />
+    <PackageReference Include="YSAI.Model" Version="23.328.35182" />
 	<PackageReference Include="Microsoft.ClearScript" Version="7.4.4" />
   </ItemGroup>
 </Project>

+ 162 - 16
src/YSAI.Core/handler/AddressHandler.cs

@@ -1,4 +1,8 @@
-using YSAI.Log;
+using System.Collections.Concurrent;
+using YSAI.Core.reflection;
+using YSAI.Core.relay;
+using YSAI.Core.script;
+using YSAI.Log;
 using YSAI.Model.data;
 
 namespace YSAI.Core.handler
@@ -8,15 +12,36 @@ namespace YSAI.Core.handler
     /// </summary>
     public class AddressHandler
     {
+        /// <summary>
+        /// 处理异常日志输出文件
+        /// </summary>
+        private static readonly string ExecuteDisposeLog = "Core/ExecuteDispose.log";
+
+        /// <summary>
+        /// 解析异常日志输出文件
+        /// </summary>
+        private static readonly string ParseLog = "Core/Parse.log";
+
         /// <summary>
         /// 转发失败数据的日志输出文件
         /// </summary>
-        private static readonly string FailDataLog = "FailData.log";
+        private static readonly string RelayLog = "Core/Relay.log";
 
         /// <summary>
-        /// 处理异常日志输出文件
+        /// 转发容器
+        /// </summary>
+        private static ConcurrentDictionary<RelayData.Basics, RelayOperate> RelayIoc = new ConcurrentDictionary<RelayData.Basics, RelayOperate>();
+
+        /// <summary>
+        /// 脚本容器
         /// </summary>
-        private static readonly string ExecuteDisposeLog = "ExecuteDispose.log";
+        private static ConcurrentDictionary<ScriptData.Basics, ScriptOperate> ScriptIoc = new ConcurrentDictionary<ScriptData.Basics, ScriptOperate>();
+
+        /// <summary>
+        /// 反射容器
+        /// </summary>
+        private static ConcurrentDictionary<ReflectionData.Basics, ReflectionOperate> ReflectionIoc = new ConcurrentDictionary<ReflectionData.Basics, ReflectionOperate>();
+
 
         /// <summary>
         /// 执行数据处理
@@ -41,7 +66,7 @@ namespace YSAI.Core.handler
                     //数据质量
                     Quality = 1;
                     //解析
-                    value = ParseHandler.Parse(addressDetails, value);
+                    value = Parse(addressDetails, value);
                 }
 
                 //最终数据组织
@@ -51,17 +76,8 @@ namespace YSAI.Core.handler
                 addressValue.OriginalValue = originalValue;
                 addressValue.Quality = Quality;
 
-                ////反射状态为true才进行操作
-                //if (reflectionOperate.ReflectionState)
-                //{
-                //    //转发
-                //    OperateResult operateResult = RelayHandler.Produce("Message", addressValue.ToJson().JsonFormatting());
-                //    if (!operateResult.State)
-                //    {
-                //        //转发失败存入本地记录
-                //        LogHelper.Error("{" + $"\"Value\":{addressValue.ToJson()},\"State\":\"{operateResult.State}\",\"Exception\":\"{operateResult.Message}\"" + "}", FailDataLog);
-                //    }
-                //}
+                //数据转发
+                Relay(addressDetails, value);
 
                 return addressValue;
             }
@@ -71,5 +87,135 @@ namespace YSAI.Core.handler
             }
             return null;
         }
+
+
+        /// <summary>
+        /// 数据转发
+        /// </summary>
+        /// <param name="addressDetails">地址详情</param>
+        /// <returns></returns>
+        public static Task Relay(AddressDetails addressDetails, string value)
+        {
+            return Task.Run(() =>
+            {
+                if (addressDetails.AddressRelayParam != null)
+                {
+                    RelayData.Basics? basics = addressDetails.AddressRelayParam?.RelayBasics as RelayData.Basics;
+                    if (basics != null)
+                    {
+                        if (!RelayIoc.ContainsKey(basics))
+                        {
+                            RelayOperate operate = RelayOperate.Instance(basics);
+                            RelayIoc.AddOrUpdate(basics, operate, (k, v) => operate);
+                            if (!basics.AutoOn)
+                            {
+                                OperateResult operateResult = RelayIoc[basics].On();
+                                if (!operateResult.State)
+                                {
+                                    LogHelper.Error($"转发打开失败:{operateResult.Message}", RelayLog);
+                                    RelayIoc.Remove(basics, out _);
+                                }
+                            }
+                        }
+
+                        if (RelayIoc.ContainsKey(basics))
+                        {
+                            OperateResult operateResult = RelayIoc[basics].Produce(addressDetails.AddressRelayParam?.Topic, value, addressDetails.AddressRelayParam?.ISns);
+                            if (!operateResult.State)
+                            {
+                                LogHelper.Error($"转发失败,{operateResult.Message}", RelayLog);
+                            }
+                        }
+                    }
+                    else
+                    {
+                        LogHelper.Error("使用了转发,但配置设置错误", RelayLog);
+                    }
+                }
+            });
+        }
+
+
+
+        /// <summary>
+        /// 数据解析
+        /// </summary>
+        /// <param name="addressDetails">地址详情</param>
+        /// <param name="value">当前值</param>
+        /// <returns></returns>
+        public static string Parse(AddressDetails addressDetails, string value)
+        {
+            //最新值
+            string? NewValue = value;
+            if (addressDetails.AddressParseParam != null)
+            {
+                try
+                {
+                    switch (addressDetails.AddressParseParam.ParseType)
+                    {
+                        case Model.@enum.ParseType.R:  //反射解析
+                            //基础数据转换
+                            ReflectionData.Basics? rb = addressDetails.AddressParseParam?.ReflectionParseParam?.ReflectionBasics as ReflectionData.Basics;
+                            if (rb != null)
+                            {
+                                if (!ReflectionIoc.ContainsKey(rb))
+                                {
+                                    ReflectionOperate operate = ReflectionOperate.Instance(rb);
+                                    ReflectionIoc.AddOrUpdate(rb, operate, (k, v) => operate);
+                                    OperateResult operateResult = ReflectionIoc[rb].Init();
+                                    if (!operateResult.State)
+                                    {
+                                        LogHelper.Error($"反射初始化失败:{operateResult.Message}", ParseLog);
+                                        ReflectionIoc.Remove(rb, out _);
+                                    }
+                                }
+                                if (ReflectionIoc.ContainsKey(rb))
+                                {
+                                    NewValue = ReflectionIoc[rb].ExecuteMethod(addressDetails.AddressParseParam?.ReflectionParseParam?.RSn, new object[] { value })?.ToString();
+                                }
+                            }
+                            else
+                            {
+                                LogHelper.Error("使用了反射解析,但未设置配置", ParseLog);
+                            }
+                            break;
+                        case Model.@enum.ParseType.S:  //脚本解析
+                            //基础数据转换
+                            ScriptData.Basics? sb = addressDetails.AddressParseParam?.ScriptBasics as ScriptData.Basics;
+                            if (sb != null)
+                            {
+                                if (!ScriptIoc.ContainsKey(sb))
+                                {
+                                    ScriptOperate operate = ScriptOperate.Instance(sb);
+                                    ScriptIoc.AddOrUpdate(sb, operate, (k, v) => operate);
+                                }
+                                if (ScriptIoc.ContainsKey(sb))
+                                {
+                                    OperateResult operateResult = ScriptIoc[sb].Execute(sb.ScriptType, sb.ScriptCode, sb.ScriptFunction, value);
+                                    if (operateResult.State)
+                                    {
+                                        NewValue = operateResult.RData?.ToString();
+                                    }
+                                }
+                            }
+                            else
+                            {
+                                LogHelper.Error("使用了脚本解析,但未设置配置", ParseLog);
+                            }
+                            break;
+                    }
+                    if (string.IsNullOrEmpty(NewValue))
+                    {
+                        NewValue = value;
+                    }
+                    return NewValue;
+                }
+                catch (Exception ex)
+                {
+                    LogHelper.Error("解析异常:" + ex.ToString(), ParseLog);
+                }
+            }
+            return value;
+        }
     }
 }

+ 0 - 69
src/YSAI.Core/handler/ParseHandler.cs

@@ -1,69 +0,0 @@
-using YSAI.Model.data;
-
-namespace YSAI.Core.handler
-{
-    /// <summary>
-    /// 解析处理
-    /// </summary>
-    public class ParseHandler
-    {
-        /// <summary>
-        /// 解析异常日志输出文件
-        /// </summary>
-        private static readonly string ParseLog = "Parse.log";
-
-        /// <summary>
-        /// 反射操作
-        /// </summary>
-        //private static readonly RIOperate reflectionOperate = RIOperate.Instance();
-
-        /// <summary>
-        /// 数据解析
-        /// </summary>
-        /// <param name="addressDetails">地址详情</param>
-        /// <param name="value">当前值</param>
-        /// <returns></returns>
-        public static string Parse(AddressDetails addressDetails, string value)
-        {
-            //最新值
-            string? NewValue = value;
-
-            //if (addressDetails.AddressParseParam != null)
-            //{
-            //    try
-            //    {
-            //        switch (addressDetails.AddressParseParam.ParseType)
-            //        {
-            //            case ParseType.MethodAnalysis:
-            //                //NewValue = reflectionOperate.ExecuteMethod(addressDetails.AddressParseParam.ReflectionSN, new object[] { value })?.ToString();
-            //                break;
-
-            //            case ParseType.ScriptAnalysis:
-
-            //                //ScriptData.Basics? basics = addressDetails.AddressParseParam.ScriptBasics as ScriptData.Basics;
-            //                //if (basics == null) break;
-            //                //using (ScriptOperate scriptOperate = ScriptOperate.Instance(basics))  //通过脚本解析
-            //                //{
-            //                //    OperateResult operateResult = scriptOperate.Execute(basics.ScriptType, basics.ScriptCode, basics.ScriptFunction, value);
-            //                //    if (operateResult.State)
-            //                //    {
-            //                //        NewValue = operateResult.RData?.ToString();
-            //                //    }
-            //                //}
-            //                break;
-            //        }
-            //        if (string.IsNullOrEmpty(NewValue))
-            //        {
-            //            NewValue = value;
-            //        }
-            //        return NewValue;
-            //    }
-            //    catch (Exception ex)
-            //    {
-            //        LogHelper.Error("解析异常:" + ex.ToString(), ParseLog);
-            //    }
-            //}
-            return value;
-        }
-    }
-}

+ 184 - 33
src/YSAI.Core/relay/RelayOperate.cs

@@ -783,7 +783,7 @@ namespace YSAI.Core.relay
             {
                 if (InstanceIoc.ContainsKey(ISn))
                 {
-                    OperateResult operateResult = Remove(ISn);
+                    OperateResult operateResult = Remove(new List<string> { ISn });
                     return Break(SN, operateResult.State, operateResult.Message);
                 }
                 else
@@ -826,33 +826,62 @@ namespace YSAI.Core.relay
         /// <summary>
         /// 移除指定实例
         /// </summary>
-        /// <param name="ISn">实例唯一标识符</param>
+        /// <param name="ISns">实例唯一标识符为空则执行所有</param>
         /// <returns>统一出参</returns>
-        public OperateResult Remove(string ISn)
+        public OperateResult Remove(List<string>? ISns = null)
         {
             string SN = Depart("Remove");
             try
             {
-                if (InstanceIoc.ContainsKey(ISn))
+                try
                 {
-                    IRelay? relay;
-                    if (InstanceIoc.Remove(ISn, out relay))
+                    List<string> FailMessage = new List<string>();
+                    if (ISns != null)
                     {
-                        if (relay != null)
+                        foreach (var sn in ISns)
                         {
-                            //直接释放
-                            relay.Dispose();
+                            if (InstanceIoc.ContainsKey(sn))
+                            {
+                                IRelay? relay;
+                                if (InstanceIoc.Remove(sn, out relay))
+                                {
+                                    if (relay != null)
+                                    {
+                                        //直接释放
+                                        relay.Dispose();
+                                    }
+                                }
+                                else
+                                {
+                                    FailMessage.Add($"{sn} 的实例移除失败");
+                                }
+                            }
+                            else
+                            {
+                                FailMessage.Add($"未找到 {sn} 的实例");
+                            }
                         }
-                        return Break(SN, true);
                     }
                     else
                     {
-                        return Break(SN, false, $"{ISn} 的实例移除失败");
+                        foreach (var item in InstanceIoc)
+                        {
+                            item.Value.Dispose();
+                        }
+                        InstanceIoc.Clear();
+                    }
+                    if (FailMessage.Count > 0)
+                    {
+                        return Break(SN, false, $"存在 {FailMessage.Count} 失败信息", FailMessage, ResultType.Json);
+                    }
+                    else
+                    {
+                        return Break(SN, true);
                     }
                 }
-                else
+                catch (Exception ex)
                 {
-                    return Break(SN, false, $"未找到 {ISn} 的实例");
+                    return Break(SN, false, ex.Message, Exception: ex);
                 }
             }
             catch (Exception ex)
@@ -864,20 +893,50 @@ namespace YSAI.Core.relay
         /// <summary>
         /// 打开
         /// </summary>
-        /// <param name="ISn">实例唯一标识符</param>
+        /// <param name="ISns">实例唯一标识符为空则执行所有</param>
         /// <returns>统一出参</returns>
-        public OperateResult On(string ISn)
+        public OperateResult On(List<string>? ISns = null)
         {
             string SN = Depart("On");
             try
             {
-                if (InstanceIoc.ContainsKey(ISn))
+                List<string> FailMessage = new List<string>();
+                if (ISns != null)
+                {
+                    foreach (var sn in ISns)
+                    {
+                        if (InstanceIoc.ContainsKey(sn))
+                        {
+                            OperateResult operateResult = InstanceIoc[sn].On();
+                            if (!operateResult.State)
+                            {
+                                FailMessage.Add(operateResult.Message);
+                            }
+                        }
+                        else
+                        {
+                            FailMessage.Add($"未找到 {sn} 的实例");
+                        }
+                    }
+                }
+                else
                 {
-                    return InstanceIoc[ISn].On();
+                    foreach (var item in InstanceIoc)
+                    {
+                        OperateResult operateResult = item.Value.On();
+                        if (!operateResult.State)
+                        {
+                            FailMessage.Add(operateResult.Message);
+                        }
+                    }
+                }
+                if (FailMessage.Count > 0)
+                {
+                    return Break(SN, false, $"存在 {FailMessage.Count} 失败信息", FailMessage, ResultType.Json);
                 }
                 else
                 {
-                    return Break(SN, false, $"未找到 {ISn} 的实例");
+                    return Break(SN, true);
                 }
             }
             catch (Exception ex)
@@ -889,21 +948,53 @@ namespace YSAI.Core.relay
         /// <summary>
         /// 关闭
         /// </summary>
-        /// <param name="ISn">实例唯一标识符</param>
+        /// <param name="ISns">实例唯一标识符为空则执行所有</param>
         /// <returns>统一出参</returns>
-        public OperateResult Off(string ISn)
+        public OperateResult Off(List<string>? ISns = null)
         {
             string SN = Depart("Off");
             try
             {
-                if (InstanceIoc.ContainsKey(ISn))
+                List<string> FailMessage = new List<string>();
+                if (ISns != null)
                 {
-                    return InstanceIoc[ISn].Off();
+                    foreach (var sn in ISns)
+                    {
+                        if (InstanceIoc.ContainsKey(sn))
+                        {
+                            OperateResult operateResult = InstanceIoc[sn].Off();
+                            if (!operateResult.State)
+                            {
+                                FailMessage.Add(operateResult.Message);
+                            }
+                        }
+                        else
+                        {
+                            FailMessage.Add($"未找到 {sn} 的实例");
+                        }
+                    }
                 }
                 else
                 {
-                    return Break(SN, false, $"未找到 {ISn} 的实例");
+                    foreach (var item in InstanceIoc)
+                    {
+                        OperateResult operateResult = item.Value.Off();
+                        if (!operateResult.State)
+                        {
+                            FailMessage.Add(operateResult.Message);
+                        }
+                    }
+                }
+
+                if (FailMessage.Count > 0)
+                {
+                    return Break(SN, false, $"存在 {FailMessage.Count} 失败信息", FailMessage, ResultType.Json);
                 }
+                else
+                {
+                    return Break(SN, true);
+                }
+
             }
             catch (Exception ex)
             {
@@ -979,20 +1070,50 @@ namespace YSAI.Core.relay
         /// 添加订阅
         /// </summary>
         /// <param name="Topic">主题</param>
-        /// <param name="ISn">实例唯一标识符</param>
+        /// <param name="ISns">实例唯一标识符为空则执行所有</param>
         /// <returns>统一结果</returns>
-        public OperateResult Subscribe(string Topic, string ISn)
+        public OperateResult Subscribe(string Topic, List<string>? ISns = null)
         {
             string SN = Depart("Subscribe");
             try
             {
-                if (InstanceIoc.ContainsKey(ISn))
+                List<string> FailMessage = new List<string>();
+                if (ISns != null)
                 {
-                    return InstanceIoc[ISn].Subscribe(Topic);
+                    foreach (var sn in ISns)
+                    {
+                        if (InstanceIoc.ContainsKey(sn))
+                        {
+                            OperateResult operateResult = InstanceIoc[sn].Subscribe(Topic);
+                            if (!operateResult.State)
+                            {
+                                FailMessage.Add(operateResult.Message);
+                            }
+                        }
+                        else
+                        {
+                            FailMessage.Add($"未找到 {sn} 的实例");
+                        }
+                    }
                 }
                 else
                 {
-                    return Break(SN, false, $"未找到 {ISn} 的实例");
+                    foreach (var item in InstanceIoc)
+                    {
+                        OperateResult operateResult = item.Value.Subscribe(Topic);
+                        if (!operateResult.State)
+                        {
+                            FailMessage.Add(operateResult.Message);
+                        }
+                    }
+                }
+                if (FailMessage.Count > 0)
+                {
+                    return Break(SN, false, $"存在 {FailMessage.Count} 失败信息", FailMessage, ResultType.Json);
+                }
+                else
+                {
+                    return Break(SN, true);
                 }
             }
             catch (Exception ex)
@@ -1005,20 +1126,50 @@ namespace YSAI.Core.relay
         /// 移除订阅
         /// </summary>
         /// <param name="Topic">主题</param>
-        /// <param name="ISn">实例唯一标识符</param>
+        /// <param name="ISns">实例唯一标识符为空则执行所有</param>
         /// <returns>统一结果</returns>
-        public OperateResult UnSubscribe(string Topic, string ISn)
+        public OperateResult UnSubscribe(string Topic, List<string>? ISns = null)
         {
             string SN = Depart("UnSubscribe");
             try
             {
-                if (InstanceIoc.ContainsKey(ISn))
+                List<string> FailMessage = new List<string>();
+                if (ISns != null)
+                {
+                    foreach (var sn in ISns)
+                    {
+                        if (InstanceIoc.ContainsKey(sn))
+                        {
+                            OperateResult operateResult = InstanceIoc[sn].UnSubscribe(Topic);
+                            if (!operateResult.State)
+                            {
+                                FailMessage.Add(operateResult.Message);
+                            }
+                        }
+                        else
+                        {
+                            FailMessage.Add($"未找到 {sn} 的实例");
+                        }
+                    }
+                }
+                else
                 {
-                    return InstanceIoc[ISn].UnSubscribe(Topic);
+                    foreach (var item in InstanceIoc)
+                    {
+                        OperateResult operateResult = item.Value.UnSubscribe(Topic);
+                        if (!operateResult.State)
+                        {
+                            FailMessage.Add(operateResult.Message);
+                        }
+                    }
+                }
+                if (FailMessage.Count > 0)
+                {
+                    return Break(SN, false, $"存在 {FailMessage.Count} 失败信息", FailMessage, ResultType.Json);
                 }
                 else
                 {
-                    return Break(SN, false, $"未找到 {ISn} 的实例");
+                    return Break(SN, true);
                 }
             }
             catch (Exception ex)

+ 1 - 1
src/YSAI.Kafka/YSAI.Kafka.csproj

@@ -17,7 +17,7 @@
   </PropertyGroup>
   <ItemGroup>
     <PackageReference Include="Confluent.Kafka" Version="2.3.0" />
-	<PackageReference Include="YSAI.Model" Version="23.328.33871" />
+	<PackageReference Include="YSAI.Model" Version="23.328.35182" />
   </ItemGroup>
   <!--<ItemGroup>
 		<ProjectReference Include="..\YSAI.Core\YSAI.Core.csproj" />

+ 1 - 1
src/YSAI.Model/YSAI.Model.csproj

@@ -3,7 +3,7 @@
     <TargetFrameworks>net6.0;net8.0</TargetFrameworks>
     <ImplicitUsings>enable</ImplicitUsings>
     <Nullable>enable</Nullable>
-    <Version>23.328.35182</Version>
+    <Version>23.328.39019</Version>
     <PackageOutputPath Condition="'$(Configuration)' == 'Release'">../YSAI.Publish/Release</PackageOutputPath>
     <PackageOutputPath Condition="'$(Configuration)' == 'Debug'">../YSAI.Publish/Debug</PackageOutputPath>
     <Authors>Shun</Authors>

+ 0 - 4
src/YSAI.Model/data/AddressRelay.cs

@@ -14,10 +14,6 @@
         /// </summary>
         public string Topic { get; set; }
         /// <summary>
-        /// 内容
-        /// </summary>
-        public string Content { get; set; }
-        /// <summary>
         /// 实例SN,为空则所有打开的转发实例都转发
         /// </summary>
         public List<string>? ISns { get; set; }

+ 1 - 1
src/YSAI.Mqtt/YSAI.Mqtt.csproj

@@ -18,7 +18,7 @@
   <ItemGroup>
     <PackageReference Include="MQTTnet" Version="4.3.1.873" />
     <PackageReference Include="MQTTnet.AspNetCore" Version="4.3.1.873" />
-	<PackageReference Include="YSAI.Model" Version="23.328.33871" />
+	<PackageReference Include="YSAI.Model" Version="23.328.35182" />
   </ItemGroup>
   <!--<ItemGroup>
 		<ProjectReference Include="..\YSAI.Core\YSAI.Core.csproj" />

+ 1 - 1
src/YSAI.NetMQ/YSAI.NetMQ.csproj

@@ -18,6 +18,6 @@
   </PropertyGroup>
   <ItemGroup>
     <PackageReference Include="NetMQ" Version="4.0.1.13" />
-	<PackageReference Include="YSAI.Model" Version="23.328.33871" />
+	<PackageReference Include="YSAI.Model" Version="23.328.35182" />
   </ItemGroup>
 </Project>

+ 1 - 1
src/YSAI.Netty/YSAI.Netty.csproj

@@ -18,6 +18,6 @@
   <ItemGroup>
     <PackageReference Include="DotNetty.Handlers" Version="0.7.5" />
     <PackageReference Include="DotNetty.Transport" Version="0.7.5" />
-	<PackageReference Include="YSAI.Model" Version="23.328.33871" />
+	<PackageReference Include="YSAI.Model" Version="23.328.35182" />
   </ItemGroup>
 </Project>

+ 1 - 1
src/YSAI.RabbitMQ/YSAI.RabbitMQ.csproj

@@ -17,7 +17,7 @@
   </PropertyGroup>
   <ItemGroup>
     <PackageReference Include="RabbitMQ.Client" Version="6.7.0" />
-    <PackageReference Include="YSAI.Model" Version="23.328.33871" />
+    <PackageReference Include="YSAI.Model" Version="23.328.35182" />
   </ItemGroup>
   <!--<ItemGroup>
 		<ProjectReference Include="..\YSAI.Core\YSAI.Core.csproj" />

+ 1 - 1
src/YSAI.Redis/YSAI.Redis.csproj

@@ -17,6 +17,6 @@
   </PropertyGroup>
   <ItemGroup>
     <PackageReference Include="StackExchange.Redis" Version="2.7.4" />
-    <PackageReference Include="YSAI.Model" Version="23.328.33871" />
+    <PackageReference Include="YSAI.Model" Version="23.328.35182" />
   </ItemGroup>
 </Project>

+ 1 - 1
src/YSAI.Rpc/YSAI.Rpc.csproj

@@ -18,6 +18,6 @@
   <ItemGroup>
     <PackageReference Include="DotNetty.Codecs" Version="0.7.5" />
     <PackageReference Include="ImpromptuInterface" Version="8.0.4" />
-    <PackageReference Include="YSAI.Model" Version="23.328.33871" />
+    <PackageReference Include="YSAI.Model" Version="23.328.35182" />
   </ItemGroup>
 </Project>

+ 1 - 4
src/YSAI.VT/Program.cs

@@ -18,14 +18,11 @@ namespace YSAI.VT
                 //"YSAI.Unility",
                 //"YSAI.Log",
 
-                "YSAI.Model",
+                //"YSAI.Model",
                 //"YSAI.Core",
 
                 //"YSAI.Rpc",
                 //"YSAI.Redis",
-                //"YSAI.Reflection",
-                //"YSAI.Script",
-                //"YSAI.Relay",
 
                 //"YSAI.AllenBradley",
                 //"YSAI.Beckhoff",