)
Assembly程序集在c#力就是编译后的.dll/.exe文件。立方体图标代表程序集类型代表这是一个反应编译后程序集元数据的类用来读取dll/exe里面的类型版本、资源等反射相关信息。Assembly.GetExecutingAssembly()方法含义获取包含当前正在执行这行代码的那个程序集dll/exe).关键区分 3 个极易搞混的静态方法表格方法作用Assembly.GetExecutingAssembly()执行当前这行代码所在的程序集Assembly.GetCallingAssembly()调用当前方法的上层调用方所在程序集Assembly.GetEntryAssembly()程序入口点所在程序集主 exe假设A.exe主程序调用 B.dll 里面的方法B.dll 内部执行Assembly.GetExecutingAssembly() 返回的是B.dll因为这行代码写在 B.dll 里面正在 B.dll 中执行。如果 B.dll 里面调用GetEntryAssembly()返回的是A.exe因为 A 是程序启动入口。常用业务场景// 获取当前代码所在dll/exe Assembly curAsm Assembly.GetExecutingAssembly(); // 1. 获取当前程序集版本号 var ver curAsm.GetName().Version; // 2. 读取嵌入资源内嵌在dll里的文件 var stream curAsm.GetManifestResourceStream(xxx.xxx.txt); // 3. 获取当前程序集所有类型做反射扫描插件、自动注册 var allTypes curAsm.GetTypes();GetExecutingAssembly()拿到写这行代码的那个 dll/exe 程序集对象用于反射读取版本、内嵌资源、扫描类等操作。user32.dll :Window操作系统核心用户模块所有窗口、弹窗、按钮、窗口显示/隐藏/置顶的API都在这里。什么是序列化与反序列化在 C# 程序内部数据是存放在“对象Object”里的比如咱们之前聊过的TemperatureModel类。但是网线和文件是不认识 C# 对象的它们只认纯文本。序列化 (Serialization)就是“打包发货”。把 C# 内存里活生生的对象按照特定的格式比如 JSON 格式变成一串纯文本字符串。这样就可以通过网络发送出去或者保存在硬盘里。反序列化 (Deserialization)就是“拆开快递”。把从网络上接收到的 JSON 纯文本字符串重新转换回 C# 程序能直接操作的对象模型。Newtonsoft.Json.Linq 到底是干嘛的Newtonsoft.Json是 C# 中最流行、最强大的 JSON 处理工具包。而它里面的Linq命名空间主要包含JObject、JArray等功能则是一把“免预制的万能拆箱刀”。在常规的反序列化中为了接收数据你必须提前在 C# 里写好一个与 JSON 结构一模一样的实体类Model。但这有时候会很痛苦对方发来的 JSON 数据极其庞大嵌套了十几层。你其实只需要里面的一两个小数据比如仅仅需要一个“温度”值完全不想费时费力去写一个庞杂的实体类。这就是Newtonsoft.Json.Linq登场的时刻它允许你不需要提前写任何实体类直接在内存里动态解析 JSON 字符串像查字典一样去提取你想要的内容。️ 直观的“妙用”对比假设云平台给你发来了一段字符串{Device: Sensor1, Data: {Temp: 35.5}}使用Linq里的JObject你可以像剥洋葱一样极其灵活地直接抓取想要的数据代码非常清爽// 1. 把纯文本直接当做动态 JSON 对象解析JObject jsonObj JObject.Parse(jsonString);// 2. 像查字典一样一层一层直接提取想要的数字double temp (double)jsonObj[Data][Temp];完全不需要建任何类用中括号[名字]就能把隐藏在深处的35.5精准提取出来Newtonsoft.Json又叫Json.NET .NET生态最流行的第三方JSON库现在虽然微软有自带的System.Text.Json,但大量老项目、工业上位机项目依旧广泛使用Newtonsoft.Json。Newtonsoft.Json.Linq是它下面的LINQ to Json 子命名空间专门用来动态读写JSON不需要预先定义实体类。1、完整序列化映射实体类模型using Newtownsoft.Json;2、LINQ to JSON 动态操作JSON对象不需要实体。using Newtonsoft.Json.Linq命名空间用途核心类Newtonsoft.Json把对象 ↔ JSON 字符串序列化 / 反序列化JsonConvertNewtonsoft.Json.Linq动态解析、构造、查询 JSON不用写 model 类JObject、JArray、JToken、JValue2、核心类来自Newtonsoft.Json.LinqJObject代表一个 JSON 对象{ name:张三 }JArray代表 JSON 数组[1,2,3]JToken所有 JSON 节点的基类可以代表对象、数组、属性、值万能节点JValue简单值字符串、数字、bool、null✨使用场景什么时候要用Newtonsoft.Json.Linq不想定义实体 class但是要读取 / 修改 json 里面某几个字段比如你拿到一段 JSON只需要取其中 1‑2 个字段不想新建一大堆实体类就用JObject动态解析。示例 1解析 JSON 字符串不用实体类using Newtonsoft.Json.Linq; string jsonText { DeviceId: DEV001, Status: 1, DataList:[11,22,33] }; // 将json文本解析成JObject JObject jObj JObject.Parse(jsonText); // 读取字段 string devId (string)jObj[DeviceId]; int status (int)jObj[Status]; // 获取数组 JArray JArray arr (JArray)jObj[DataList]; int first (int)arr[0]; //11 // 修改字段 jObj[Status] 2; //转回json字符串 string newJson jObj.ToString();示例 2动态组装 JSONJObject obj new JObject(); obj[Code] 0; obj[Msg] OK; JArray arr new JArray(); arr.Add(100); arr.Add(200); obj[Data] arr; string json obj.ToString(); /*输出 { Code: 0, Msg: OK, Data: [100, 200] } */SqlSugarHelper sql SqlSugarHelper.GetInstance( jObject[dev][DB][tableName].ToString(), jObject[dev][DB][ip].ToString(), jObject[dev][DB][user].ToString(), jObject[dev][DB][pwd].ToString(), jObject[dev][DB][port].ToString() );这是SqlSugar 封装工具类 Newtonsoft.Json.Linq (JObject)组合的数据库初始化代码常见于工业上位机、设备后台程序从 JSON 配置读取数据库参数拿到数据库操作 Helper 实例1、逐个拆解jObject[dev][DB][tableName]jObject就是来自Newtonsoft.Json.Linq的Jobject对象JSON 结构大概是这样配置文件 / 报文{ dev: { DB: { tableName: MyDeviceDb, ip: 127.0.0.1, user: root, pwd: 123456, port: 3306 } } }jObject[dev]→ 获取 dev 节点jObject[dev][DB]→ 获取 dev 下面 DB 数据库配置节点.ToString()把 JToken 节点转为普通字符串。②SqlSugarHelper.GetInstance(...)SqlSugarHelper项目自己封装的静态帮助类不是 SqlSugar 原生类。 SqlSugar 原生是SqlSugarClient项目做了一层包装做成单例模式。GetInstance()静态方法获取 Helper 单例实例传入数据库 5 个参数GetInstance(tableName, ip, user, pwd, port); //参数顺序 //1.tableName数据库名注意变量名容易误导不是表名table是Database数据库名 //2.ip数据库服务器IP地址 //3.user数据库账号 //4.pwd数据库密码 //5.port数据库端口号mysql一般3306controlTaskClassControlTaskFactrory.GetInstance() .selectProcess( jObject[dev][dllName].ToString(), jObject[dev][className].ToString());private void SendDriverT(ControlTaskClass task, ListT list){if (task null) { return; }if (list null || list.Count 0) { return; }Listobject a list.Select(it (object)it).ToList();task.DeltransferDriver?.Invoke(a);}