Shun 2 سال پیش
والد
کامیت
67d9955244
40فایلهای تغییر یافته به همراه644 افزوده شده و 150 حذف شده
  1. 2 2
      src/YSAI.DAQ/YSAI.Core/YSAI.Core.csproj
  2. 2 2
      src/YSAI.DAQ/YSAI.Core/handler/AddressHandler.cs
  3. 1 1
      src/YSAI.DAQ/YSAI.Core/handler/ParseHandler.cs
  4. 1 1
      src/YSAI.DAQ/YSAI.Core/handler/RelayHandler.cs
  5. 8 8
      src/YSAI.DAQ/YSAI.Core/redis/RedisOperate.cs
  6. 548 0
      src/YSAI.DAQ/YSAI.Core/reflection/RIOperate.cs
  7. 44 103
      src/YSAI.DAQ/YSAI.Core/reflection/ReflectionOperate.cs
  8. 6 5
      src/YSAI.DAQ/YSAI.Core/subscribe/SubscribeOperate.cs
  9. 1 1
      src/YSAI.DAQ/YSAI.DB/YSAI.DB.csproj
  10. 1 1
      src/YSAI.DAQ/YSAI.Mqtt/client/MqttClientOperate.cs
  11. 20 20
      src/YSAI.DAQ/YSAI.Opc/ua/client/OpcUaClientOperate.cs
  12. BIN
      src/YSAI.DAQ/YSAI.Pack/YSAI.Can.Pack/YSAI.Can.dll
  13. BIN
      src/YSAI.DAQ/YSAI.Pack/YSAI.Can.Pack/YSAI.Can.pdb
  14. BIN
      src/YSAI.DAQ/YSAI.Pack/YSAI.Can.Pack/YSAI.Core.dll
  15. BIN
      src/YSAI.DAQ/YSAI.Pack/YSAI.DB.Pack/YSAI.Core.dll
  16. BIN
      src/YSAI.DAQ/YSAI.Pack/YSAI.DB.Pack/YSAI.DB.dll
  17. BIN
      src/YSAI.DAQ/YSAI.Pack/YSAI.DB.Pack/YSAI.DB.pdb
  18. BIN
      src/YSAI.DAQ/YSAI.Pack/YSAI.Kafka.Pack/YSAI.Core.dll
  19. BIN
      src/YSAI.DAQ/YSAI.Pack/YSAI.Kafka.Pack/YSAI.Kafka.dll
  20. BIN
      src/YSAI.DAQ/YSAI.Pack/YSAI.Kafka.Pack/YSAI.Kafka.pdb
  21. BIN
      src/YSAI.DAQ/YSAI.Pack/YSAI.Modbus.Pack/YSAI.Core.dll
  22. BIN
      src/YSAI.DAQ/YSAI.Pack/YSAI.Modbus.Pack/YSAI.Modbus.dll
  23. BIN
      src/YSAI.DAQ/YSAI.Pack/YSAI.Modbus.Pack/YSAI.Modbus.pdb
  24. BIN
      src/YSAI.DAQ/YSAI.Pack/YSAI.Mqtt.Pack/YSAI.Core.dll
  25. BIN
      src/YSAI.DAQ/YSAI.Pack/YSAI.Mqtt.Pack/YSAI.Mqtt.dll
  26. BIN
      src/YSAI.DAQ/YSAI.Pack/YSAI.Mqtt.Pack/YSAI.Mqtt.pdb
  27. 2 2
      src/YSAI.DAQ/YSAI.Pack/YSAI.Mqtt.Pack/YSAI.Mqtt.xml
  28. BIN
      src/YSAI.DAQ/YSAI.Pack/YSAI.Opc.Pack/YSAI.Core.dll
  29. BIN
      src/YSAI.DAQ/YSAI.Pack/YSAI.Opc.Pack/YSAI.Opc.dll
  30. BIN
      src/YSAI.DAQ/YSAI.Pack/YSAI.Opc.Pack/YSAI.Opc.pdb
  31. BIN
      src/YSAI.DAQ/YSAI.Pack/YSAI.RabbitMQ.Pack/YSAI.Core.dll
  32. BIN
      src/YSAI.DAQ/YSAI.Pack/YSAI.RabbitMQ.Pack/YSAI.RabbitMQ.dll
  33. BIN
      src/YSAI.DAQ/YSAI.Pack/YSAI.RabbitMQ.Pack/YSAI.RabbitMQ.pdb
  34. BIN
      src/YSAI.DAQ/YSAI.Pack/YSAI.S7.Pack/YSAI.Core.dll
  35. BIN
      src/YSAI.DAQ/YSAI.Pack/YSAI.S7.Pack/YSAI.S7.dll
  36. BIN
      src/YSAI.DAQ/YSAI.Pack/YSAI.S7.Pack/YSAI.S7.pdb
  37. 1 1
      src/YSAI.DAQ/YSAI.RabbitMQ/RabbitMQOperate.cs
  38. 3 0
      src/YSAI.DAQ/YSAI.Test.All/Program.cs
  39. 2 1
      src/YSAI.DAQ/YSAI.Test.All/YSAI.Test.All.csproj
  40. 2 2
      src/YSAI.DAQ/YSAI.Unility/YSAI.Unility.csproj

+ 2 - 2
src/YSAI.DAQ/YSAI.Core/YSAI.Core.csproj

@@ -5,7 +5,7 @@
     <ImplicitUsings>enable</ImplicitUsings>
     <Nullable>enable</Nullable>
     <GeneratePackageOnBuild>True</GeneratePackageOnBuild>
-    <Version>1.0.0.39</Version>
+    <Version>1.0.0.40</Version>
     <Authors>Shun</Authors>
     <Company>YSAI</Company>
     <Product>SCADA</Product>
@@ -17,7 +17,7 @@
 		<PackageReference Include="Microsoft.ClearScript" Version="7.4.3" />
 		<PackageReference Include="System.IO.Ports" Version="7.0.0" />
 		<PackageReference Include="YSAI.Log" Version="1.0.0.9" />
-		<PackageReference Include="YSAI.Unility" Version="1.0.0.12" />
+		<PackageReference Include="YSAI.Unility" Version="1.0.0.13" />
 	</ItemGroup>
 
 </Project>

+ 2 - 2
src/YSAI.DAQ/YSAI.Core/handler/AddressHandler.cs

@@ -21,7 +21,7 @@ namespace YSAI.Core.handler
         /// <summary>
         /// 反射操作
         /// </summary>
-        private readonly static ReflectionOperate reflectionOperate = ReflectionOperate.Instance();
+        private readonly static RIOperate reflectionOperate = RIOperate.Instance();
 
         /// <summary>
         /// 执行数据处理
@@ -56,7 +56,7 @@ namespace YSAI.Core.handler
                     if (!operateResult.State)
                     {
                         //转发失败存入本地记录
-                        LogHelper.Verbose("{" + $"\"Value\":\"{addressValue.ToJson()}\",\"State\":\"{operateResult.State}\",\"Exception\":\"{operateResult.Message}\"" + "}", FailDataLog);
+                        LogHelper.Error("{" + $"\"Value\":{addressValue.ToJson()},\"State\":\"{operateResult.State}\",\"Exception\":\"{operateResult.Message}\"" + "}", FailDataLog);
                     }
                 }
 

+ 1 - 1
src/YSAI.DAQ/YSAI.Core/handler/ParseHandler.cs

@@ -18,7 +18,7 @@ namespace YSAI.Core.handler
         /// <summary>
         /// 反射操作
         /// </summary>
-        private readonly static ReflectionOperate reflectionOperate = ReflectionOperate.Instance();
+        private readonly static RIOperate reflectionOperate = RIOperate.Instance();
         /// <summary>
         /// 数据解析
         /// </summary>

+ 1 - 1
src/YSAI.DAQ/YSAI.Core/handler/RelayHandler.cs

@@ -12,7 +12,7 @@ namespace YSAI.Core.handler
         /// <summary>
         /// 反射操作
         /// </summary>
-        private readonly static ReflectionOperate reflectionOperate = ReflectionOperate.Instance();
+        private readonly static RIOperate reflectionOperate = RIOperate.Instance();
 
         /// <summary>
         /// 订阅

+ 8 - 8
src/YSAI.DAQ/YSAI.Core/redis/RedisOperate.cs

@@ -1,6 +1,7 @@
 using Newtonsoft.Json;
 using StackExchange.Redis;
 using System.Runtime.Serialization.Formatters.Binary;
+using YSAI.Log;
 
 namespace YSAI.Core.redis
 {
@@ -1897,7 +1898,7 @@ namespace YSAI.Core.redis
         /// <param name="e"></param>
         private static void ConnMultiplexer_ConfigurationChangedBroadcast(object sender, EndPointEventArgs e)
         {
-            Console.WriteLine($"{nameof(ConnMultiplexer_ConfigurationChangedBroadcast)}: {e.EndPoint}");
+            LogHelper.Info($"{nameof(ConnMultiplexer_ConfigurationChangedBroadcast)}: {e.EndPoint}","Redis.log");
         }
 
         /// <summary>
@@ -1907,7 +1908,7 @@ namespace YSAI.Core.redis
         /// <param name="e"></param>
         private static void ConnMultiplexer_InternalError(object sender, InternalErrorEventArgs e)
         {
-            Console.WriteLine($"{nameof(ConnMultiplexer_InternalError)}: {e.Exception}");
+            LogHelper.Info($"{nameof(ConnMultiplexer_InternalError)}: {e.Exception}", "Redis.log");
         }
 
         /// <summary>
@@ -1917,8 +1918,7 @@ namespace YSAI.Core.redis
         /// <param name="e"></param>
         private static void ConnMultiplexer_HashSlotMoved(object sender, HashSlotMovedEventArgs e)
         {
-            Console.WriteLine(
-                $"{nameof(ConnMultiplexer_HashSlotMoved)}: {nameof(e.OldEndPoint)}-{e.OldEndPoint} To {nameof(e.NewEndPoint)}-{e.NewEndPoint}, ");
+            LogHelper.Info($"{nameof(ConnMultiplexer_HashSlotMoved)}: {nameof(e.OldEndPoint)}-{e.OldEndPoint} To {nameof(e.NewEndPoint)}-{e.NewEndPoint}, ", "Redis.log");
         }
 
         /// <summary>
@@ -1928,7 +1928,7 @@ namespace YSAI.Core.redis
         /// <param name="e"></param>
         private static void ConnMultiplexer_ConfigurationChanged(object sender, EndPointEventArgs e)
         {
-            Console.WriteLine($"{nameof(ConnMultiplexer_ConfigurationChanged)}: {e.EndPoint}");
+            LogHelper.Info($"{nameof(ConnMultiplexer_ConfigurationChanged)}: {e.EndPoint}", "Redis.log");
         }
 
         /// <summary>
@@ -1938,7 +1938,7 @@ namespace YSAI.Core.redis
         /// <param name="e"></param>
         private static void ConnMultiplexer_ErrorMessage(object sender, RedisErrorEventArgs e)
         {
-            Console.WriteLine($"{nameof(ConnMultiplexer_ErrorMessage)}: {e.Message}");
+            LogHelper.Info($"{nameof(ConnMultiplexer_ErrorMessage)}: {e.Message}", "Redis.log"); ;
         }
 
         /// <summary>
@@ -1948,7 +1948,7 @@ namespace YSAI.Core.redis
         /// <param name="e"></param>
         private static void ConnMultiplexer_ConnectionFailed(object sender, ConnectionFailedEventArgs e)
         {
-            Console.WriteLine($"{nameof(ConnMultiplexer_ConnectionFailed)}: {e.Exception}");
+            LogHelper.Info($"{nameof(ConnMultiplexer_ConnectionFailed)}: {e.Exception}", "Redis.log");
         }
 
         /// <summary>
@@ -1958,7 +1958,7 @@ namespace YSAI.Core.redis
         /// <param name="e"></param>
         private static void ConnMultiplexer_ConnectionRestored(object sender, ConnectionFailedEventArgs e)
         {
-            Console.WriteLine($"{nameof(ConnMultiplexer_ConnectionRestored)}: {e.Exception}");
+            LogHelper.Info($"{nameof(ConnMultiplexer_ConnectionRestored)}: {e.Exception}", "Redis.log");
         }
 
         #endregion 注册事件

+ 548 - 0
src/YSAI.DAQ/YSAI.Core/reflection/RIOperate.cs

@@ -0,0 +1,548 @@
+using Newtonsoft.Json.Linq;
+using System.Collections.Concurrent;
+using System.Reflection;
+using YSAI.Core.data;
+using YSAI.Core.@interface;
+using YSAI.Log;
+using YSAI.Unility;
+using static YSAI.Core.reflection.ReflectionData;
+using static YSAI.Core.reflection.ReflectionData.Basics;
+using static YSAI.Core.reflection.ReflectionData.Basics.DllData;
+using static YSAI.Core.reflection.ReflectionData.Basics.DllData.NamespaceData;
+using static YSAI.Core.reflection.ReflectionData.Basics.DllData.NamespaceData.ClassData;
+
+namespace YSAI.Core.reflection
+{
+    /*
+     
+        1.你得先生成配置
+
+        2.在初始化
+
+        3.在调用方法或注册事件
+     
+     */
+    /// <summary>
+    /// 内部反射操作
+    /// </summary>
+    public class RIOperate : IBaseAbstract, IDisposable
+    {
+        protected override string LogHead => "[ RIOperate 操作 ]";
+        protected override string ClassName => "RIOperate";
+        /// <summary>
+        /// 文件夹
+        /// </summary>
+        public readonly static string ConfigDirectory = "config";
+        /// <summary>
+        /// 文件
+        /// </summary>
+        public readonly static string ConfigFile = $"{AppDomain.CurrentDomain.BaseDirectory}{ConfigDirectory}//ReflectionConfig.json";
+        /// <summary>
+        /// 配置数据
+        /// </summary>
+        private Basics? basics;
+        /// <summary>
+        /// 获取配置
+        /// </summary>
+        /// <returns></returns>
+        public Basics? GetConfig()
+        {
+            try
+            {
+                if (File.Exists(ConfigFile))  //配置存在
+                {
+                    return JsonTool.StringToJsonEntity<Basics>(FileTool.FileToString(ConfigFile));
+                }
+            }
+            catch (Exception ex)
+            {
+                LogHelper.Error($"获取配置异常:{ex.Message}",$"{ClassName}.log",ex);
+            }
+            return null;
+        }
+        /// <summary>
+        /// 设置配置
+        /// </summary>
+        /// <returns></returns>
+        public bool SetConfig(Basics basics)
+        {
+            try
+            {
+                //实体转JSON字符串
+                string json = JsonTool.JsonEntityToString(basics);
+                //写入文件
+                File.WriteAllText(ConfigFile, JsonTool.JsonFormatting(json));
+                return true;
+            }
+            catch (Exception ex)
+            {
+                LogHelper.Error($"设置配置异常:{ex.Message}", $"{ClassName}.log", ex);
+            }
+            return false;
+        }
+
+        /// <summary>
+        /// 反射状态
+        /// </summary>
+        public bool ReflectionState { get; set; }
+
+        /// <summary>
+        /// 构造函数处理配置
+        /// </summary>
+        public RIOperate()
+        {
+            //获取配置
+            this.basics = GetConfig();
+            if (basics != null)
+            {
+                OperateResult operateResult = Init();
+                if (!operateResult.State)
+                {
+                    LogHelper.Error("反射初始化异常:" + operateResult.Message, $"{ClassName}.log");
+                }
+            }
+        }
+
+        private static readonly object Lock = new object();  //锁
+        private static RIOperate? ThisObjList; //自身对象
+        /// <summary>
+        /// 单例模式
+        /// </summary>
+        /// <returns></returns>
+        public static RIOperate Instance()
+        {
+            if (ThisObjList == null)
+            {
+                lock (Lock)
+                {
+                    if (ThisObjList == null)
+                    {
+                        ThisObjList = new RIOperate();
+                    }
+                }
+            }
+            return ThisObjList;
+        }
+
+        /// <summary>
+        /// 方法的IOC容器
+        /// key 标识符,$"{ClassData.SN}{MethodData.SN}"
+        /// value (个个Dll反射的结果)
+        /// </summary>
+        private ConcurrentDictionary<string, ReflectionMethodResult> MethodIocContainer = new ConcurrentDictionary<string, ReflectionMethodResult>();
+        /// <summary>
+        /// 事件的IOC容器
+        /// key 标识符,$"{ClassData.SN}{MethodData.SN}"
+        /// value (个个Dll反射的结果)
+        /// </summary>
+        private ConcurrentDictionary<string, ReflectionEventResult> EventIocContainer = new ConcurrentDictionary<string, ReflectionEventResult>();
+        /// <summary>
+        /// 对象容器
+        /// </summary>
+        private ConcurrentDictionary<string, object> ObjectIocContainer = new ConcurrentDictionary<string, object>();
+
+        /// <summary>
+        /// 初始化
+        /// </summary>
+        /// <returns></returns>
+        public OperateResult Init(Basics data)
+        {
+            Depart("Init");
+            try
+            {
+                //得到DLL数据
+                foreach (var DllData in data.DllDatas)
+                {
+                    Assembly? assembly = null;
+                    //是不是绝对路径
+                    if (DllData.IsAbsolutePath)
+                    {
+                        if (File.Exists(DllData.DllPath))
+                        {
+                            assembly = Assembly.LoadFile(DllData.DllPath);
+                        }
+                        else
+                        {
+                            return Break("Init", false, $"{DllData.DllPath} 文件不存在");
+                        }
+                    }
+                    else
+                    {
+                        //文件路径拼接
+                        string path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, DllData.DllPath);
+                        //文件判断
+                        if (File.Exists(path))
+                        {
+                            assembly = Assembly.LoadFile(path);
+                        }
+                        else
+                        {
+                            return Break("Init", false, $"{path} 文件不存在");
+                        }
+                    }
+
+                    foreach (var NamespaceData in DllData.NamespaceDatas)
+                    {
+                        //Dll下需要反射的类数据
+                        foreach (var ClassData in NamespaceData.ClassDatas)
+                        {
+                            //命名空间加类名
+                            string NamespaceAndClassName = $"{NamespaceData.Namespace}.{ClassData.ClassName}";
+
+                            //获取类型
+                            Type? NamespaceAndClassNameType = assembly.GetType(NamespaceAndClassName, false, true);
+
+                            //类型不能为空
+                            if (NamespaceAndClassNameType != null)
+                            {
+                                //创建该对象的实例
+                                object? instanceObject = CreateInstance(NamespaceAndClassNameType, ClassData.ConstructorParam);
+                                if (instanceObject != null)
+                                {
+                                    if (!ObjectIocContainer.ContainsKey(NamespaceAndClassNameType.FullName))
+                                    {
+                                        ObjectIocContainer.TryAdd(NamespaceAndClassNameType.FullName, instanceObject);
+                                    }
+                                }
+                                if (ClassData.MethodDatas != null)
+                                {
+                                    //遍历方法
+                                    foreach (var MethodData in ClassData.MethodDatas)
+                                    {
+                                        //获取方法
+                                        MethodInfo? methodInfo = NamespaceAndClassNameType.GetMethod(MethodData.MethodName);
+                                        if (methodInfo != null)
+                                        {
+                                            //结果数据
+                                            ReflectionMethodResult reflectResult = new ReflectionMethodResult()
+                                            {
+                                                InstanceObject = ObjectIocContainer[NamespaceAndClassNameType.FullName],
+                                                Method = methodInfo
+                                            };
+                                            //存在直接更新,不存在新增
+                                            MethodIocContainer.AddOrUpdate($"{ClassData.SN}{MethodData.SN}", reflectResult, (K, V) => reflectResult);
+
+                                            //执行此方法
+                                            if (MethodData.WhetherExecute)
+                                            {
+                                                //执行此函数,不管返回结果
+                                                methodInfo?.Invoke(ObjectIocContainer[NamespaceAndClassNameType.FullName], ParamTypeConvert(MethodData.MethodParam, methodInfo));
+                                            }
+                                        }
+                                        else
+                                        {
+                                            return Break("Init", false, $"{DllData.DllPath} -> {NamespaceData.Namespace}.{ClassData.ClassName} -> {MethodData.MethodName} 方法不存在");
+                                        }
+                                    }
+                                }
+                                if (ClassData.EventDatas != null)
+                                {
+                                    //遍历事件
+                                    foreach (var EventData in ClassData.EventDatas)
+                                    {
+                                        //获取方法
+                                        EventInfo? eventInfo = NamespaceAndClassNameType.GetEvent(EventData.EventName);
+                                        if (eventInfo != null)
+                                        {
+                                            //结果数据
+                                            ReflectionEventResult reflectResult = new ReflectionEventResult()
+                                            {
+                                                InstanceObject = ObjectIocContainer[NamespaceAndClassNameType.FullName],
+                                                Event = eventInfo
+                                            };
+                                            //存在直接更新,不存在新增
+                                            EventIocContainer.AddOrUpdate($"{ClassData.SN}{EventData.SN}", reflectResult, (K, V) => reflectResult);
+                                        }
+                                        else
+                                        {
+                                            return Break("Init", false, $"{DllData.DllPath} -> {NamespaceData.Namespace}.{ClassData.ClassName} -> {EventData.EventName} 事件不存在");
+                                        }
+                                    }
+                                }
+                            }
+                            else
+                            {
+                                return Break("Init", false, $"请检查 {DllData.DllPath} -> {NamespaceData.Namespace}.{ClassData.ClassName} 类名的准确性");
+                            }
+                        }
+                    }
+                }
+                ReflectionState = true;
+                return Break("Init", true, "反射初始化成功", MethodIocContainer);
+            }
+            catch (Exception ex)
+            {
+                return Break("Init", false, ex.Message, Exc: ex);
+            }
+        }
+
+        /// <summary>
+        /// 创建实例
+        /// </summary>
+        /// <param name="NamespaceAndClassNameType">类型</param>
+        /// <param name="ConstructorParam">构造函数入参</param>
+        /// <returns></returns>
+        private object? CreateInstance(Type? NamespaceAndClassNameType, object[]? ConstructorParam)
+        {
+            //转换后的参数
+            object[]? Param = null;
+
+            if (ConstructorParam != null)
+            {
+                //获取构造函数信息
+                ConstructorInfo? constructorInfo = NamespaceAndClassNameType?.GetConstructors().FirstOrDefault();
+                //数据类型转换
+                Param = ParamTypeConvert(ConstructorParam, constructorInfo);
+            }
+            //创建实例
+            return Activator.CreateInstance(NamespaceAndClassNameType, Param);
+        }
+
+
+        /// <summary>
+        /// 无参初始化
+        /// </summary>
+        /// <returns></returns>
+        private OperateResult Init()
+        {
+            if (this.basics != null)
+            {
+                return Init(this.basics);
+            }
+            return Break(Depart("Init"), false, "请设置反射DLL配置");
+        }
+
+        /// <summary>
+        /// 参数类型转换
+        /// </summary>
+        /// <returns></returns>
+        private object[]? ParamTypeConvert(object[] Data, object Info)
+        {
+            if (Data != null)
+            {
+                ParameterInfo[]? ParamArray = null;
+                List<object> param = new List<object>();
+                if (Info.GetType().ToString().Contains("MethodInfo"))
+                {
+                    ParamArray = (Info as MethodInfo).GetParameters();
+                    if (ParamArray != null)
+                    {
+                        for (int i = 0; i < ParamArray.Count(); i++)
+                        {
+                            if (string.IsNullOrEmpty(ParamArray[i].ParameterType.FullName))
+                            {
+                                param.Add(Data[i]);
+                            }
+                            else
+                            {
+                                param.Add(Convert.ChangeType(Data[i], ParamArray[i].ParameterType));
+                            }
+                        }
+                    }
+                }
+                if (Info.GetType().ToString().Contains("ConstructorInfo"))
+                {
+                    ParamArray = (Info as ConstructorInfo).GetParameters();
+                    if (ParamArray != null)
+                    {
+                        for (int i = 0; i < ParamArray.Count(); i++)
+                        {
+                            object? model = Activator.CreateInstance(ParamArray[i].ParameterType);
+                            PropertyInfo[] properties = ParamArray[i].ParameterType.GetProperties();
+                            foreach (var propertie in properties)
+                            {
+                                JObject? JsonObject = Newtonsoft.Json.JsonConvert.DeserializeObject<JObject>(Data[i].ToJson());
+                                propertie.SetValue(model, Convert.ChangeType(JsonObject[propertie.Name], propertie.PropertyType));
+                            }
+                            if (model != null)
+                            {
+                                param.Add(model);
+                            }
+                        }
+                    }
+                }
+                if (param.Count > 0)
+                {
+                    return param.ToArray();
+                }
+            }
+            return null;
+        }
+
+        /// <summary>
+        /// 执行方法
+        /// </summary>
+        /// <param name="SN">方法的唯一标识符</param>
+        /// <param name="MethodParam">方法参数</param>
+        /// <returns></returns>
+        public object? ExecuteMethod(string? SN, object[]? MethodParam = null)
+        {
+
+            ReflectionMethodResult? reflectionMethodResult = GetMethod(SN);
+
+            if (reflectionMethodResult != null)
+            {
+                //转换后的参数
+                object[]? Param = ParamTypeConvert(MethodParam, reflectionMethodResult.Method);
+
+                //返回执行结果
+                return reflectionMethodResult.Method?.Invoke(reflectionMethodResult.InstanceObject, Param);
+            }
+            else
+            {
+                return Break(Depart("ExecuteMethod"), false, "执行失败,未找到反射的数据");
+            }
+        }
+
+        /// <summary>
+        /// 获取所有方法
+        /// </summary>
+        /// <returns></returns>
+        public ConcurrentDictionary<string, ReflectionMethodResult>? GetMethod()
+        {
+            if (MethodIocContainer != null && MethodIocContainer.Count > 0)
+            {
+                return MethodIocContainer;
+            }
+            return null;
+        }
+
+        /// <summary>
+        /// 获取指定SN的方法
+        /// </summary>
+        /// <returns></returns>
+        public ReflectionMethodResult? GetMethod(string SN)
+        {
+            if (MethodIocContainer != null && MethodIocContainer.Count > 0)
+            {
+                return MethodIocContainer[SN];
+            }
+            return null;
+        }
+
+        /// <summary>
+        /// /// <summary>
+        /// 注册事件
+        /// </summary>
+        /// <param name="SN">唯一标识符</param>
+        /// <param name="Register">是否注册 ,true 注册 false 移除</param>
+        /// <param name="P1">一个参数的事件动作</param>
+        /// <param name="P2">二个参数的事件动作</param>
+        /// <param name="P3">三个参数的事件动作</param>
+        /// <param name="P4">四个参数的事件动作</param>
+        /// <param name="P5">五个参数的事件动作</param>
+        /// <param name="P6">六个参数的事件动作</param>
+        /// <returns></returns>
+        public OperateResult RegisterEvent(string SN, bool Register,
+            Action<object>? P1 = null,
+            Action<object, object>? P2 = null,
+            Action<object, object, object>? P3 = null,
+            Action<object, object, object, object>? P4 = null,
+            Action<object, object, object, object, object>? P5 = null,
+            Action<object, object, object, object, object, object>? P6 = null)
+        {
+            Depart("RegisterEvent");
+            ReflectionEventResult? reflectionEventResult = GetEvent(SN);
+            if (reflectionEventResult != null)
+            {
+                if (reflectionEventResult.Event.EventHandlerType != null)
+                {
+                    Delegate? @delegate = null;
+                    if (P1 != null)
+                    {
+                        @delegate = Delegate.CreateDelegate(reflectionEventResult.Event.EventHandlerType, P1.Target, P1.Method);
+                    }
+                    if (P2 != null)
+                    {
+                        @delegate = Delegate.CreateDelegate(reflectionEventResult.Event.EventHandlerType, P2.Target, P2.Method);
+                    }
+                    if (P3 != null)
+                    {
+                        @delegate = Delegate.CreateDelegate(reflectionEventResult.Event.EventHandlerType, P3.Target, P3.Method);
+                    }
+                    if (P4 != null)
+                    {
+                        @delegate = Delegate.CreateDelegate(reflectionEventResult.Event.EventHandlerType, P4.Target, P4.Method);
+                    }
+                    if (P5 != null)
+                    {
+                        @delegate = Delegate.CreateDelegate(reflectionEventResult.Event.EventHandlerType, P5.Target, P5.Method);
+                    }
+                    if (P6 != null)
+                    {
+                        @delegate = Delegate.CreateDelegate(reflectionEventResult.Event.EventHandlerType, P6.Target, P6.Method);
+                    }
+                    if (Register)
+                    {
+                        reflectionEventResult.Event.AddEventHandler(reflectionEventResult.InstanceObject, @delegate);
+                    }
+                    else
+                    {
+                        reflectionEventResult.Event.RemoveEventHandler(reflectionEventResult.InstanceObject, @delegate);
+                    }
+                    return Break("RegisterEvent", true, "事件注册成功");
+                }
+                else
+                {
+                    return Break("RegisterEvent", false, "事件注册失败,未找到反射的数据类型");
+                }
+            }
+            else
+            {
+                return Break("RegisterEvent", false, "事件注册失败,未找到反射的数据");
+            }
+        }
+
+
+        /// <summary>
+        /// 获取反射的实例
+        /// </summary>
+        /// <param name="SN"></param>
+        /// <returns></returns>
+        public object? ReflectionInstance(string SN = "YSAI.RelayManage.RelayManageOperate")
+        {
+            if (ObjectIocContainer.Count > 0)
+            {
+                return ObjectIocContainer[SN];
+            }
+            return null;
+        }
+
+        /// <summary>
+        /// 获取所有事件
+        /// </summary>
+        /// <returns></returns>
+        public ConcurrentDictionary<string, ReflectionEventResult>? GetEvent()
+        {
+            if (EventIocContainer != null && EventIocContainer.Count > 0)
+            {
+                return EventIocContainer;
+            }
+            return null;
+        }
+
+        /// <summary>
+        /// 获取指定SN的事件
+        /// </summary>
+        /// <returns></returns>
+        public ReflectionEventResult? GetEvent(string SN)
+        {
+            if (EventIocContainer != null && EventIocContainer.Count > 0)
+            {
+                return EventIocContainer[SN];
+            }
+            return null;
+        }
+
+        public void Dispose()
+        {
+            ReflectionState = false;
+            ObjectIocContainer.Clear();
+            MethodIocContainer.Clear();
+            EventIocContainer.Clear();
+            GC.Collect();
+            GC.SuppressFinalize(this);
+            ThisObjList = null;
+        }
+    }
+}

+ 44 - 103
src/YSAI.DAQ/YSAI.Core/reflection/ReflectionOperate.cs

@@ -3,125 +3,77 @@ using System.Collections.Concurrent;
 using System.Reflection;
 using YSAI.Core.data;
 using YSAI.Core.@interface;
-using YSAI.Log;
 using YSAI.Unility;
 using static YSAI.Core.reflection.ReflectionData;
-using static YSAI.Core.reflection.ReflectionData.Basics;
-using static YSAI.Core.reflection.ReflectionData.Basics.DllData;
-using static YSAI.Core.reflection.ReflectionData.Basics.DllData.NamespaceData;
-using static YSAI.Core.reflection.ReflectionData.Basics.DllData.NamespaceData.ClassData;
 
 namespace YSAI.Core.reflection
 {
-    /*
-     
-        1.你得先生成配置
-
-        2.在初始化
-
-        3.在调用方法或注册事件
-     
-     */
     /// <summary>
     /// 反射操作
+    ///  1.你得先生成配置
+    ///  2.在初始化
+    ///  3.在调用方法或注册事件
     /// </summary>
     public class ReflectionOperate : IBaseAbstract, IDisposable
     {
         protected override string LogHead => "[ ReflectionOperate 操作 ]";
         protected override string ClassName => "ReflectionOperate";
+
+        private static readonly object Lock = new object();  //锁
+        private static List<ReflectionOperate> ThisObjList = new List<ReflectionOperate>(); //自身对象集合
         /// <summary>
-        /// 文件夹
-        /// </summary>
-        public readonly static string ConfigDirectory = "config";
-        /// <summary>
-        /// 文件
-        /// </summary>
-        public readonly static string ConfigFile = $"{AppDomain.CurrentDomain.BaseDirectory}{ConfigDirectory}//ReflectionConfig.json";
-        /// <summary>
-        /// 配置数据
-        /// </summary>
-        private Basics? basics;
-        /// <summary>
-        /// 获取配置
+        /// 单例模式
         /// </summary>
+        /// <param name="basics">基础数据</param>
         /// <returns></returns>
-        public Basics? GetConfig()
+        public static ReflectionOperate Instance(ReflectionData.Basics basics)
         {
-            try
+            ReflectionOperate? exp = ThisObjList.FirstOrDefault(c => c.basics.Equals(basics));
+            if (exp == null)
             {
-                if (File.Exists(ConfigFile))  //配置存在
+                lock (Lock)
                 {
-                    return JsonTool.StringToJsonEntity<Basics>(FileTool.FileToString(ConfigFile));
+                    if (ThisObjList.Count(c => c.basics.Equals(basics)) > 0)
+                    {
+                        return ThisObjList.First(c => c.basics.Equals(basics));
+                    }
+                    else
+                    {
+                        ReflectionOperate exp2 = new ReflectionOperate(basics);
+                        ThisObjList.Add(exp2);
+                        return exp2;
+                    }
                 }
             }
-            catch (Exception ex)
-            {
-                Console.WriteLine($"获取配置异常:{ex.Message}");
-            }
-            return null;
+            return exp;
         }
+
         /// <summary>
-        /// 设置配置
+        /// 构造函数
         /// </summary>
-        /// <returns></returns>
-        public bool SetConfig(Basics basics)
+        /// <param name="Basics">基础数据</param>
+        public ReflectionOperate(ReflectionData.Basics basics)
         {
-            try
-            {
-                //实体转JSON字符串
-                string json = JsonTool.JsonEntityToString(basics);
-                //写入文件
-                File.WriteAllText(ConfigFile, JsonTool.JsonFormatting(json));
-                return true;
-            }
-            catch (Exception ex)
-            {
-                Console.WriteLine($"设置配置异常:{ex.Message}");
-            }
-            return false;
+            //设置参数
+            this.basics = basics;
         }
-
         /// <summary>
-        /// 反射状态
+        /// 基础数据
         /// </summary>
-        public bool ReflectionState { get; set; }
+        private ReflectionData.Basics basics;
 
         /// <summary>
-        /// 构造函数处理配置
+        /// 反射状态
         /// </summary>
-        public ReflectionOperate()
-        {
-            //获取配置
-            this.basics = GetConfig();
-            if (basics != null)
-            {
-                OperateResult operateResult = Init();
-                if (!operateResult.State)
-                {
-                    LogHelper.Error("反射初始化异常:" + operateResult.Message, $"{ClassName}.log");
-                }
-            }
-        }
+        public bool ReflectionState { get; set; }
 
-        private static readonly object Lock = new object();  //锁
-        private static ReflectionOperate? ThisObjList; //自身对象
         /// <summary>
-        /// 单例模式
+        /// 获取反射状态
         /// </summary>
         /// <returns></returns>
-        public static ReflectionOperate Instance()
+        public bool GetStatus()
         {
-            if (ThisObjList == null)
-            {
-                lock (Lock)
-                {
-                    if (ThisObjList == null)
-                    {
-                        ThisObjList = new ReflectionOperate();
-                    }
-                }
-            }
-            return ThisObjList;
+            return ReflectionState;
         }
 
         /// <summary>
@@ -145,13 +97,13 @@ namespace YSAI.Core.reflection
         /// 初始化
         /// </summary>
         /// <returns></returns>
-        public OperateResult Init(Basics data)
+        public OperateResult Init()
         {
             Depart("Init");
             try
             {
                 //得到DLL数据
-                foreach (var DllData in data.DllDatas)
+                foreach (var DllData in basics.DllDatas)
                 {
                     Assembly? assembly = null;
                     //是不是绝对路径
@@ -298,20 +250,6 @@ namespace YSAI.Core.reflection
             return Activator.CreateInstance(NamespaceAndClassNameType, Param);
         }
 
-
-        /// <summary>
-        /// 无参初始化
-        /// </summary>
-        /// <returns></returns>
-        private OperateResult Init()
-        {
-            if (this.basics != null)
-            {
-                return Init(this.basics);
-            }
-            return Break(Depart("Init"), false, "请设置反射DLL配置");
-        }
-
         /// <summary>
         /// 参数类型转换
         /// </summary>
@@ -432,7 +370,7 @@ namespace YSAI.Core.reflection
         /// <param name="P4">四个参数的事件动作</param>
         /// <param name="P5">五个参数的事件动作</param>
         /// <param name="P6">六个参数的事件动作</param>
-        /// <returns></returns>
+        /// <returns>统一返回</returns>
         public OperateResult RegisterEvent(string SN, bool Register,
             Action<object>? P1 = null,
             Action<object, object>? P2 = null,
@@ -499,7 +437,7 @@ namespace YSAI.Core.reflection
         /// </summary>
         /// <param name="SN"></param>
         /// <returns></returns>
-        public object? ReflectionInstance(string SN = "YSAI.RelayManage.RelayManageOperate")
+        public object? ReflectionInstance(string SN)
         {
             if (ObjectIocContainer.Count > 0)
             {
@@ -534,6 +472,9 @@ namespace YSAI.Core.reflection
             return null;
         }
 
+        /// <summary>
+        /// 释放
+        /// </summary>
         public void Dispose()
         {
             ReflectionState = false;
@@ -542,7 +483,7 @@ namespace YSAI.Core.reflection
             EventIocContainer.Clear();
             GC.Collect();
             GC.SuppressFinalize(this);
-            ThisObjList = null;
+            ThisObjList.Remove(this);
         }
     }
 }

+ 6 - 5
src/YSAI.DAQ/YSAI.Core/subscribe/SubscribeOperate.cs

@@ -45,22 +45,23 @@ namespace YSAI.Core.subscription
         /// <summary>
         /// 构造函数
         /// </summary>
-        /// <param name="OpcUaData.Basics">基础数据</param>
+        /// <param name="basics">基础数据</param>
         public SubscribeOperate(SubscribeData.Basics basics)
         {
             //设置参数
             this.basics = basics;
         }
-        /// <summary>
-        /// 监控开关 
-        /// </summary>
-        CancellationTokenSource MonitorSwitch;
 
         /// <summary>
         /// 基础数据
         /// </summary>
         SubscribeData.Basics basics;
 
+        /// <summary>
+        /// 监控开关 
+        /// </summary>
+        CancellationTokenSource MonitorSwitch;
+
         /// <summary>
         /// 轮询任务处理
         /// </summary>

+ 1 - 1
src/YSAI.DAQ/YSAI.DB/YSAI.DB.csproj

@@ -13,7 +13,7 @@
   </PropertyGroup>
 
 	<ItemGroup>
-		<PackageReference Include="Dapper" Version="2.0.151" />
+		<PackageReference Include="Dapper" Version="2.1.4" />
 		<PackageReference Include="MySql.Data" Version="8.1.0" />
 		<PackageReference Include="System.Data.OracleClient" Version="1.0.8" />
 		<PackageReference Include="System.Data.SqlClient" Version="4.8.5" />

+ 1 - 1
src/YSAI.DAQ/YSAI.Mqtt/client/MqttClientOperate.cs

@@ -358,7 +358,7 @@ namespace YSAI.Mqtt.client
             Depart("GetStatus");
             if (!mqttClient.IsConnected)
             {
-                return Break("GetStatus", true, "未连接");
+                return Break("GetStatus", false, "未连接");
             }
             return Break("GetStatus", true, "已连接");
         }

+ 20 - 20
src/YSAI.DAQ/YSAI.Opc/ua/client/OpcUaClientOperate.cs

@@ -794,17 +794,17 @@ namespace YSAI.Opc.ua.client
                                 //添加订阅
                                 clientSession?.AddSubscription(allSubscriptions[Tag]);
                                 //在服务器上创建订阅并添加所有监视项
-                                if (allSubscriptions[Tag].CreateAsync().Wait(basics.Timeout))
-                                {
-                                    // 将任何更改应用于订阅项
-                                    if (!allSubscriptions[Tag].ApplyChangesAsync().Wait(basics.Timeout))
-                                    {
-                                        allSubscriptions?.Remove(Tag, out _);
-                                        return Break("AddSubscribe", false, "将任何更改应用于订阅项超时");
-                                    }
-                                }
-                                else
+                                if (!allSubscriptions[Tag].CreateAsync().Wait(basics.Timeout))
                                 {
+                                    //// 将任何更改应用于订阅项
+                                    //if (!allSubscriptions[Tag].ApplyChangesAsync().Wait(basics.Timeout))
+                                    //{
+                                    //    allSubscriptions?.Remove(Tag, out _);
+                                    //    return Break("AddSubscribe", false, "将任何更改应用于订阅项超时");
+                                    //}
+                                //}
+                                //else
+                                //{
                                     allSubscriptions?.Remove(Tag, out _);
                                     return Break("AddSubscribe", false, "在服务器上创建订阅并添加所有监视项超时");
                                 }
@@ -851,17 +851,17 @@ namespace YSAI.Opc.ua.client
                             //添加订阅
                             clientSession?.AddSubscription(allSubscriptions[Tag]);
                             //在服务器上创建订阅并添加所有监视项
-                            if (allSubscriptions[Tag].CreateAsync().Wait(basics.Timeout))
-                            {
-                                // 将任何更改应用于订阅项
-                                if (!allSubscriptions[Tag].ApplyChangesAsync().Wait(basics.Timeout))
-                                {
-                                    allSubscriptions?.Remove(Tag, out _);
-                                    return Break("AddSubscribe", false, "将任何更改应用于订阅项超时");
-                                }
-                            }
-                            else
+                            if (!allSubscriptions[Tag].CreateAsync().Wait(basics.Timeout))
                             {
+                            //    // 将任何更改应用于订阅项
+                            //    if (!allSubscriptions[Tag].ApplyChangesAsync().Wait(basics.Timeout))
+                            //    {
+                            //        allSubscriptions?.Remove(Tag, out _);
+                            //        return Break("AddSubscribe", false, "将任何更改应用于订阅项超时");
+                            //    }
+                            //}
+                            //else
+                            //{
                                 allSubscriptions?.Remove(Tag, out _);
                                 return Break("AddSubscribe", false, "在服务器上创建订阅并添加所有监视项超时");
                             }

BIN
src/YSAI.DAQ/YSAI.Pack/YSAI.Can.Pack/YSAI.Can.dll


BIN
src/YSAI.DAQ/YSAI.Pack/YSAI.Can.Pack/YSAI.Can.pdb


BIN
src/YSAI.DAQ/YSAI.Pack/YSAI.Can.Pack/YSAI.Core.dll


BIN
src/YSAI.DAQ/YSAI.Pack/YSAI.DB.Pack/YSAI.Core.dll


BIN
src/YSAI.DAQ/YSAI.Pack/YSAI.DB.Pack/YSAI.DB.dll


BIN
src/YSAI.DAQ/YSAI.Pack/YSAI.DB.Pack/YSAI.DB.pdb


BIN
src/YSAI.DAQ/YSAI.Pack/YSAI.Kafka.Pack/YSAI.Core.dll


BIN
src/YSAI.DAQ/YSAI.Pack/YSAI.Kafka.Pack/YSAI.Kafka.dll


BIN
src/YSAI.DAQ/YSAI.Pack/YSAI.Kafka.Pack/YSAI.Kafka.pdb


BIN
src/YSAI.DAQ/YSAI.Pack/YSAI.Modbus.Pack/YSAI.Core.dll


BIN
src/YSAI.DAQ/YSAI.Pack/YSAI.Modbus.Pack/YSAI.Modbus.dll


BIN
src/YSAI.DAQ/YSAI.Pack/YSAI.Modbus.Pack/YSAI.Modbus.pdb


BIN
src/YSAI.DAQ/YSAI.Pack/YSAI.Mqtt.Pack/YSAI.Core.dll


BIN
src/YSAI.DAQ/YSAI.Pack/YSAI.Mqtt.Pack/YSAI.Mqtt.dll


BIN
src/YSAI.DAQ/YSAI.Pack/YSAI.Mqtt.Pack/YSAI.Mqtt.pdb


+ 2 - 2
src/YSAI.DAQ/YSAI.Pack/YSAI.Mqtt.Pack/YSAI.Mqtt.xml

@@ -92,7 +92,7 @@
             消息事件
             </summary>
         </member>
-        <member name="M:YSAI.Mqtt.client.MqttClientOperate.PublishSubscribeAsync(System.String,System.String,System.Int32,System.Boolean)">
+        <member name="M:YSAI.Mqtt.client.MqttClientOperate.PublishAsync(System.String,System.String,System.Int32,System.Boolean)">
             <summary>
             发布订阅
             </summary>
@@ -109,7 +109,7 @@
             <param name="Retain">消息是否保留</param>
             <returns>统一结果</returns>
         </member>
-        <member name="M:YSAI.Mqtt.client.MqttClientOperate.PublishSubscribe(System.String,System.String,System.Int32,System.Boolean)">
+        <member name="M:YSAI.Mqtt.client.MqttClientOperate.Publish(System.String,System.String,System.Int32,System.Boolean)">
             <summary>
             发布订阅
             </summary>

BIN
src/YSAI.DAQ/YSAI.Pack/YSAI.Opc.Pack/YSAI.Core.dll


BIN
src/YSAI.DAQ/YSAI.Pack/YSAI.Opc.Pack/YSAI.Opc.dll


BIN
src/YSAI.DAQ/YSAI.Pack/YSAI.Opc.Pack/YSAI.Opc.pdb


BIN
src/YSAI.DAQ/YSAI.Pack/YSAI.RabbitMQ.Pack/YSAI.Core.dll


BIN
src/YSAI.DAQ/YSAI.Pack/YSAI.RabbitMQ.Pack/YSAI.RabbitMQ.dll


BIN
src/YSAI.DAQ/YSAI.Pack/YSAI.RabbitMQ.Pack/YSAI.RabbitMQ.pdb


BIN
src/YSAI.DAQ/YSAI.Pack/YSAI.S7.Pack/YSAI.Core.dll


BIN
src/YSAI.DAQ/YSAI.Pack/YSAI.S7.Pack/YSAI.S7.dll


BIN
src/YSAI.DAQ/YSAI.Pack/YSAI.S7.Pack/YSAI.S7.pdb


+ 1 - 1
src/YSAI.DAQ/YSAI.RabbitMQ/RabbitMQOperate.cs

@@ -428,7 +428,7 @@ namespace YSAI.RabbitMQ
             Depart("GetStatus");
             if (connection == null || !connection.IsOpen)
             {
-                return Break("GetStatus", true, "未连接");
+                return Break("GetStatus", false, "未连接");
             }
             return Break("GetStatus", true, "已连接");
         }

+ 3 - 0
src/YSAI.DAQ/YSAI.Test.All/Program.cs

@@ -1,5 +1,8 @@
 
 
+
+
+
 //TcpClientOperate tcpClientOperate = TcpClientOperate.Instance(new TcpClientData.Basics
 //{
 //    Ip = "127.0.0.1",

+ 2 - 1
src/YSAI.DAQ/YSAI.Test.All/YSAI.Test.All.csproj

@@ -5,10 +5,11 @@
     <TargetFramework>net6.0</TargetFramework>
     <ImplicitUsings>enable</ImplicitUsings>
     <Nullable>enable</Nullable>
+	<SatelliteResourceLanguages>zh-Hans</SatelliteResourceLanguages>
   </PropertyGroup>
 
   <ItemGroup>
-    <ProjectReference Include="..\YSAI.Core\YSAI.Core.csproj" />
+    <PackageReference Include="Microsoft.CodeAnalysis.CSharp.Scripting" Version="4.7.0" />
   </ItemGroup>
 
 </Project>

+ 2 - 2
src/YSAI.DAQ/YSAI.Unility/YSAI.Unility.csproj

@@ -5,7 +5,7 @@
 		<ImplicitUsings>enable</ImplicitUsings>
 		<Nullable>enable</Nullable>
 		<GeneratePackageOnBuild>True</GeneratePackageOnBuild>
-		<Version>1.0.0.12</Version>
+		<Version>1.0.0.13</Version>
 		<Authors>Shun</Authors>
 		<Company>YSAI</Company>
 		<Product>SCADA</Product>
@@ -13,7 +13,7 @@
 	</PropertyGroup>
 
 	<ItemGroup>
-		<PackageReference Include="Microsoft.IdentityModel.Tokens" Version="7.0.0" />
+		<PackageReference Include="Microsoft.IdentityModel.Tokens" Version="7.0.2" />
 		<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
 	</ItemGroup>