<?xml version="1.0" encoding="utf-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><title>码栈工坊_源代码分享,技术文章,精品素材,网站模板,网站源码,建站源码,模板下载</title><link>https://www.codepub.top/</link><description>代码分享的平台_开源项目_网站模板_网站源码资源下载</description><item><title>委托的五个基本使用步骤</title><link>https://www.codepub.top/post/628.html</link><description>&lt;section data-tool=&quot;markdown编辑器&quot; data-website=&quot;https://markdown.com.cn/editor&quot; style=&quot;font-size: 16px; color: black; line-height: 1.6; word-spacing: 0px; letter-spacing: 0px; word-break: break-word; overflow-wrap: break-word; text-align: justify; font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, &amp;quot;PingFang SC&amp;quot;, Cambria, Cochin, Georgia, Times, &amp;quot;Times New Roman&amp;quot;, serif; width: 100% !important; max-width: 100% !important; margin: 0px !important; padding: 0px 6px !important; box-sizing: border-box !important; visibility: visible;&quot; data-pm-slice=&quot;0 0 []&quot; class=&quot;js_darkmode__1&quot;&gt;&lt;h1 data-tool=&quot;markdown.com.cn编辑器&quot; style=&quot;margin-top: 30px; margin-bottom: 15px; font-weight: bold; font-size: 24px; color: rgb(89, 89, 89); visibility: visible;&quot; class=&quot;js_darkmode__2&quot;&gt;&lt;span style=&quot;visibility: visible;&quot;&gt;委托的&lt;/span&gt;&lt;span style=&quot;visibility: visible;&quot;&gt;五个基本使用步骤&lt;/span&gt;&lt;/h1&gt;&lt;/section&gt;&lt;h2 data-tool=&quot;markdown.com.cn编辑器&quot; style=&quot;margin-top: 30px; font-weight: bold; font-size: 22px; border-bottom: 2px solid rgb(89, 89, 89); margin-bottom: 30px; color: rgb(89, 89, 89); visibility: visible;&quot; class=&quot;js_darkmode__3&quot;&gt;&lt;span style=&quot;font-size: 22px; display: inline-block; border-bottom: 2px solid #595959; visibility: visible;&quot; class=&quot;js_darkmode__4&quot;&gt;&lt;span style=&quot;visibility: visible;&quot;&gt;1. 委托使用流程&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p data-tool=&quot;markdown.com.cn编辑器&quot; style=&quot;font-size: 16px; padding-top: 8px; padding-bottom: 8px; margin: 0px; line-height: 26px; color: rgb(89, 89, 89); visibility: visible;&quot; class=&quot;js_darkmode__5&quot;&gt;&lt;span style=&quot;visibility: visible;&quot;&gt;委托用于保存并调用符合指定签名的方法。&lt;/span&gt;&lt;/p&gt;&lt;p data-tool=&quot;markdown.com.cn编辑器&quot; style=&quot;font-size: 16px; padding-top: 8px; padding-bottom: 8px; margin: 0px; line-height: 26px; color: rgb(89, 89, 89); visibility: visible;&quot; class=&quot;js_darkmode__6&quot;&gt;&lt;span style=&quot;visibility: visible;&quot;&gt;基本流程：&lt;/span&gt;&lt;/p&gt;&lt;ol style=&quot;list-style-type: decimal;&quot; class=&quot;js_darkmode__7 list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;section style=&quot;margin-top: 5px; margin-bottom: 5px; line-height: 26px; text-align: left; color: rgb(1, 1, 1); font-weight: 500; visibility: visible;&quot; class=&quot;js_darkmode__8&quot;&gt;&lt;span style=&quot;visibility: visible;&quot;&gt;&lt;span style=&quot;font-size: 14px; visibility: visible;&quot;&gt;声明委托类型。&lt;/span&gt;&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section style=&quot;margin-top: 5px; margin-bottom: 5px; line-height: 26px; text-align: left; color: rgb(1, 1, 1); font-weight: 500; visibility: visible;&quot; class=&quot;js_darkmode__9&quot;&gt;&lt;span style=&quot;visibility: visible;&quot;&gt;&lt;span style=&quot;font-size: 14px; visibility: visible;&quot;&gt;编写符合签名的方法。&lt;/span&gt;&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section style=&quot;margin-top: 5px; margin-bottom: 5px; line-height: 26px; text-align: left; color: rgb(1, 1, 1); font-weight: 500; visibility: visible;&quot; class=&quot;js_darkmode__10&quot;&gt;&lt;span style=&quot;visibility: visible;&quot;&gt;&lt;span style=&quot;font-size: 14px; visibility: visible;&quot;&gt;创建委托变量。&lt;/span&gt;&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section style=&quot;margin-top: 5px; margin-bottom: 5px; line-height: 26px; text-align: left; color: rgb(1, 1, 1); font-weight: 500; visibility: visible;&quot; class=&quot;js_darkmode__11&quot;&gt;&lt;span style=&quot;visibility: visible;&quot;&gt;&lt;span style=&quot;font-size: 14px; visibility: visible;&quot;&gt;关联具体方法。&lt;/span&gt;&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section style=&quot;margin-top: 5px; margin-bottom: 5px; line-height: 26px; text-align: left; color: rgb(1, 1, 1); font-weight: 500; visibility: visible;&quot; class=&quot;js_darkmode__12&quot;&gt;&lt;span style=&quot;visibility: visible;&quot;&gt;&lt;span style=&quot;font-size: 14px; visibility: visible;&quot;&gt;调用委托变量。&lt;/span&gt;&lt;/span&gt;&lt;/section&gt;&lt;section style=&quot;text-align: center; visibility: visible;&quot;&gt;&lt;img data-src=&quot;https://mmbiz.qpic.cn/sz_mmbiz_png/MUU5Mgnqicbt9DQrxV1ZAxUjNE8z3MEJ5rT6EjHs4171Pv5Xhics3frWbWIuJk57ib6ygPLyFKST3IhhMP9DQnEkURicKU7vGeEp9l0WdcdG9R4/640?wx_fmt=png&amp;amp;from=appmsg#imgIndex=0&quot; class=&quot;rich_pages wxw-img&quot; data-ratio=&quot;0.06944444444444445&quot; data-s=&quot;300,640&quot; data-type=&quot;png&quot; data-w=&quot;1080&quot; type=&quot;block&quot; data-imgfileid=&quot;100000835&quot; data-aistatus=&quot;1&quot; data-original-style=&quot;null&quot; data-index=&quot;3&quot; src=&quot;https://mmbiz.qpic.cn/sz_mmbiz_png/MUU5Mgnqicbt9DQrxV1ZAxUjNE8z3MEJ5rT6EjHs4171Pv5Xhics3frWbWIuJk57ib6ygPLyFKST3IhhMP9DQnEkURicKU7vGeEp9l0WdcdG9R4/640?wx_fmt=png&amp;from=appmsg&amp;tp=wxpic&amp;wxfrom=5&amp;wx_lazy=1#imgIndex=0&quot; _width=&quot;442px&quot; style=&quot;height: auto !important; visibility: visible !important; width: 405px !important;&quot; alt=&quot;图片&quot; data-before-load-time=&quot;1784130527678&quot; data-report-img-idx=&quot;0&quot; data-fail=&quot;0&quot;/&gt;&lt;/section&gt;&lt;section style=&quot;margin-top: 5px; margin-bottom: 5px; line-height: 26px; text-align: left; color: rgb(1, 1, 1); font-weight: 500; visibility: visible;&quot; class=&quot;js_darkmode__13&quot;&gt;&lt;span style=&quot;visibility: visible;&quot;&gt;&lt;br style=&quot;visibility: visible;&quot;/&gt;&lt;/span&gt;&lt;/section&gt;&lt;section style=&quot;visibility: visible;&quot;&gt;&lt;span style=&quot;visibility: visible;&quot;&gt;&lt;br style=&quot;visibility: visible;&quot;/&gt;&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;/ol&gt;&lt;h2 data-tool=&quot;markdown.com.cn编辑器&quot; style=&quot;margin-top: 30px; font-weight: bold; font-size: 22px; border-bottom: 2px solid rgb(89, 89, 89); margin-bottom: 30px; color: rgb(89, 89, 89); visibility: visible;&quot; class=&quot;js_darkmode__14&quot;&gt;&lt;span style=&quot;font-size: 22px; display: inline-block; border-bottom: 2px solid #595959; visibility: visible;&quot; class=&quot;js_darkmode__15&quot;&gt;&lt;span style=&quot;visibility: visible;&quot;&gt;2. 第一步：声明委托类型&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p data-tool=&quot;markdown.com.cn编辑器&quot; style=&quot;font-size: 16px; padding-top: 8px; padding-bottom: 8px; margin: 0px; line-height: 26px; color: rgb(89, 89, 89); visibility: visible;&quot; class=&quot;js_darkmode__16&quot;&gt;&lt;span style=&quot;visibility: visible;&quot;&gt;使用&amp;nbsp;&lt;/span&gt;&lt;code style=&quot;font-size: 14px; overflow-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0px 2px; background-color: rgba(27, 31, 35, 0.05); font-family: &amp;quot;Operator Mono&amp;quot;, Consolas, Monaco, Menlo, monospace; word-break: break-all; color: rgb(71, 193, 168); visibility: visible;&quot; class=&quot;js_darkmode__17&quot;&gt;&lt;span style=&quot;visibility: visible;&quot;&gt;delegate&lt;/span&gt;&lt;/code&gt;&lt;span style=&quot;visibility: visible;&quot;&gt;&amp;nbsp;关键字声明委托：&lt;/span&gt;&lt;/p&gt;&lt;pre data-tool=&quot;markdown.com.cn编辑器&quot; style=&quot;margin-top: 10px; margin-bottom: 10px; border-radius: 5px; box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px; visibility: visible;&quot; class=&quot;js_darkmode__18&quot;&gt;&lt;code style=&quot;overflow-x: auto; padding: 15px 16px 16px; color: black; display: -webkit-box; font-family: &amp;quot;Operator Mono&amp;quot;, Consolas, Monaco, Menlo, monospace; font-size: 12px; background: rgb(255, 255, 255); border-radius: 5px; visibility: visible;&quot; class=&quot;js_darkmode__19&quot;&gt;&lt;span style=&quot;line-height: 26px; visibility: visible;&quot;&gt;&lt;span style=&quot;color: #AA0D91; line-height: 26px; visibility: visible;&quot; class=&quot;js_darkmode__20&quot;&gt;&lt;span style=&quot;visibility: visible;&quot;&gt;public&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;visibility: visible;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #AA0D91; line-height: 26px; visibility: visible;&quot; class=&quot;js_darkmode__21&quot;&gt;&lt;span style=&quot;visibility: visible;&quot;&gt;delegate&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;visibility: visible;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #AA0D91; line-height: 26px; visibility: visible;&quot; class=&quot;js_darkmode__22&quot;&gt;&lt;span style=&quot;visibility: visible;&quot;&gt;void&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;visibility: visible;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #1C00CF; line-height: 26px; visibility: visible;&quot; class=&quot;js_darkmode__23&quot;&gt;&lt;span style=&quot;visibility: visible;&quot;&gt;AlarmHandler&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;visibility: visible;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #5C2699; line-height: 26px; visibility: visible;&quot; class=&quot;js_darkmode__24&quot;&gt;&lt;span style=&quot;visibility: visible;&quot;&gt;&lt;br style=&quot;visibility: visible;&quot;/&gt;&lt;/span&gt;&lt;span style=&quot;visibility: visible;&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #AA0D91; line-height: 26px; visibility: visible;&quot; class=&quot;js_darkmode__25&quot;&gt;&lt;span style=&quot;visibility: visible;&quot;&gt;string&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;visibility: visible;&quot;&gt;&amp;nbsp;equipmentId,&lt;/span&gt;&lt;span style=&quot;visibility: visible;&quot;&gt;&lt;br style=&quot;visibility: visible;&quot;/&gt;&lt;/span&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #aa0d91;line-height: 26px;&quot; class=&quot;js_darkmode__26&quot;&gt;string&lt;/span&gt;&amp;nbsp;message&lt;/span&gt;)&lt;/span&gt;;&lt;br/&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p data-tool=&quot;markdown.com.cn编辑器&quot; style=&quot;font-size: 16px;padding-top: 8px;padding-bottom: 8px;margin: 0;line-height: 26px;color: rgb(89,89,89);&quot; class=&quot;js_darkmode__27&quot;&gt;该声明规定了方法签名：&lt;/p&gt;&lt;ul style=&quot;list-style-type: disc;&quot; class=&quot;js_darkmode__28 list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;section style=&quot;margin-top: 5px;margin-bottom: 5px;line-height: 26px;text-align: left;color: rgb(1,1,1);font-weight: 500;&quot; class=&quot;js_darkmode__29&quot;&gt;&lt;span style=&quot;font-size: 14px;&quot;&gt;返回值必须为&amp;nbsp;&lt;/span&gt;&lt;code style=&quot;font-size: 14px;word-wrap: break-word;padding: 2px 4px;border-radius: 4px;margin: 0 2px;background-color: rgba(27,31,35,.05);font-family: Operator Mono, Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(71, 193, 168);&quot; class=&quot;js_darkmode__30&quot;&gt;&lt;span style=&quot;font-size: 14px;&quot;&gt;void&lt;/span&gt;&lt;/code&gt;&lt;span style=&quot;font-size: 14px;&quot;&gt;。&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section style=&quot;margin-top: 5px;margin-bottom: 5px;line-height: 26px;text-align: left;color: rgb(1,1,1);font-weight: 500;&quot; class=&quot;js_darkmode__31&quot;&gt;&lt;span style=&quot;font-size: 14px;&quot;&gt;参数数量、类型和顺序必须兼容。&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section style=&quot;margin-top: 5px;margin-bottom: 5px;line-height: 26px;text-align: left;color: rgb(1,1,1);font-weight: 500;&quot; class=&quot;js_darkmode__32&quot;&gt;&lt;span style=&quot;font-size: 14px;&quot;&gt;方法名称不受限制。&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p data-tool=&quot;markdown.com.cn编辑器&quot; style=&quot;font-size: 16px;padding-top: 8px;padding-bottom: 8px;margin: 0;line-height: 26px;color: rgb(89,89,89);&quot; class=&quot;js_darkmode__33&quot;&gt;委托可以声明在命名空间中，也可以嵌套在类中。需要被多个类使用时，通常放在命名空间中。&lt;/p&gt;&lt;h2 data-tool=&quot;markdown.com.cn编辑器&quot; style=&quot;margin-top: 30px;font-weight: bold;font-size: 22px;border-bottom: 2px solid rgb(89,89,89);margin-bottom: 30px;color: rgb(89,89,89);&quot; class=&quot;js_darkmode__34&quot;&gt;&lt;span style=&quot;font-size: 22px;display: inline-block;border-bottom: 2px solid #595959;&quot; class=&quot;js_darkmode__35&quot;&gt;3. 第二步：编写匹配方法&lt;/span&gt;&lt;/h2&gt;&lt;pre data-tool=&quot;markdown.com.cn编辑器&quot; style=&quot;margin-top: 10px;margin-bottom: 10px;border-radius: 5px;box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;&quot; class=&quot;js_darkmode__36&quot;&gt;&lt;code style=&quot;overflow-x: auto;padding: 16px;color: black;display: -webkit-box;font-family: Operator Mono, Consolas, Monaco, Menlo, monospace;font-size: 12px;-webkit-overflow-scrolling: touch;padding-top: 15px;background: #fff;border-radius: 5px;&quot; class=&quot;js_darkmode__37&quot;&gt;&lt;span style=&quot;line-height: 26px;&quot;&gt;&lt;span style=&quot;color: #aa0d91;line-height: 26px;&quot; class=&quot;js_darkmode__38&quot;&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #aa0d91;line-height: 26px;&quot; class=&quot;js_darkmode__39&quot;&gt;void&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #1c00cf;line-height: 26px;&quot; class=&quot;js_darkmode__40&quot;&gt;ShowAlarm&lt;/span&gt;(&lt;span style=&quot;color: #5c2699;line-height: 26px;&quot; class=&quot;js_darkmode__41&quot;&gt;&lt;br/&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #aa0d91;line-height: 26px;&quot; class=&quot;js_darkmode__42&quot;&gt;string&lt;/span&gt;&amp;nbsp;equipmentId,&lt;br/&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #aa0d91;line-height: 26px;&quot; class=&quot;js_darkmode__43&quot;&gt;string&lt;/span&gt;&amp;nbsp;message&lt;/span&gt;)&lt;/span&gt;&lt;br/&gt;{&lt;br/&gt;&amp;nbsp; &amp;nbsp; Console.WriteLine(&lt;br/&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #c41a16;line-height: 26px;&quot; class=&quot;js_darkmode__44&quot;&gt;$&amp;quot;界面报警：&lt;span style=&quot;color: #000;line-height: 26px;&quot; class=&quot;js_darkmode__45&quot;&gt;{equipmentId}&lt;/span&gt;，&lt;span style=&quot;color: #000;line-height: 26px;&quot; class=&quot;js_darkmode__46&quot;&gt;{message}&lt;/span&gt;&amp;quot;&lt;/span&gt;);&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;&lt;span style=&quot;line-height: 26px;&quot;&gt;&lt;span style=&quot;color: #aa0d91;line-height: 26px;&quot; class=&quot;js_darkmode__47&quot;&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #aa0d91;line-height: 26px;&quot; class=&quot;js_darkmode__48&quot;&gt;void&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #1c00cf;line-height: 26px;&quot; class=&quot;js_darkmode__49&quot;&gt;WriteAlarmLog&lt;/span&gt;(&lt;span style=&quot;color: #5c2699;line-height: 26px;&quot; class=&quot;js_darkmode__50&quot;&gt;&lt;br/&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #aa0d91;line-height: 26px;&quot; class=&quot;js_darkmode__51&quot;&gt;string&lt;/span&gt;&amp;nbsp;equipmentId,&lt;br/&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #aa0d91;line-height: 26px;&quot; class=&quot;js_darkmode__52&quot;&gt;string&lt;/span&gt;&amp;nbsp;message&lt;/span&gt;)&lt;/span&gt;&lt;br/&gt;{&lt;br/&gt;&amp;nbsp; &amp;nbsp; Console.WriteLine(&lt;br/&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #c41a16;line-height: 26px;&quot; class=&quot;js_darkmode__53&quot;&gt;$&amp;quot;写入日志：&lt;span style=&quot;color: #000;line-height: 26px;&quot; class=&quot;js_darkmode__54&quot;&gt;{equipmentId}&lt;/span&gt;，&lt;span style=&quot;color: #000;line-height: 26px;&quot; class=&quot;js_darkmode__55&quot;&gt;{message}&lt;/span&gt;&amp;quot;&lt;/span&gt;);&lt;br/&gt;}&lt;br/&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p data-tool=&quot;markdown.com.cn编辑器&quot; style=&quot;font-size: 16px;padding-top: 8px;padding-bottom: 8px;margin: 0;line-height: 26px;color: rgb(89,89,89);&quot; class=&quot;js_darkmode__56&quot;&gt;下面的方法不能关联到&amp;nbsp;&lt;code style=&quot;font-size: 14px;word-wrap: break-word;padding: 2px 4px;border-radius: 4px;margin: 0 2px;background-color: rgba(27,31,35,.05);font-family: Operator Mono, Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(71, 193, 168);&quot; class=&quot;js_darkmode__57&quot;&gt;AlarmHandler&lt;/code&gt;：&lt;/p&gt;&lt;pre data-tool=&quot;markdown.com.cn编辑器&quot; style=&quot;margin-top: 10px;margin-bottom: 10px;border-radius: 5px;box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;&quot; class=&quot;js_darkmode__58&quot;&gt;&lt;code style=&quot;overflow-x: auto;padding: 16px;color: black;display: -webkit-box;font-family: Operator Mono, Consolas, Monaco, Menlo, monospace;font-size: 12px;-webkit-overflow-scrolling: touch;padding-top: 15px;background: #fff;border-radius: 5px;&quot; class=&quot;js_darkmode__59&quot;&gt;&lt;span style=&quot;color: #007400;line-height: 26px;&quot; class=&quot;js_darkmode__60&quot;&gt;// 错误：缺少 message 参数&lt;/span&gt;&lt;br/&gt;&lt;span style=&quot;color: #007400;line-height: 26px;&quot; class=&quot;js_darkmode__61&quot;&gt;// static void InvalidMethod(string equipmentId)&lt;/span&gt;&lt;br/&gt;&lt;span style=&quot;color: #007400;line-height: 26px;&quot; class=&quot;js_darkmode__62&quot;&gt;// {&lt;/span&gt;&lt;br/&gt;&lt;span style=&quot;color: #007400;line-height: 26px;&quot; class=&quot;js_darkmode__63&quot;&gt;// }&lt;/span&gt;&lt;br/&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p data-tool=&quot;markdown.com.cn编辑器&quot; style=&quot;font-size: 16px;padding-top: 8px;padding-bottom: 8px;margin: 0;line-height: 26px;color: rgb(89,89,89);&quot; class=&quot;js_darkmode__64&quot;&gt;&lt;span style=&quot;font-size: 14px;font-style: italic;&quot;&gt;签名不匹配时会产生编译错误。&lt;/span&gt;&lt;/p&gt;&lt;h2 data-tool=&quot;markdown.com.cn编辑器&quot; style=&quot;margin-top: 30px;font-weight: bold;font-size: 22px;border-bottom: 2px solid rgb(89,89,89);margin-bottom: 30px;color: rgb(89,89,89);&quot; class=&quot;js_darkmode__65&quot;&gt;&lt;span style=&quot;font-size: 22px;display: inline-block;border-bottom: 2px solid #595959;&quot; class=&quot;js_darkmode__66&quot;&gt;4. 第三步：创建委托变量&lt;/span&gt;&lt;/h2&gt;&lt;p data-tool=&quot;markdown.com.cn编辑器&quot; style=&quot;font-size: 16px;padding-top: 8px;padding-bottom: 8px;margin: 0;line-height: 26px;color: rgb(89,89,89);&quot; class=&quot;js_darkmode__67&quot;&gt;委托是引用类型，可以先创建空变量：&lt;/p&gt;&lt;pre data-tool=&quot;markdown.com.cn编辑器&quot; style=&quot;margin-top: 10px;margin-bottom: 10px;border-radius: 5px;box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;&quot; class=&quot;js_darkmode__68&quot;&gt;&lt;code style=&quot;overflow-x: auto;padding: 16px;color: black;display: -webkit-box;font-family: Operator Mono, Consolas, Monaco, Menlo, monospace;font-size: 12px;-webkit-overflow-scrolling: touch;padding-top: 15px;background: #fff;border-radius: 5px;&quot; class=&quot;js_darkmode__69&quot;&gt;AlarmHandler handler =&amp;nbsp;&lt;span style=&quot;color: #aa0d91;line-height: 26px;&quot; class=&quot;js_darkmode__70&quot;&gt;null&lt;/span&gt;;&lt;br/&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p data-tool=&quot;markdown.com.cn编辑器&quot; style=&quot;font-size: 16px;padding-top: 8px;padding-bottom: 8px;margin: 0;line-height: 26px;color: rgb(89,89,89);&quot; class=&quot;js_darkmode__71&quot;&gt;也可以在创建时直接指定方法：&lt;/p&gt;&lt;pre data-tool=&quot;markdown.com.cn编辑器&quot; style=&quot;margin-top: 10px;margin-bottom: 10px;border-radius: 5px;box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;&quot; class=&quot;js_darkmode__72&quot;&gt;&lt;code style=&quot;overflow-x: auto;padding: 16px;color: black;display: -webkit-box;font-family: Operator Mono, Consolas, Monaco, Menlo, monospace;font-size: 12px;-webkit-overflow-scrolling: touch;padding-top: 15px;background: #fff;border-radius: 5px;&quot; class=&quot;js_darkmode__73&quot;&gt;AlarmHandler handler = ShowAlarm;&lt;br/&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p data-tool=&quot;markdown.com.cn编辑器&quot; style=&quot;font-size: 16px;padding-top: 8px;padding-bottom: 8px;margin: 0;line-height: 26px;color: rgb(89,89,89);&quot; class=&quot;js_darkmode__74&quot;&gt;完整写法如下，&lt;span style=&quot;text-decoration: underline;&quot;&gt;但通常不需要&lt;/span&gt;：&lt;/p&gt;&lt;pre data-tool=&quot;markdown.com.cn编辑器&quot; style=&quot;margin-top: 10px;margin-bottom: 10px;border-radius: 5px;box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;&quot; class=&quot;js_darkmode__75&quot;&gt;&lt;code style=&quot;overflow-x: auto;padding: 16px;color: black;display: -webkit-box;font-family: Operator Mono, Consolas, Monaco, Menlo, monospace;font-size: 12px;-webkit-overflow-scrolling: touch;padding-top: 15px;background: #fff;border-radius: 5px;&quot; class=&quot;js_darkmode__76&quot;&gt;AlarmHandler handler =&lt;br/&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #aa0d91;line-height: 26px;&quot; class=&quot;js_darkmode__77&quot;&gt;new&lt;/span&gt;&amp;nbsp;AlarmHandler(ShowAlarm);&lt;br/&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 data-tool=&quot;markdown.com.cn编辑器&quot; style=&quot;margin-top: 30px;font-weight: bold;font-size: 22px;border-bottom: 2px solid rgb(89,89,89);margin-bottom: 30px;color: rgb(89,89,89);&quot; class=&quot;js_darkmode__78&quot;&gt;&lt;span style=&quot;font-size: 22px;display: inline-block;border-bottom: 2px solid #595959;&quot; class=&quot;js_darkmode__79&quot;&gt;5. 第四步：关联委托方法&lt;/span&gt;&lt;/h2&gt;&lt;h3 data-tool=&quot;markdown.com.cn编辑器&quot; style=&quot;margin-top: 30px;margin-bottom: 15px;font-weight: bold;font-size: 20px;color: rgb(89,89,89);&quot; class=&quot;js_darkmode__80&quot;&gt;使用&amp;nbsp;&lt;code&gt;=&lt;/code&gt;&amp;nbsp;赋值&lt;/h3&gt;&lt;pre data-tool=&quot;markdown.com.cn编辑器&quot; style=&quot;margin-top: 10px;margin-bottom: 10px;border-radius: 5px;box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;&quot; class=&quot;js_darkmode__81&quot;&gt;&lt;code style=&quot;overflow-x: auto;padding: 16px;color: black;display: -webkit-box;font-family: Operator Mono, Consolas, Monaco, Menlo, monospace;font-size: 12px;-webkit-overflow-scrolling: touch;padding-top: 15px;background: #fff;border-radius: 5px;&quot; class=&quot;js_darkmode__82&quot;&gt;handler = ShowAlarm;&lt;br/&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p data-tool=&quot;markdown.com.cn编辑器&quot; style=&quot;font-size: 16px;padding-top: 8px;padding-bottom: 8px;margin: 0;line-height: 26px;color: rgb(89,89,89);&quot; class=&quot;js_darkmode__83&quot;&gt;&lt;code style=&quot;font-size: 14px;word-wrap: break-word;padding: 2px 4px;border-radius: 4px;margin: 0 2px;background-color: rgba(27,31,35,.05);font-family: Operator Mono, Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(71, 193, 168);&quot; class=&quot;js_darkmode__84&quot;&gt;=&lt;/code&gt;&amp;nbsp;会替换委托变量原来关联的方法。&lt;/p&gt;&lt;h3 data-tool=&quot;markdown.com.cn编辑器&quot; style=&quot;margin-top: 30px;margin-bottom: 15px;font-weight: bold;font-size: 20px;color: rgb(89,89,89);&quot; class=&quot;js_darkmode__85&quot;&gt;使用&amp;nbsp;&lt;code&gt;+=&lt;/code&gt;&amp;nbsp;添加&lt;/h3&gt;&lt;pre data-tool=&quot;markdown.com.cn编辑器&quot; style=&quot;margin-top: 10px;margin-bottom: 10px;border-radius: 5px;box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;&quot; class=&quot;js_darkmode__86&quot;&gt;&lt;code style=&quot;overflow-x: auto;padding: 16px;color: black;display: -webkit-box;font-family: Operator Mono, Consolas, Monaco, Menlo, monospace;font-size: 12px;-webkit-overflow-scrolling: touch;padding-top: 15px;background: #fff;border-radius: 5px;&quot; class=&quot;js_darkmode__87&quot;&gt;handler += WriteAlarmLog;&lt;br/&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p data-tool=&quot;markdown.com.cn编辑器&quot; style=&quot;font-size: 16px;padding-top: 8px;padding-bottom: 8px;margin: 0;line-height: 26px;color: rgb(89,89,89);&quot; class=&quot;js_darkmode__88&quot;&gt;此时委托依次关联：&lt;/p&gt;&lt;ol style=&quot;list-style-type: decimal;&quot; class=&quot;js_darkmode__89 list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;section style=&quot;margin-top: 5px;margin-bottom: 5px;line-height: 26px;text-align: left;color: rgb(1,1,1);font-weight: 500;&quot; class=&quot;js_darkmode__90&quot;&gt;&lt;code style=&quot;font-size: 14px;word-wrap: break-word;padding: 2px 4px;border-radius: 4px;margin: 0 2px;background-color: rgba(27,31,35,.05);font-family: Operator Mono, Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(71, 193, 168);&quot; class=&quot;js_darkmode__91&quot;&gt;ShowAlarm&lt;/code&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section style=&quot;margin-top: 5px;margin-bottom: 5px;line-height: 26px;text-align: left;color: rgb(1,1,1);font-weight: 500;&quot; class=&quot;js_darkmode__92&quot;&gt;&lt;code style=&quot;font-size: 14px;word-wrap: break-word;padding: 2px 4px;border-radius: 4px;margin: 0 2px;background-color: rgba(27,31,35,.05);font-family: Operator Mono, Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(71, 193, 168);&quot; class=&quot;js_darkmode__93&quot;&gt;WriteAlarmLog&lt;/code&gt;&lt;/section&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p data-tool=&quot;markdown.com.cn编辑器&quot; style=&quot;font-size: 16px;padding-top: 8px;padding-bottom: 8px;margin: 0;line-height: 26px;color: rgb(89,89,89);&quot; class=&quot;js_darkmode__94&quot;&gt;一个委托关联多个方法，称为&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;span class=&quot;&quot;&gt;多播委托&lt;/span&gt;&lt;/span&gt;。&lt;/p&gt;&lt;h3 data-tool=&quot;markdown.com.cn编辑器&quot; style=&quot;margin-top: 30px;margin-bottom: 15px;font-weight: bold;font-size: 20px;color: rgb(89,89,89);&quot; class=&quot;js_darkmode__95&quot;&gt;使用&amp;nbsp;&lt;code&gt;-=&lt;/code&gt;&amp;nbsp;移除&lt;/h3&gt;&lt;pre data-tool=&quot;markdown.com.cn编辑器&quot; style=&quot;margin-top: 10px;margin-bottom: 10px;border-radius: 5px;box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;&quot; class=&quot;js_darkmode__96&quot;&gt;&lt;code style=&quot;overflow-x: auto;padding: 16px;color: black;display: -webkit-box;font-family: Operator Mono, Consolas, Monaco, Menlo, monospace;font-size: 12px;-webkit-overflow-scrolling: touch;padding-top: 15px;background: #fff;border-radius: 5px;&quot; class=&quot;js_darkmode__97&quot;&gt;handler -= ShowAlarm;&lt;br/&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p data-tool=&quot;markdown.com.cn编辑器&quot; style=&quot;font-size: 16px;padding-top: 8px;padding-bottom: 8px;margin: 0;line-height: 26px;color: rgb(89,89,89);&quot; class=&quot;js_darkmode__98&quot;&gt;&lt;code style=&quot;font-size: 14px;word-wrap: break-word;padding: 2px 4px;border-radius: 4px;margin: 0 2px;background-color: rgba(27,31,35,.05);font-family: Operator Mono, Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(71, 193, 168);&quot; class=&quot;js_darkmode__99&quot;&gt;-=&lt;/code&gt;&amp;nbsp;会移除一个匹配的方法关联。方法不存在时不会报错。&lt;/p&gt;&lt;h2 data-tool=&quot;markdown.com.cn编辑器&quot; style=&quot;margin-top: 30px;font-weight: bold;font-size: 22px;border-bottom: 2px solid rgb(89,89,89);margin-bottom: 30px;color: rgb(89,89,89);&quot; class=&quot;js_darkmode__100&quot;&gt;&lt;span style=&quot;font-size: 22px;display: inline-block;border-bottom: 2px solid #595959;&quot; class=&quot;js_darkmode__101&quot;&gt;6. 第五步：调用委托&lt;/span&gt;&lt;/h2&gt;&lt;p data-tool=&quot;markdown.com.cn编辑器&quot; style=&quot;font-size: 16px;padding-top: 8px;padding-bottom: 8px;margin: 0;line-height: 26px;color: rgb(89,89,89);&quot; class=&quot;js_darkmode__102&quot;&gt;可以像调用普通方法一样调用委托：&lt;/p&gt;&lt;pre data-tool=&quot;markdown.com.cn编辑器&quot; style=&quot;margin-top: 10px;margin-bottom: 10px;border-radius: 5px;box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;&quot; class=&quot;js_darkmode__103&quot;&gt;&lt;code style=&quot;overflow-x: auto;padding: 16px;color: black;display: -webkit-box;font-family: Operator Mono, Consolas, Monaco, Menlo, monospace;font-size: 12px;-webkit-overflow-scrolling: touch;padding-top: 15px;background: #fff;border-radius: 5px;&quot; class=&quot;js_darkmode__104&quot;&gt;handler(&lt;span style=&quot;color: #c41a16;line-height: 26px;&quot; class=&quot;js_darkmode__105&quot;&gt;&amp;quot;EQ-001&amp;quot;&lt;/span&gt;,&amp;nbsp;&lt;span style=&quot;color: #c41a16;line-height: 26px;&quot; class=&quot;js_darkmode__106&quot;&gt;&amp;quot;温度过高&amp;quot;&lt;/span&gt;);&lt;br/&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p data-tool=&quot;markdown.com.cn编辑器&quot; style=&quot;font-size: 16px;padding-top: 8px;padding-bottom: 8px;margin: 0;line-height: 26px;color: rgb(89,89,89);&quot; class=&quot;js_darkmode__107&quot;&gt;更安全的写法：&lt;/p&gt;&lt;pre data-tool=&quot;markdown.com.cn编辑器&quot; style=&quot;margin-top: 10px;margin-bottom: 10px;border-radius: 5px;box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;&quot; class=&quot;js_darkmode__108&quot;&gt;&lt;code style=&quot;overflow-x: auto;padding: 16px;color: black;display: -webkit-box;font-family: Operator Mono, Consolas, Monaco, Menlo, monospace;font-size: 12px;-webkit-overflow-scrolling: touch;padding-top: 15px;background: #fff;border-radius: 5px;&quot; class=&quot;js_darkmode__109&quot;&gt;handler?.Invoke(&lt;br/&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #c41a16;line-height: 26px;&quot; class=&quot;js_darkmode__110&quot;&gt;&amp;quot;EQ-001&amp;quot;&lt;/span&gt;,&lt;br/&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #c41a16;line-height: 26px;&quot; class=&quot;js_darkmode__111&quot;&gt;&amp;quot;温度过高&amp;quot;&lt;/span&gt;);&lt;br/&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p data-tool=&quot;markdown.com.cn编辑器&quot; style=&quot;font-size: 16px;padding-top: 8px;padding-bottom: 8px;margin: 0;line-height: 26px;color: rgb(89,89,89);&quot; class=&quot;js_darkmode__112&quot;&gt;&lt;code style=&quot;font-size: 14px;word-wrap: break-word;padding: 2px 4px;border-radius: 4px;margin: 0 2px;background-color: rgba(27,31,35,.05);font-family: Operator Mono, Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(71, 193, 168);&quot; class=&quot;js_darkmode__113&quot;&gt;?.Invoke()&lt;/code&gt;&amp;nbsp;会先检查委托是否为&amp;nbsp;&lt;code style=&quot;font-size: 14px;word-wrap: break-word;padding: 2px 4px;border-radius: 4px;margin: 0 2px;background-color: rgba(27,31,35,.05);font-family: Operator Mono, Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(71, 193, 168);&quot; class=&quot;js_darkmode__114&quot;&gt;null&lt;/code&gt;，避免&amp;nbsp;&lt;code style=&quot;font-size: 14px;word-wrap: break-word;padding: 2px 4px;border-radius: 4px;margin: 0 2px;background-color: rgba(27,31,35,.05);font-family: Operator Mono, Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(71, 193, 168);&quot; class=&quot;js_darkmode__115&quot;&gt;NullReferenceException&lt;/code&gt;。&lt;/p&gt;&lt;h2 data-tool=&quot;markdown.com.cn编辑器&quot; style=&quot;margin-top: 30px;font-weight: bold;font-size: 22px;border-bottom: 2px solid rgb(89,89,89);margin-bottom: 30px;color: rgb(89,89,89);&quot; class=&quot;js_darkmode__116&quot;&gt;&lt;span style=&quot;font-size: 22px;display: inline-block;border-bottom: 2px solid #595959;&quot; class=&quot;js_darkmode__117&quot;&gt;7. 完整工控示例&lt;/span&gt;&lt;/h2&gt;&lt;pre data-tool=&quot;markdown.com.cn编辑器&quot; style=&quot;margin-top: 10px;margin-bottom: 10px;border-radius: 5px;box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;&quot; class=&quot;js_darkmode__118&quot;&gt;&lt;code style=&quot;overflow-x: auto;padding: 16px;color: black;display: -webkit-box;font-family: Operator Mono, Consolas, Monaco, Menlo, monospace;font-size: 12px;-webkit-overflow-scrolling: touch;padding-top: 15px;background: #fff;border-radius: 5px;&quot; class=&quot;js_darkmode__119&quot;&gt;&lt;span style=&quot;line-height: 26px;&quot;&gt;&lt;span style=&quot;color: #aa0d91;line-height: 26px;&quot; class=&quot;js_darkmode__120&quot;&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #aa0d91;line-height: 26px;&quot; class=&quot;js_darkmode__121&quot;&gt;delegate&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #aa0d91;line-height: 26px;&quot; class=&quot;js_darkmode__122&quot;&gt;void&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #1c00cf;line-height: 26px;&quot; class=&quot;js_darkmode__123&quot;&gt;AlarmHandler&lt;/span&gt;(&lt;span style=&quot;color: #5c2699;line-height: 26px;&quot; class=&quot;js_darkmode__124&quot;&gt;&lt;br/&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #aa0d91;line-height: 26px;&quot; class=&quot;js_darkmode__125&quot;&gt;string&lt;/span&gt;&amp;nbsp;equipmentId,&lt;br/&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #aa0d91;line-height: 26px;&quot; class=&quot;js_darkmode__126&quot;&gt;string&lt;/span&gt;&amp;nbsp;message&lt;/span&gt;)&lt;/span&gt;;&lt;br/&gt;&lt;br/&gt;&lt;span style=&quot;color: #aa0d91;line-height: 26px;&quot; class=&quot;js_darkmode__127&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color: #1c00cf;line-height: 26px;&quot; class=&quot;js_darkmode__128&quot;&gt;Program&lt;/span&gt;&lt;br/&gt;{&lt;br/&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;span style=&quot;line-height: 26px;&quot;&gt;&lt;span style=&quot;color: #aa0d91;line-height: 26px;&quot; class=&quot;js_darkmode__129&quot;&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #aa0d91;line-height: 26px;&quot; class=&quot;js_darkmode__130&quot;&gt;void&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #1c00cf;line-height: 26px;&quot; class=&quot;js_darkmode__131&quot;&gt;Main&lt;/span&gt;()&lt;/span&gt;&lt;br/&gt;&amp;nbsp; &amp;nbsp; {&lt;br/&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; AlarmHandler handler = ShowAlarm;&lt;br/&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; handler += WriteAlarmLog;&lt;br/&gt;&lt;br/&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; CheckTemperature(&lt;span style=&quot;color: #1c00cf;line-height: 26px;&quot; class=&quot;js_darkmode__132&quot;&gt;86.5&lt;/span&gt;, handler);&lt;br/&gt;&lt;br/&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; handler -= ShowAlarm;&lt;br/&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; CheckTemperature(&lt;span style=&quot;color: #1c00cf;line-height: 26px;&quot; class=&quot;js_darkmode__133&quot;&gt;90&lt;/span&gt;, handler);&lt;br/&gt;&amp;nbsp; &amp;nbsp; }&lt;br/&gt;&lt;br/&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;span style=&quot;line-height: 26px;&quot;&gt;&lt;span style=&quot;color: #aa0d91;line-height: 26px;&quot; class=&quot;js_darkmode__134&quot;&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #aa0d91;line-height: 26px;&quot; class=&quot;js_darkmode__135&quot;&gt;void&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #1c00cf;line-height: 26px;&quot; class=&quot;js_darkmode__136&quot;&gt;CheckTemperature&lt;/span&gt;(&lt;span style=&quot;color: #5c2699;line-height: 26px;&quot; class=&quot;js_darkmode__137&quot;&gt;&lt;br/&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #aa0d91;line-height: 26px;&quot; class=&quot;js_darkmode__138&quot;&gt;double&lt;/span&gt;&amp;nbsp;temperature,&lt;br/&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; AlarmHandler handler&lt;/span&gt;)&lt;/span&gt;&lt;br/&gt;&amp;nbsp; &amp;nbsp; {&lt;br/&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #aa0d91;line-height: 26px;&quot; class=&quot;js_darkmode__139&quot;&gt;if&lt;/span&gt;&amp;nbsp;(temperature &amp;gt;&amp;nbsp;&lt;span style=&quot;color: #1c00cf;line-height: 26px;&quot; class=&quot;js_darkmode__140&quot;&gt;80&lt;/span&gt;)&lt;br/&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br/&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; handler?.Invoke(&lt;br/&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #c41a16;line-height: 26px;&quot; class=&quot;js_darkmode__141&quot;&gt;&amp;quot;EQ-001&amp;quot;&lt;/span&gt;,&lt;br/&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #c41a16;line-height: 26px;&quot; class=&quot;js_darkmode__142&quot;&gt;$&amp;quot;温度过高：&lt;span style=&quot;color: #000;line-height: 26px;&quot; class=&quot;js_darkmode__143&quot;&gt;{temperature}&lt;/span&gt;&amp;quot;&lt;/span&gt;);&lt;br/&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br/&gt;&amp;nbsp; &amp;nbsp; }&lt;br/&gt;&lt;br/&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;span style=&quot;line-height: 26px;&quot;&gt;&lt;span style=&quot;color: #aa0d91;line-height: 26px;&quot; class=&quot;js_darkmode__144&quot;&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #aa0d91;line-height: 26px;&quot; class=&quot;js_darkmode__145&quot;&gt;void&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #1c00cf;line-height: 26px;&quot; class=&quot;js_darkmode__146&quot;&gt;ShowAlarm&lt;/span&gt;(&lt;span style=&quot;color: #5c2699;line-height: 26px;&quot; class=&quot;js_darkmode__147&quot;&gt;&lt;br/&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #aa0d91;line-height: 26px;&quot; class=&quot;js_darkmode__148&quot;&gt;string&lt;/span&gt;&amp;nbsp;equipmentId,&lt;br/&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #aa0d91;line-height: 26px;&quot; class=&quot;js_darkmode__149&quot;&gt;string&lt;/span&gt;&amp;nbsp;message&lt;/span&gt;)&lt;/span&gt;&lt;br/&gt;&amp;nbsp; &amp;nbsp; {&lt;br/&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Console.WriteLine(&lt;br/&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #c41a16;line-height: 26px;&quot; class=&quot;js_darkmode__150&quot;&gt;$&amp;quot;界面报警：&lt;span style=&quot;color: #000;line-height: 26px;&quot; class=&quot;js_darkmode__151&quot;&gt;{equipmentId}&lt;/span&gt;，&lt;span style=&quot;color: #000;line-height: 26px;&quot; class=&quot;js_darkmode__152&quot;&gt;{message}&lt;/span&gt;&amp;quot;&lt;/span&gt;);&lt;br/&gt;&amp;nbsp; &amp;nbsp; }&lt;br/&gt;&lt;br/&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;span style=&quot;line-height: 26px;&quot;&gt;&lt;span style=&quot;color: #aa0d91;line-height: 26px;&quot; class=&quot;js_darkmode__153&quot;&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #aa0d91;line-height: 26px;&quot; class=&quot;js_darkmode__154&quot;&gt;void&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #1c00cf;line-height: 26px;&quot; class=&quot;js_darkmode__155&quot;&gt;WriteAlarmLog&lt;/span&gt;(&lt;span style=&quot;color: #5c2699;line-height: 26px;&quot; class=&quot;js_darkmode__156&quot;&gt;&lt;br/&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #aa0d91;line-height: 26px;&quot; class=&quot;js_darkmode__157&quot;&gt;string&lt;/span&gt;&amp;nbsp;equipmentId,&lt;br/&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #aa0d91;line-height: 26px;&quot; class=&quot;js_darkmode__158&quot;&gt;string&lt;/span&gt;&amp;nbsp;message&lt;/span&gt;)&lt;/span&gt;&lt;br/&gt;&amp;nbsp; &amp;nbsp; {&lt;br/&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Console.WriteLine(&lt;br/&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #c41a16;line-height: 26px;&quot; class=&quot;js_darkmode__159&quot;&gt;$&amp;quot;报警日志：&lt;span style=&quot;color: #000;line-height: 26px;&quot; class=&quot;js_darkmode__160&quot;&gt;{equipmentId}&lt;/span&gt;，&lt;span style=&quot;color: #000;line-height: 26px;&quot; class=&quot;js_darkmode__161&quot;&gt;{message}&lt;/span&gt;&amp;quot;&lt;/span&gt;);&lt;br/&gt;&amp;nbsp; &amp;nbsp; }&lt;br/&gt;}&lt;br/&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p data-tool=&quot;markdown.com.cn编辑器&quot; style=&quot;font-size: 16px;padding-top: 8px;padding-bottom: 8px;margin: 0;line-height: 26px;color: rgb(89,89,89);&quot; class=&quot;js_darkmode__162&quot;&gt;第一次检测会显示界面报警并记录日志。移除&amp;nbsp;&lt;code style=&quot;font-size: 14px;word-wrap: break-word;padding: 2px 4px;border-radius: 4px;margin: 0 2px;background-color: rgba(27,31,35,.05);font-family: Operator Mono, Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(71, 193, 168);&quot; class=&quot;js_darkmode__163&quot;&gt;ShowAlarm&lt;/code&gt;&amp;nbsp;后，第二次检测只记录日志。&lt;/p&gt;&lt;h2 data-tool=&quot;markdown.com.cn编辑器&quot; style=&quot;margin-top: 30px;font-weight: bold;font-size: 22px;border-bottom: 2px solid rgb(89,89,89);margin-bottom: 30px;color: rgb(89,89,89);&quot; class=&quot;js_darkmode__164&quot;&gt;&lt;span style=&quot;font-size: 22px;display: inline-block;border-bottom: 2px solid #595959;&quot; class=&quot;js_darkmode__165&quot;&gt;8. 关联实例方法&lt;/span&gt;&lt;/h2&gt;&lt;p data-tool=&quot;markdown.com.cn编辑器&quot; style=&quot;font-size: 16px;padding-top: 8px;padding-bottom: 8px;margin: 0;line-height: 26px;color: rgb(89,89,89);&quot; class=&quot;js_darkmode__166&quot;&gt;委托既可以关联静态方法，也可以关联实例方法。&lt;/p&gt;&lt;pre data-tool=&quot;markdown.com.cn编辑器&quot; style=&quot;margin-top: 10px;margin-bottom: 10px;border-radius: 5px;box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;&quot; class=&quot;js_darkmode__167&quot;&gt;&lt;code style=&quot;overflow-x: auto;padding: 16px;color: black;display: -webkit-box;font-family: Operator Mono, Consolas, Monaco, Menlo, monospace;font-size: 12px;-webkit-overflow-scrolling: touch;padding-top: 15px;background: #fff;border-radius: 5px;&quot; class=&quot;js_darkmode__168&quot;&gt;&lt;span style=&quot;color: #aa0d91;line-height: 26px;&quot; class=&quot;js_darkmode__169&quot;&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #aa0d91;line-height: 26px;&quot; class=&quot;js_darkmode__170&quot;&gt;class&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #1c00cf;line-height: 26px;&quot; class=&quot;js_darkmode__171&quot;&gt;AlarmService&lt;/span&gt;&lt;br/&gt;{&lt;br/&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;span style=&quot;line-height: 26px;&quot;&gt;&lt;span style=&quot;color: #aa0d91;line-height: 26px;&quot; class=&quot;js_darkmode__172&quot;&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #aa0d91;line-height: 26px;&quot; class=&quot;js_darkmode__173&quot;&gt;void&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #1c00cf;line-height: 26px;&quot; class=&quot;js_darkmode__174&quot;&gt;Save&lt;/span&gt;(&lt;span style=&quot;color: #5c2699;line-height: 26px;&quot; class=&quot;js_darkmode__175&quot;&gt;&lt;br/&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #aa0d91;line-height: 26px;&quot; class=&quot;js_darkmode__176&quot;&gt;string&lt;/span&gt;&amp;nbsp;equipmentId,&lt;br/&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #aa0d91;line-height: 26px;&quot; class=&quot;js_darkmode__177&quot;&gt;string&lt;/span&gt;&amp;nbsp;message&lt;/span&gt;)&lt;/span&gt;&lt;br/&gt;&amp;nbsp; &amp;nbsp; {&lt;br/&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Console.WriteLine(&lt;br/&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #c41a16;line-height: 26px;&quot; class=&quot;js_darkmode__178&quot;&gt;$&amp;quot;保存报警：&lt;span style=&quot;color: #000;line-height: 26px;&quot; class=&quot;js_darkmode__179&quot;&gt;{equipmentId}&lt;/span&gt;，&lt;span style=&quot;color: #000;line-height: 26px;&quot; class=&quot;js_darkmode__180&quot;&gt;{message}&lt;/span&gt;&amp;quot;&lt;/span&gt;);&lt;br/&gt;&amp;nbsp; &amp;nbsp; }&lt;br/&gt;}&lt;br/&gt;&lt;/code&gt;&lt;/pre&gt;&lt;pre data-tool=&quot;markdown.com.cn编辑器&quot; style=&quot;margin-top: 10px;margin-bottom: 10px;border-radius: 5px;box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;&quot; class=&quot;js_darkmode__181&quot;&gt;&lt;code style=&quot;overflow-x: auto;padding: 16px;color: black;display: -webkit-box;font-family: Operator Mono, Consolas, Monaco, Menlo, monospace;font-size: 12px;-webkit-overflow-scrolling: touch;padding-top: 15px;background: #fff;border-radius: 5px;&quot; class=&quot;js_darkmode__182&quot;&gt;AlarmService service =&amp;nbsp;&lt;span style=&quot;color: #aa0d91;line-height: 26px;&quot; class=&quot;js_darkmode__183&quot;&gt;new&lt;/span&gt;&amp;nbsp;AlarmService();&lt;br/&gt;AlarmHandler handler = service.Save;&lt;br/&gt;&lt;br/&gt;handler(&lt;span style=&quot;color: #c41a16;line-height: 26px;&quot; class=&quot;js_darkmode__184&quot;&gt;&amp;quot;EQ-002&amp;quot;&lt;/span&gt;,&amp;nbsp;&lt;span style=&quot;color: #c41a16;line-height: 26px;&quot; class=&quot;js_darkmode__185&quot;&gt;&amp;quot;压力过高&amp;quot;&lt;/span&gt;);&lt;br/&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p data-tool=&quot;markdown.com.cn编辑器&quot; style=&quot;font-size: 16px;padding-top: 8px;padding-bottom: 8px;margin: 0;line-height: 26px;color: rgb(89,89,89);&quot; class=&quot;js_darkmode__186&quot;&gt;关联实例方法时，委托会同时保存对象引用和方法引用。&lt;/p&gt;&lt;h2 data-tool=&quot;markdown.com.cn编辑器&quot; style=&quot;margin-top: 30px;font-weight: bold;font-size: 22px;border-bottom: 2px solid rgb(89,89,89);margin-bottom: 30px;color: rgb(89,89,89);&quot; class=&quot;js_darkmode__187&quot;&gt;&lt;span style=&quot;font-size: 22px;display: inline-block;border-bottom: 2px solid #595959;&quot; class=&quot;js_darkmode__188&quot;&gt;9. 多播委托注意事项&lt;/span&gt;&lt;/h2&gt;&lt;ul style=&quot;list-style-type: disc;&quot; class=&quot;js_darkmode__189 list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;section style=&quot;margin-top: 5px;margin-bottom: 5px;line-height: 26px;text-align: left;color: rgb(1,1,1);font-weight: 500;&quot; class=&quot;js_darkmode__190&quot;&gt;&lt;span style=&quot;font-size: 14px;&quot;&gt;方法按照添加顺序依次执行。&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section style=&quot;margin-top: 5px;margin-bottom: 5px;line-height: 26px;text-align: left;color: rgb(1,1,1);font-weight: 500;&quot; class=&quot;js_darkmode__191&quot;&gt;&lt;span style=&quot;font-size: 14px;&quot;&gt;某个方法抛出未处理异常时，后续方法不会继续执行。&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section style=&quot;margin-top: 5px;margin-bottom: 5px;line-height: 26px;text-align: left;color: rgb(1,1,1);font-weight: 500;&quot; class=&quot;js_darkmode__192&quot;&gt;&lt;span style=&quot;font-size: 14px;&quot;&gt;多播委托有返回值时，调用结果是最后一个方法的返回值。&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section style=&quot;margin-top: 5px;margin-bottom: 5px;line-height: 26px;text-align: left;color: rgb(1,1,1);font-weight: 500;&quot; class=&quot;js_darkmode__193&quot;&gt;&lt;code style=&quot;font-size: 14px;word-wrap: break-word;padding: 2px 4px;border-radius: 4px;margin: 0 2px;background-color: rgba(27,31,35,.05);font-family: Operator Mono, Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(71, 193, 168);&quot; class=&quot;js_darkmode__194&quot;&gt;&lt;span style=&quot;font-size: 14px;&quot;&gt;=&lt;/span&gt;&lt;/code&gt;&lt;span style=&quot;font-size: 14px;&quot;&gt;&amp;nbsp;会覆盖原有关联，添加方法应使用&amp;nbsp;&lt;/span&gt;&lt;code style=&quot;font-size: 14px;word-wrap: break-word;padding: 2px 4px;border-radius: 4px;margin: 0 2px;background-color: rgba(27,31,35,.05);font-family: Operator Mono, Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(71, 193, 168);&quot; class=&quot;js_darkmode__195&quot;&gt;&lt;span style=&quot;font-size: 14px;&quot;&gt;+=&lt;/span&gt;&lt;/code&gt;&lt;span style=&quot;font-size: 14px;&quot;&gt;。&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section style=&quot;margin-top: 5px;margin-bottom: 5px;line-height: 26px;text-align: left;color: rgb(1,1,1);font-weight: 500;&quot; class=&quot;js_darkmode__196&quot;&gt;&lt;span style=&quot;font-size: 14px;&quot;&gt;长期保存实例方法的委托，会同时保留对应对象的引用。&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p data-tool=&quot;markdown.com.cn编辑器&quot; style=&quot;font-size: 16px;padding-top: 8px;padding-bottom: 8px;margin: 0;line-height: 26px;color: rgb(89,89,89);&quot; class=&quot;js_darkmode__197&quot;&gt;查看已关联的方法：&lt;/p&gt;&lt;pre data-tool=&quot;markdown.com.cn编辑器&quot; style=&quot;margin-top: 10px;margin-bottom: 10px;border-radius: 5px;box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;&quot; class=&quot;js_darkmode__198&quot;&gt;&lt;code style=&quot;overflow-x: auto;padding: 16px;color: black;display: -webkit-box;font-family: Operator Mono, Consolas, Monaco, Menlo, monospace;font-size: 12px;-webkit-overflow-scrolling: touch;padding-top: 15px;background: #fff;border-radius: 5px;&quot; class=&quot;js_darkmode__199&quot;&gt;&lt;span style=&quot;color: #aa0d91;line-height: 26px;&quot; class=&quot;js_darkmode__200&quot;&gt;foreach&lt;/span&gt;&amp;nbsp;(Delegate item&amp;nbsp;&lt;span style=&quot;color: #aa0d91;line-height: 26px;&quot; class=&quot;js_darkmode__201&quot;&gt;in&lt;/span&gt;&amp;nbsp;handler.GetInvocationList())&lt;br/&gt;{&lt;br/&gt;&amp;nbsp; &amp;nbsp; Console.WriteLine(item.Method.Name);&lt;br/&gt;}&lt;br/&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 data-tool=&quot;markdown.com.cn编辑器&quot; style=&quot;margin-top: 30px;font-weight: bold;font-size: 22px;border-bottom: 2px solid rgb(89,89,89);margin-bottom: 30px;color: rgb(89,89,89);&quot; class=&quot;js_darkmode__202&quot;&gt;&lt;span style=&quot;font-size: 22px;display: inline-block;border-bottom: 2px solid #595959;&quot; class=&quot;js_darkmode__203&quot;&gt;10. WinForms 事件中的委托&lt;/span&gt;&lt;/h2&gt;&lt;pre data-tool=&quot;markdown.com.cn编辑器&quot; style=&quot;margin-top: 10px;margin-bottom: 10px;border-radius: 5px;box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;&quot; class=&quot;js_darkmode__204&quot;&gt;&lt;code style=&quot;overflow-x: auto;padding: 16px;color: black;display: -webkit-box;font-family: Operator Mono, Consolas, Monaco, Menlo, monospace;font-size: 12px;-webkit-overflow-scrolling: touch;padding-top: 15px;background: #fff;border-radius: 5px;&quot; class=&quot;js_darkmode__205&quot;&gt;buttonStart.Click += buttonStart_Click;&lt;br/&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p data-tool=&quot;markdown.com.cn编辑器&quot; style=&quot;font-size: 16px;padding-top: 8px;padding-bottom: 8px;margin: 0;line-height: 26px;color: rgb(89,89,89);&quot; class=&quot;js_darkmode__206&quot;&gt;这段代码将&amp;nbsp;&lt;code style=&quot;font-size: 14px;word-wrap: break-word;padding: 2px 4px;border-radius: 4px;margin: 0 2px;background-color: rgba(27,31,35,.05);font-family: Operator Mono, Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(71, 193, 168);&quot; class=&quot;js_darkmode__207&quot;&gt;buttonStart_Click&lt;/code&gt;&amp;nbsp;方法关联到&amp;nbsp;&lt;code style=&quot;font-size: 14px;word-wrap: break-word;padding: 2px 4px;border-radius: 4px;margin: 0 2px;background-color: rgba(27,31,35,.05);font-family: Operator Mono, Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(71, 193, 168);&quot; class=&quot;js_darkmode__208&quot;&gt;Click&lt;/code&gt;&amp;nbsp;事件内部使用的委托。&lt;/p&gt;&lt;pre data-tool=&quot;markdown.com.cn编辑器&quot; style=&quot;margin-top: 10px;margin-bottom: 10px;border-radius: 5px;box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;&quot; class=&quot;js_darkmode__209&quot;&gt;&lt;code style=&quot;overflow-x: auto;padding: 16px;color: black;display: -webkit-box;font-family: Operator Mono, Consolas, Monaco, Menlo, monospace;font-size: 12px;-webkit-overflow-scrolling: touch;padding-top: 15px;background: #fff;border-radius: 5px;&quot; class=&quot;js_darkmode__210&quot;&gt;&lt;span style=&quot;line-height: 26px;&quot;&gt;&lt;span style=&quot;color: #aa0d91;line-height: 26px;&quot; class=&quot;js_darkmode__211&quot;&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #aa0d91;line-height: 26px;&quot; class=&quot;js_darkmode__212&quot;&gt;void&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #1c00cf;line-height: 26px;&quot; class=&quot;js_darkmode__213&quot;&gt;buttonStart_Click&lt;/span&gt;(&lt;span style=&quot;color: #5c2699;line-height: 26px;&quot; class=&quot;js_darkmode__214&quot;&gt;&lt;br/&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #aa0d91;line-height: 26px;&quot; class=&quot;js_darkmode__215&quot;&gt;object&lt;/span&gt;&amp;nbsp;sender,&lt;br/&gt;&amp;nbsp; &amp;nbsp; EventArgs e&lt;/span&gt;)&lt;/span&gt;&lt;br/&gt;{&lt;br/&gt;&amp;nbsp; &amp;nbsp; Console.WriteLine(&lt;span style=&quot;color: #c41a16;line-height: 26px;&quot; class=&quot;js_darkmode__216&quot;&gt;&amp;quot;启动设备&amp;quot;&lt;/span&gt;);&lt;br/&gt;}&lt;br/&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p data-tool=&quot;markdown.com.cn编辑器&quot; style=&quot;font-size: 16px;padding-top: 8px;padding-bottom: 8px;margin: 0;line-height: 26px;color: rgb(89,89,89);&quot; class=&quot;js_darkmode__217&quot;&gt;事件处理方法必须符合&amp;nbsp;&lt;code style=&quot;font-size: 14px;word-wrap: break-word;padding: 2px 4px;border-radius: 4px;margin: 0 2px;background-color: rgba(27,31,35,.05);font-family: Operator Mono, Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(71, 193, 168);&quot; class=&quot;js_darkmode__218&quot;&gt;EventHandler&lt;/code&gt;&amp;nbsp;规定的签名。&lt;/p&gt;&lt;h2 data-tool=&quot;markdown.com.cn编辑器&quot; style=&quot;margin-top: 30px;font-weight: bold;font-size: 22px;border-bottom: 2px solid rgb(89,89,89);margin-bottom: 30px;color: rgb(89,89,89);&quot; class=&quot;js_darkmode__219&quot;&gt;&lt;span style=&quot;font-size: 22px;display: inline-block;border-bottom: 2px solid #595959;&quot; class=&quot;js_darkmode__220&quot;&gt;11. 常见错误&lt;/span&gt;&lt;/h2&gt;&lt;table&gt;&lt;thead&gt;&lt;tr style=&quot;border: 0;border-top: 1px solid #ccc;background-color: white;&quot; class=&quot;js_darkmode__221 firstRow&quot;&gt;&lt;th style=&quot;font-size: 16px;border: 1px solid #ccc;padding: 5px 10px;text-align: left;font-weight: bold;background-color: #f0f0f0;&quot; class=&quot;js_darkmode__222&quot;&gt;&lt;section&gt;问题&lt;/section&gt;&lt;/th&gt;&lt;th style=&quot;font-size: 16px;border: 1px solid #ccc;padding: 5px 10px;text-align: left;font-weight: bold;background-color: #f0f0f0;&quot; class=&quot;js_darkmode__223&quot;&gt;&lt;section&gt;原因&lt;/section&gt;&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr style=&quot;border: 0;border-top: 1px solid #ccc;background-color: white;&quot; class=&quot;js_darkmode__224&quot;&gt;&lt;td style=&quot;font-size: 16px;border: 1px solid #ccc;padding: 5px 10px;text-align: left;&quot; class=&quot;js_darkmode__225&quot;&gt;&lt;section&gt;&lt;span style=&quot;font-size: 12px;&quot;&gt;方法无法关联&lt;/span&gt;&lt;/section&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px;border: 1px solid #ccc;padding: 5px 10px;text-align: left;&quot; class=&quot;js_darkmode__226&quot;&gt;&lt;section&gt;&lt;span style=&quot;font-size: 12px;&quot;&gt;返回值或参数签名不兼容&lt;/span&gt;&lt;/section&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;border: 0;border-top: 1px solid #ccc;background-color: #F8F8F8;&quot; class=&quot;js_darkmode__227&quot;&gt;&lt;td style=&quot;font-size: 16px;border: 1px solid #ccc;padding: 5px 10px;text-align: left;&quot; class=&quot;js_darkmode__228&quot;&gt;&lt;section&gt;&lt;span style=&quot;font-size: 12px;&quot;&gt;调用时空引用&lt;/span&gt;&lt;/section&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px;border: 1px solid #ccc;padding: 5px 10px;text-align: left;&quot; class=&quot;js_darkmode__229&quot;&gt;&lt;section&gt;&lt;span style=&quot;font-size: 12px;&quot;&gt;委托变量未关联方法&lt;/span&gt;&lt;/section&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;border: 0;border-top: 1px solid #ccc;background-color: white;&quot; class=&quot;js_darkmode__230&quot;&gt;&lt;td style=&quot;font-size: 16px;border: 1px solid #ccc;padding: 5px 10px;text-align: left;&quot; class=&quot;js_darkmode__231&quot;&gt;&lt;section&gt;&lt;span style=&quot;font-size: 12px;&quot;&gt;原方法意外消失&lt;/span&gt;&lt;/section&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px;border: 1px solid #ccc;padding: 5px 10px;text-align: left;&quot; class=&quot;js_darkmode__232&quot;&gt;&lt;section&gt;&lt;span style=&quot;font-size: 12px;&quot;&gt;错把&amp;nbsp;&lt;/span&gt;&lt;code&gt;&lt;span style=&quot;font-size: 12px;&quot;&gt;+=&lt;/span&gt;&lt;/code&gt;&lt;span style=&quot;font-size: 12px;&quot;&gt;&amp;nbsp;写成&amp;nbsp;&lt;/span&gt;&lt;code&gt;&lt;span style=&quot;font-size: 12px;&quot;&gt;=&lt;/span&gt;&lt;/code&gt;&lt;/section&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;border: 0;border-top: 1px solid #ccc;background-color: #F8F8F8;&quot; class=&quot;js_darkmode__233&quot;&gt;&lt;td style=&quot;font-size: 16px;border: 1px solid #ccc;padding: 5px 10px;text-align: left;&quot; class=&quot;js_darkmode__234&quot;&gt;&lt;section&gt;&lt;span style=&quot;font-size: 12px;&quot;&gt;移除方法未生效&lt;/span&gt;&lt;/section&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px;border: 1px solid #ccc;padding: 5px 10px;text-align: left;&quot; class=&quot;js_darkmode__235&quot;&gt;&lt;section&gt;&lt;span style=&quot;font-size: 12px;&quot;&gt;移除的不是同一个方法关联&lt;/span&gt;&lt;/section&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;border: 0;border-top: 1px solid #ccc;background-color: white;&quot; class=&quot;js_darkmode__236&quot;&gt;&lt;td style=&quot;font-size: 16px;border: 1px solid #ccc;padding: 5px 10px;text-align: left;&quot; class=&quot;js_darkmode__237&quot;&gt;&lt;section&gt;&lt;span style=&quot;font-size: 12px;&quot;&gt;后续方法没有执行&lt;/span&gt;&lt;/section&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px;border: 1px solid #ccc;padding: 5px 10px;text-align: left;&quot; class=&quot;js_darkmode__238&quot;&gt;&lt;section&gt;&lt;span style=&quot;font-size: 12px;&quot;&gt;前面的方法抛出了异常&lt;/span&gt;&lt;/section&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h2 data-tool=&quot;markdown.com.cn编辑器&quot; style=&quot;margin-top: 30px;font-weight: bold;font-size: 22px;border-bottom: 2px solid rgb(89,89,89);margin-bottom: 30px;color: rgb(89,89,89);&quot; class=&quot;js_darkmode__239&quot;&gt;&lt;span style=&quot;font-size: 22px;display: inline-block;border-bottom: 2px solid #595959;&quot; class=&quot;js_darkmode__240&quot;&gt;12. 小结&lt;/span&gt;&lt;/h2&gt;&lt;ul style=&quot;list-style-type: disc;&quot; class=&quot;js_darkmode__241 list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;section style=&quot;margin-top: 5px;margin-bottom: 5px;line-height: 26px;text-align: left;color: rgb(1,1,1);font-weight: 500;&quot; class=&quot;js_darkmode__242&quot;&gt;委托类型规定可关联方法的签名。&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section style=&quot;margin-top: 5px;margin-bottom: 5px;line-height: 26px;text-align: left;color: rgb(1,1,1);font-weight: 500;&quot; class=&quot;js_darkmode__243&quot;&gt;委托变量用于保存具体方法。&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section style=&quot;margin-top: 5px;margin-bottom: 5px;line-height: 26px;text-align: left;color: rgb(1,1,1);font-weight: 500;&quot; class=&quot;js_darkmode__244&quot;&gt;&lt;code style=&quot;font-size: 14px;word-wrap: break-word;padding: 2px 4px;border-radius: 4px;margin: 0 2px;background-color: rgba(27,31,35,.05);font-family: Operator Mono, Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(71, 193, 168);&quot; class=&quot;js_darkmode__245&quot;&gt;=&lt;/code&gt;&amp;nbsp;负责赋值，&lt;code style=&quot;font-size: 14px;word-wrap: break-word;padding: 2px 4px;border-radius: 4px;margin: 0 2px;background-color: rgba(27,31,35,.05);font-family: Operator Mono, Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(71, 193, 168);&quot; class=&quot;js_darkmode__246&quot;&gt;+=&lt;/code&gt;&amp;nbsp;负责添加，&lt;code style=&quot;font-size: 14px;word-wrap: break-word;padding: 2px 4px;border-radius: 4px;margin: 0 2px;background-color: rgba(27,31,35,.05);font-family: Operator Mono, Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(71, 193, 168);&quot; class=&quot;js_darkmode__247&quot;&gt;-=&lt;/code&gt;&amp;nbsp;负责移除。&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section style=&quot;margin-top: 5px;margin-bottom: 5px;line-height: 26px;text-align: left;color: rgb(1,1,1);font-weight: 500;&quot; class=&quot;js_darkmode__248&quot;&gt;调用多播委托时，方法按照关联顺序执行。&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section style=&quot;margin-top: 5px;margin-bottom: 5px;line-height: 26px;text-align: left;color: rgb(1,1,1);font-weight: 500;&quot; class=&quot;js_darkmode__249&quot;&gt;推荐使用&amp;nbsp;&lt;code style=&quot;font-size: 14px;word-wrap: break-word;padding: 2px 4px;border-radius: 4px;margin: 0 2px;background-color: rgba(27,31,35,.05);font-family: Operator Mono, Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(71, 193, 168);&quot; class=&quot;js_darkmode__250&quot;&gt;?.Invoke()&lt;/code&gt;&amp;nbsp;安全调用可能为空的委托。&lt;/section&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Wed, 15 Jul 2026 23:49:18 +0800</pubDate></item><item><title>写给 .NET Core 开发者的 AI Prompt 工程：把需求说成可生成的代码</title><link>https://www.codepub.top/post/627.html</link><description>&lt;p style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);margin: 0px 8px 1.5em;text-align: justify;line-height: 1.75;font-family: -apple-system-font, BlinkMacSystemFont, &amp;quot;Helvetica Neue&amp;quot;, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei UI&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, Arial, sans-serif;font-size: 14px;letter-spacing: 0.1em;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__2 js_darkmode__text__1&quot;&gt;&lt;span class=&quot;js_darkmode__text__2&quot;&gt;AI 能写代码，但它不会自动知道你的项目边界、命名风格、异常策略、测试框架、数据库约定和架构规则。很多生成结果差，不是模型完全不行，而是 Prompt 只给了一个模糊任务：“帮我写一个 API”。&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);margin: 1.5em 8px;text-align: justify;line-height: 1.75;font-family: -apple-system-font, BlinkMacSystemFont, &amp;quot;Helvetica Neue&amp;quot;, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei UI&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, Arial, sans-serif;font-size: 14px;letter-spacing: 0.1em;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__3 js_darkmode__text__3&quot;&gt;&lt;span class=&quot;js_darkmode__text__4&quot;&gt;对 .NET Core 开发来说，一个有效 Prompt 应该像一份小型开发任务说明：上下文清楚、技术栈明确、边界具体、验收条件可验证。这样生成出来的代码才更接近项目真实需要。&lt;/span&gt;&lt;/p&gt;&lt;h2 style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-size: 16.8px;font-weight: bold;margin: 4em auto 2em;text-align: center;line-height: 1.75;font-family: -apple-system-font, BlinkMacSystemFont, &amp;quot;Helvetica Neue&amp;quot;, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei UI&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, Arial, sans-serif;display: table;padding: 0px 0.2em;color: rgb(255, 255, 255);background: rgb(15, 76, 129);&quot; class=&quot;js_darkmode__4 js_darkmode__text__5&quot;&gt;&lt;span class=&quot;js_darkmode__text__6&quot;&gt;差的 Prompt 为什么差&lt;/span&gt;&lt;/h2&gt;&lt;p style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);margin: 1.5em 8px;text-align: justify;line-height: 1.75;font-family: -apple-system-font, BlinkMacSystemFont, &amp;quot;Helvetica Neue&amp;quot;, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei UI&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, Arial, sans-serif;font-size: 14px;letter-spacing: 0.1em;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__5 js_darkmode__text__7&quot;&gt;&lt;span class=&quot;js_darkmode__text__8&quot;&gt;类似这样的请求很常见：&lt;/span&gt;&lt;/p&gt;&lt;pre style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-family: -apple-system-font, BlinkMacSystemFont, &amp;quot;Helvetica Neue&amp;quot;, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei UI&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, Arial, sans-serif;font-feature-settings: normal;font-variation-settings: normal;font-size: 14px;margin: 10px 8px;color: rgb(201, 209, 217);background: rgb(13, 17, 23);text-align: left;line-height: 1.5;overflow-x: auto;border-radius: 8px;padding: 0px !important;&quot; class=&quot;js_darkmode__6 js_darkmode__text__9&quot;&gt;Create&amp;nbsp;a&amp;nbsp;user&amp;nbsp;API&amp;nbsp;in&amp;nbsp;.NET&amp;nbsp;Core.&lt;/pre&gt;&lt;p style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);margin: 1.5em 8px;text-align: justify;line-height: 1.75;font-family: -apple-system-font, BlinkMacSystemFont, &amp;quot;Helvetica Neue&amp;quot;, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei UI&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, Arial, sans-serif;font-size: 14px;letter-spacing: 0.1em;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__9 js_darkmode__text__12&quot;&gt;&lt;span class=&quot;js_darkmode__text__13&quot;&gt;它缺少所有关键约束：使用 Minimal API 还是 Controller？是否用 EF Core？数据库是什么？是否需要验证？返回什么错误格式？是否写测试？项目分层如何？AI 只能按默认猜测生成，结果往往看起来能运行，但很难直接进入项目。&lt;/span&gt;&lt;/p&gt;&lt;h2 style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-size: 16.8px;font-weight: bold;margin: 4em auto 2em;text-align: center;line-height: 1.75;font-family: -apple-system-font, BlinkMacSystemFont, &amp;quot;Helvetica Neue&amp;quot;, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei UI&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, Arial, sans-serif;display: table;padding: 0px 0.2em;color: rgb(255, 255, 255);background: rgb(15, 76, 129);&quot; class=&quot;js_darkmode__10 js_darkmode__text__14&quot;&gt;&lt;span class=&quot;js_darkmode__text__15&quot;&gt;好的 Prompt 要先给上下文&lt;/span&gt;&lt;/h2&gt;&lt;p style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);margin: 1.5em 8px;text-align: justify;line-height: 1.75;font-family: -apple-system-font, BlinkMacSystemFont, &amp;quot;Helvetica Neue&amp;quot;, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei UI&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, Arial, sans-serif;font-size: 14px;letter-spacing: 0.1em;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__11 js_darkmode__text__16&quot;&gt;&lt;span class=&quot;js_darkmode__text__17&quot;&gt;上下文不需要写成长篇文档，但要足够具体：&lt;/span&gt;&lt;/p&gt;&lt;pre style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-family: -apple-system-font, BlinkMacSystemFont, &amp;quot;Helvetica Neue&amp;quot;, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei UI&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, Arial, sans-serif;font-feature-settings: normal;font-variation-settings: normal;font-size: 14px;margin: 10px 8px;color: rgb(201, 209, 217);background: rgb(13, 17, 23);text-align: left;line-height: 1.5;overflow-x: auto;border-radius: 8px;padding: 0px !important;&quot; class=&quot;js_darkmode__12 js_darkmode__text__18&quot;&gt;&lt;span hidden=&quot;&quot; style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;display: flex;padding: 10px 14px 0px;&quot; class=&quot;js_darkmode__13&quot;&gt;&lt;svg x=&quot;0px&quot; y=&quot;0px&quot; width=&quot;45px&quot; height=&quot;13px&quot; viewbox=&quot;0 0 450 130&quot; aria-label=&quot;插图&quot;&gt;&lt;ellipse cx=&quot;50&quot; cy=&quot;65&quot; rx=&quot;50&quot; ry=&quot;52&quot; stroke=&quot;rgb(220,60,54)&quot; stroke-width=&quot;2&quot; fill=&quot;rgb(237,108,96)&quot;&gt;&lt;/ellipse&gt;&lt;ellipse cx=&quot;225&quot; cy=&quot;65&quot; rx=&quot;50&quot; ry=&quot;52&quot; stroke=&quot;rgb(218,151,33)&quot; stroke-width=&quot;2&quot; fill=&quot;rgb(247,193,81)&quot;&gt;&lt;/ellipse&gt;&lt;ellipse cx=&quot;400&quot; cy=&quot;65&quot; rx=&quot;50&quot; ry=&quot;52&quot; stroke=&quot;rgb(27,161,37)&quot; stroke-width=&quot;2&quot; fill=&quot;rgb(100,200,86)&quot;&gt;&lt;/ellipse&gt;&lt;/svg&gt;&lt;/span&gt;&lt;code style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-family: Menlo, &amp;quot;Operator Mono&amp;quot;, Consolas, Monaco, monospace;font-feature-settings: normal;font-variation-settings: normal;font-size: 14px;display: -webkit-box;padding: 0.5em 1em 1em;overflow-x: auto;text-indent: 0px;text-align: left;line-height: 1.75;margin: 0px;white-space: nowrap;&quot; class=&quot;js_darkmode__14 js_darkmode__text__19&quot;&gt;&lt;span class=&quot;js_darkmode__text__20&quot;&gt;我在一个 ASP.NET Core 8 Web API 项目中新增用户注册功能。&lt;/span&gt;&lt;br style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);&quot; class=&quot;js_darkmode__15&quot;/&gt;&lt;span class=&quot;js_darkmode__text__21&quot;&gt;项目使用 Controller + MediatR + FluentValidation + EF Core。&lt;/span&gt;&lt;br style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);&quot; class=&quot;js_darkmode__16&quot;/&gt;&lt;span class=&quot;js_darkmode__text__22&quot;&gt;返回错误统一使用 ProblemDetails。&lt;/span&gt;&lt;br style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);&quot; class=&quot;js_darkmode__17&quot;/&gt;&lt;span class=&quot;js_darkmode__text__23&quot;&gt;请只生成 Application 层 command、validator、handler，以及 Controller action。&lt;/span&gt;&lt;br style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);&quot; class=&quot;js_darkmode__18&quot;/&gt;&lt;span class=&quot;js_darkmode__text__24&quot;&gt;不要生成数据库迁移。&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);margin: 1.5em 8px;text-align: justify;line-height: 1.75;font-family: -apple-system-font, BlinkMacSystemFont, &amp;quot;Helvetica Neue&amp;quot;, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei UI&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, Arial, sans-serif;font-size: 14px;letter-spacing: 0.1em;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__19 js_darkmode__text__25&quot;&gt;&lt;span class=&quot;js_darkmode__text__26&quot;&gt;这段话把技术栈、分层边界和不要做的事情都说清楚了。AI 最怕的不是任务难，而是边界模糊。&lt;/span&gt;&lt;/p&gt;&lt;h2 style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-size: 16.8px;font-weight: bold;margin: 4em auto 2em;text-align: center;line-height: 1.75;font-family: -apple-system-font, BlinkMacSystemFont, &amp;quot;Helvetica Neue&amp;quot;, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei UI&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, Arial, sans-serif;display: table;padding: 0px 0.2em;color: rgb(255, 255, 255);background: rgb(15, 76, 129);&quot; class=&quot;js_darkmode__20 js_darkmode__text__27&quot;&gt;&lt;span class=&quot;js_darkmode__text__28&quot;&gt;把架构规则写进 Prompt&lt;/span&gt;&lt;/h2&gt;&lt;p style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);margin: 1.5em 8px;text-align: justify;line-height: 1.75;font-family: -apple-system-font, BlinkMacSystemFont, &amp;quot;Helvetica Neue&amp;quot;, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei UI&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, Arial, sans-serif;font-size: 14px;letter-spacing: 0.1em;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__21 js_darkmode__text__29&quot;&gt;&lt;span class=&quot;js_darkmode__text__30&quot;&gt;如果你的项目有 Clean Architecture 约定，就不要只说“使用 Clean Architecture”。要写成具体规则：&lt;/span&gt;&lt;/p&gt;&lt;pre style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-family: -apple-system-font, BlinkMacSystemFont, &amp;quot;Helvetica Neue&amp;quot;, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei UI&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, Arial, sans-serif;font-feature-settings: normal;font-variation-settings: normal;font-size: 14px;margin: 10px 8px;color: rgb(201, 209, 217);background: rgb(13, 17, 23);text-align: left;line-height: 1.5;overflow-x: auto;border-radius: 8px;padding: 0px !important;&quot; class=&quot;js_darkmode__22 js_darkmode__text__31&quot;&gt;&lt;span hidden=&quot;&quot; style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;display: flex;padding: 10px 14px 0px;&quot; class=&quot;js_darkmode__23&quot;&gt;&lt;svg x=&quot;0px&quot; y=&quot;0px&quot; width=&quot;45px&quot; height=&quot;13px&quot; viewbox=&quot;0 0 450 130&quot; aria-label=&quot;插图&quot;&gt;&lt;ellipse cx=&quot;50&quot; cy=&quot;65&quot; rx=&quot;50&quot; ry=&quot;52&quot; stroke=&quot;rgb(220,60,54)&quot; stroke-width=&quot;2&quot; fill=&quot;rgb(237,108,96)&quot;&gt;&lt;/ellipse&gt;&lt;ellipse cx=&quot;225&quot; cy=&quot;65&quot; rx=&quot;50&quot; ry=&quot;52&quot; stroke=&quot;rgb(218,151,33)&quot; stroke-width=&quot;2&quot; fill=&quot;rgb(247,193,81)&quot;&gt;&lt;/ellipse&gt;&lt;ellipse cx=&quot;400&quot; cy=&quot;65&quot; rx=&quot;50&quot; ry=&quot;52&quot; stroke=&quot;rgb(27,161,37)&quot; stroke-width=&quot;2&quot; fill=&quot;rgb(100,200,86)&quot;&gt;&lt;/ellipse&gt;&lt;/svg&gt;&lt;/span&gt;&lt;code style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-family: Menlo, &amp;quot;Operator Mono&amp;quot;, Consolas, Monaco, monospace;font-feature-settings: normal;font-variation-settings: normal;font-size: 14px;display: -webkit-box;padding: 0.5em 1em 1em;overflow-x: auto;text-indent: 0px;text-align: left;line-height: 1.75;margin: 0px;white-space: nowrap;&quot; class=&quot;js_darkmode__24 js_darkmode__text__32&quot;&gt;&lt;span class=&quot;js_darkmode__text__33&quot;&gt;架构约束：&lt;/span&gt;&lt;br style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);&quot; class=&quot;js_darkmode__25&quot;/&gt;&lt;span class=&quot;js_darkmode__text__34&quot;&gt;1. Domain 层不能引用 EF Core。&lt;/span&gt;&lt;br style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);&quot; class=&quot;js_darkmode__26&quot;/&gt;&lt;span class=&quot;js_darkmode__text__35&quot;&gt;2. Application 层只能依赖接口，不直接使用 DbContext。&lt;/span&gt;&lt;br style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);&quot; class=&quot;js_darkmode__27&quot;/&gt;&lt;span class=&quot;js_darkmode__text__36&quot;&gt;3. Infrastructure 层实现仓储接口。&lt;/span&gt;&lt;br style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);&quot; class=&quot;js_darkmode__28&quot;/&gt;&lt;span class=&quot;js_darkmode__text__37&quot;&gt;4. Controller 不写业务逻辑，只发送 MediatR command。&lt;/span&gt;&lt;br style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);&quot; class=&quot;js_darkmode__29&quot;/&gt;&lt;span class=&quot;js_darkmode__text__38&quot;&gt;5. 所有公开 DTO 使用 record。&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);margin: 1.5em 8px;text-align: justify;line-height: 1.75;font-family: -apple-system-font, BlinkMacSystemFont, &amp;quot;Helvetica Neue&amp;quot;, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei UI&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, Arial, sans-serif;font-size: 14px;letter-spacing: 0.1em;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__30 js_darkmode__text__39&quot;&gt;&lt;span class=&quot;js_darkmode__text__40&quot;&gt;这样生成结果更容易保持引用方向正确。&lt;/span&gt;&lt;/p&gt;&lt;h2 style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-size: 16.8px;font-weight: bold;margin: 4em auto 2em;text-align: center;line-height: 1.75;font-family: -apple-system-font, BlinkMacSystemFont, &amp;quot;Helvetica Neue&amp;quot;, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei UI&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, Arial, sans-serif;display: table;padding: 0px 0.2em;color: rgb(255, 255, 255);background: rgb(15, 76, 129);&quot; class=&quot;js_darkmode__31 js_darkmode__text__41&quot;&gt;&lt;span class=&quot;js_darkmode__text__42&quot;&gt;让 AI 输出可编译的 C# 代码&lt;/span&gt;&lt;/h2&gt;&lt;p style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);margin: 1.5em 8px;text-align: justify;line-height: 1.75;font-family: -apple-system-font, BlinkMacSystemFont, &amp;quot;Helvetica Neue&amp;quot;, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei UI&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, Arial, sans-serif;font-size: 14px;letter-spacing: 0.1em;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__32 js_darkmode__text__43&quot;&gt;&lt;span class=&quot;js_darkmode__text__44&quot;&gt;Prompt 里最好明确文件边界。比如注册用户功能可以要求输出这些文件：&lt;/span&gt;&lt;/p&gt;&lt;pre style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-family: -apple-system-font, BlinkMacSystemFont, &amp;quot;Helvetica Neue&amp;quot;, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei UI&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, Arial, sans-serif;font-feature-settings: normal;font-variation-settings: normal;font-size: 14px;margin: 10px 8px;color: rgb(201, 209, 217);background: rgb(13, 17, 23);text-align: left;line-height: 1.5;overflow-x: auto;border-radius: 8px;padding: 0px !important;&quot; class=&quot;js_darkmode__33 js_darkmode__text__45&quot;&gt;&lt;span hidden=&quot;&quot; style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;display: flex;padding: 10px 14px 0px;&quot; class=&quot;js_darkmode__34&quot;&gt;&lt;svg x=&quot;0px&quot; y=&quot;0px&quot; width=&quot;45px&quot; height=&quot;13px&quot; viewbox=&quot;0 0 450 130&quot; aria-label=&quot;插图&quot;&gt;&lt;ellipse cx=&quot;50&quot; cy=&quot;65&quot; rx=&quot;50&quot; ry=&quot;52&quot; stroke=&quot;rgb(220,60,54)&quot; stroke-width=&quot;2&quot; fill=&quot;rgb(237,108,96)&quot;&gt;&lt;/ellipse&gt;&lt;ellipse cx=&quot;225&quot; cy=&quot;65&quot; rx=&quot;50&quot; ry=&quot;52&quot; stroke=&quot;rgb(218,151,33)&quot; stroke-width=&quot;2&quot; fill=&quot;rgb(247,193,81)&quot;&gt;&lt;/ellipse&gt;&lt;ellipse cx=&quot;400&quot; cy=&quot;65&quot; rx=&quot;50&quot; ry=&quot;52&quot; stroke=&quot;rgb(27,161,37)&quot; stroke-width=&quot;2&quot; fill=&quot;rgb(100,200,86)&quot;&gt;&lt;/ellipse&gt;&lt;/svg&gt;&lt;/span&gt;&lt;code style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-family: Menlo, &amp;quot;Operator Mono&amp;quot;, Consolas, Monaco, monospace;font-feature-settings: normal;font-variation-settings: normal;font-size: 14px;display: -webkit-box;padding: 0.5em 1em 1em;overflow-x: auto;text-indent: 0px;text-align: left;line-height: 1.75;margin: 0px;white-space: nowrap;&quot; class=&quot;js_darkmode__35 js_darkmode__text__46&quot;&gt;&lt;span class=&quot;js_darkmode__text__47&quot;&gt;请按文件分段输出：&lt;/span&gt;&lt;br style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);&quot; class=&quot;js_darkmode__36&quot;/&gt;&lt;span class=&quot;js_darkmode__text__48&quot;&gt;- RegisterUserCommand.cs&lt;/span&gt;&lt;br style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);&quot; class=&quot;js_darkmode__37&quot;/&gt;&lt;span class=&quot;js_darkmode__text__49&quot;&gt;- RegisterUserValidator.cs&lt;/span&gt;&lt;br style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);&quot; class=&quot;js_darkmode__38&quot;/&gt;&lt;span class=&quot;js_darkmode__text__50&quot;&gt;- RegisterUserHandler.cs&lt;/span&gt;&lt;br style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);&quot; class=&quot;js_darkmode__39&quot;/&gt;&lt;span class=&quot;js_darkmode__text__51&quot;&gt;- UsersController.cs&lt;/span&gt;&lt;br style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);&quot; class=&quot;js_darkmode__40&quot;/&gt;&lt;span class=&quot;js_darkmode__text__52&quot;&gt;- RegisterUserTests.cs&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);margin: 1.5em 8px;text-align: justify;line-height: 1.75;font-family: -apple-system-font, BlinkMacSystemFont, &amp;quot;Helvetica Neue&amp;quot;, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei UI&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, Arial, sans-serif;font-size: 14px;letter-spacing: 0.1em;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__41 js_darkmode__text__53&quot;&gt;&lt;span class=&quot;js_darkmode__text__54&quot;&gt;生成的核心 command 可以长这样：&lt;/span&gt;&lt;/p&gt;&lt;pre style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-family: -apple-system-font, BlinkMacSystemFont, &amp;quot;Helvetica Neue&amp;quot;, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei UI&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, Arial, sans-serif;font-feature-settings: normal;font-variation-settings: normal;font-size: 14px;margin: 10px 8px;color: rgb(201, 209, 217);background: rgb(13, 17, 23);text-align: left;line-height: 1.5;overflow-x: auto;border-radius: 8px;padding: 0px !important;&quot; class=&quot;js_darkmode__42 js_darkmode__text__55&quot;&gt;&lt;span hidden=&quot;&quot; style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;display: flex;padding: 10px 14px 0px;&quot; class=&quot;js_darkmode__43&quot;&gt;&lt;svg x=&quot;0px&quot; y=&quot;0px&quot; width=&quot;45px&quot; height=&quot;13px&quot; viewbox=&quot;0 0 450 130&quot; aria-label=&quot;插图&quot;&gt;&lt;ellipse cx=&quot;50&quot; cy=&quot;65&quot; rx=&quot;50&quot; ry=&quot;52&quot; stroke=&quot;rgb(220,60,54)&quot; stroke-width=&quot;2&quot; fill=&quot;rgb(237,108,96)&quot;&gt;&lt;/ellipse&gt;&lt;ellipse cx=&quot;225&quot; cy=&quot;65&quot; rx=&quot;50&quot; ry=&quot;52&quot; stroke=&quot;rgb(218,151,33)&quot; stroke-width=&quot;2&quot; fill=&quot;rgb(247,193,81)&quot;&gt;&lt;/ellipse&gt;&lt;ellipse cx=&quot;400&quot; cy=&quot;65&quot; rx=&quot;50&quot; ry=&quot;52&quot; stroke=&quot;rgb(27,161,37)&quot; stroke-width=&quot;2&quot; fill=&quot;rgb(100,200,86)&quot;&gt;&lt;/ellipse&gt;&lt;/svg&gt;&lt;/span&gt;&lt;code style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-family: Menlo, &amp;quot;Operator Mono&amp;quot;, Consolas, Monaco, monospace;font-feature-settings: normal;font-variation-settings: normal;font-size: 14px;display: -webkit-box;padding: 0.5em 1em 1em;overflow-x: auto;text-indent: 0px;text-align: left;line-height: 1.75;margin: 0px;white-space: nowrap;&quot; class=&quot;js_darkmode__44 js_darkmode__text__56&quot;&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;&quot; class=&quot;js_darkmode__45 js_darkmode__text__57&quot;&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;color: #FF7B72;&quot; class=&quot;js_darkmode__46 js_darkmode__text__58&quot;&gt;&lt;span class=&quot;js_darkmode__text__59&quot;&gt;public&lt;/span&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;color: #FF7B72;&quot; class=&quot;js_darkmode__47 js_darkmode__text__60&quot;&gt;&lt;span class=&quot;js_darkmode__text__61&quot;&gt;sealed&lt;/span&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;color: #FF7B72;&quot; class=&quot;js_darkmode__48 js_darkmode__text__62&quot;&gt;&lt;span class=&quot;js_darkmode__text__63&quot;&gt;record&lt;/span&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;color: #D2A8FF;&quot; class=&quot;js_darkmode__49 js_darkmode__text__64&quot;&gt;&lt;span class=&quot;js_darkmode__text__65&quot;&gt;RegisterUserCommand&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;js_darkmode__text__66&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;&quot; class=&quot;js_darkmode__50 js_darkmode__text__67&quot;&gt;&lt;br style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);&quot; class=&quot;js_darkmode__51&quot;/&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;color: #FFA657;&quot; class=&quot;js_darkmode__52 js_darkmode__text__68&quot;&gt;&lt;span class=&quot;js_darkmode__text__69&quot;&gt;string&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;js_darkmode__text__70&quot;&gt;&amp;nbsp;Email,&lt;/span&gt;&lt;br style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);&quot; class=&quot;js_darkmode__53&quot;/&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;color: #FFA657;&quot; class=&quot;js_darkmode__54 js_darkmode__text__71&quot;&gt;&lt;span class=&quot;js_darkmode__text__72&quot;&gt;string&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;js_darkmode__text__73&quot;&gt;&amp;nbsp;Password,&lt;/span&gt;&lt;br style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);&quot; class=&quot;js_darkmode__55&quot;/&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;color: #FFA657;&quot; class=&quot;js_darkmode__56 js_darkmode__text__74&quot;&gt;&lt;span class=&quot;js_darkmode__text__75&quot;&gt;string&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;js_darkmode__text__76&quot;&gt;&amp;nbsp;DisplayName&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;js_darkmode__text__77&quot;&gt;) : IRequest&amp;lt;Result&amp;lt;Guid&amp;gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;js_darkmode__text__78&quot;&gt;;&lt;/span&gt;&lt;br style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);&quot; class=&quot;js_darkmode__57&quot;/&gt;&lt;br style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);&quot; class=&quot;js_darkmode__58&quot;/&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;color: #FF7B72;&quot; class=&quot;js_darkmode__59 js_darkmode__text__79&quot;&gt;&lt;span class=&quot;js_darkmode__text__80&quot;&gt;public&lt;/span&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;color: #FF7B72;&quot; class=&quot;js_darkmode__60 js_darkmode__text__81&quot;&gt;&lt;span class=&quot;js_darkmode__text__82&quot;&gt;sealed&lt;/span&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;color: #FF7B72;&quot; class=&quot;js_darkmode__61 js_darkmode__text__83&quot;&gt;&lt;span class=&quot;js_darkmode__text__84&quot;&gt;class&lt;/span&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;color: #D2A8FF;&quot; class=&quot;js_darkmode__62 js_darkmode__text__85&quot;&gt;&lt;span class=&quot;js_darkmode__text__86&quot;&gt;RegisterUserValidator&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;js_darkmode__text__87&quot;&gt;&amp;nbsp;:&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;color: #D2A8FF;&quot; class=&quot;js_darkmode__63 js_darkmode__text__88&quot;&gt;&lt;span class=&quot;js_darkmode__text__89&quot;&gt;AbstractValidator&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;js_darkmode__text__90&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;color: #D2A8FF;&quot; class=&quot;js_darkmode__64 js_darkmode__text__91&quot;&gt;&lt;span class=&quot;js_darkmode__text__92&quot;&gt;RegisterUserCommand&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;js_darkmode__text__93&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);&quot; class=&quot;js_darkmode__65&quot;/&gt;&lt;span class=&quot;js_darkmode__text__94&quot;&gt;{&lt;/span&gt;&lt;br style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);&quot; class=&quot;js_darkmode__66&quot;/&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;&quot; class=&quot;js_darkmode__67 js_darkmode__text__95&quot;&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;color: #FF7B72;&quot; class=&quot;js_darkmode__68 js_darkmode__text__96&quot;&gt;&lt;span class=&quot;js_darkmode__text__97&quot;&gt;public&lt;/span&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;color: #D2A8FF;&quot; class=&quot;js_darkmode__69 js_darkmode__text__98&quot;&gt;&lt;span class=&quot;js_darkmode__text__99&quot;&gt;RegisterUserValidator&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;js_darkmode__text__100&quot;&gt;()&lt;/span&gt;&lt;/span&gt;&lt;br style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);&quot; class=&quot;js_darkmode__70&quot;/&gt;&lt;span class=&quot;js_darkmode__text__101&quot;&gt;&amp;nbsp; &amp;nbsp; {&lt;/span&gt;&lt;br style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);&quot; class=&quot;js_darkmode__71&quot;/&gt;&lt;span class=&quot;js_darkmode__text__102&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; RuleFor(x =&amp;gt; x.Email).NotEmpty().EmailAddress();&lt;/span&gt;&lt;br style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);&quot; class=&quot;js_darkmode__72&quot;/&gt;&lt;span class=&quot;js_darkmode__text__103&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; RuleFor(x =&amp;gt; x.Password).MinimumLength(&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;color: #79C0FF;&quot; class=&quot;js_darkmode__73 js_darkmode__text__104&quot;&gt;&lt;span class=&quot;js_darkmode__text__105&quot;&gt;12&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;js_darkmode__text__106&quot;&gt;);&lt;/span&gt;&lt;br style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);&quot; class=&quot;js_darkmode__74&quot;/&gt;&lt;span class=&quot;js_darkmode__text__107&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; RuleFor(x =&amp;gt; x.DisplayName).NotEmpty().MaximumLength(&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;color: #79C0FF;&quot; class=&quot;js_darkmode__75 js_darkmode__text__108&quot;&gt;&lt;span class=&quot;js_darkmode__text__109&quot;&gt;80&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;js_darkmode__text__110&quot;&gt;);&lt;/span&gt;&lt;br style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);&quot; class=&quot;js_darkmode__76&quot;/&gt;&lt;span class=&quot;js_darkmode__text__111&quot;&gt;&amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;br style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);&quot; class=&quot;js_darkmode__77&quot;/&gt;&lt;span class=&quot;js_darkmode__text__112&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);margin: 1.5em 8px;text-align: justify;line-height: 1.75;font-family: -apple-system-font, BlinkMacSystemFont, &amp;quot;Helvetica Neue&amp;quot;, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei UI&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, Arial, sans-serif;font-size: 14px;letter-spacing: 0.1em;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__78 js_darkmode__text__113&quot;&gt;&lt;span class=&quot;js_darkmode__text__114&quot;&gt;这类输出比“一段完整代码”更容易复制到现有项目，也更容易逐文件审查。&lt;/span&gt;&lt;/p&gt;&lt;h2 style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-size: 16.8px;font-weight: bold;margin: 4em auto 2em;text-align: center;line-height: 1.75;font-family: -apple-system-font, BlinkMacSystemFont, &amp;quot;Helvetica Neue&amp;quot;, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei UI&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, Arial, sans-serif;display: table;padding: 0px 0.2em;color: rgb(255, 255, 255);background: rgb(15, 76, 129);&quot; class=&quot;js_darkmode__79 js_darkmode__text__115&quot;&gt;&lt;span class=&quot;js_darkmode__text__116&quot;&gt;明确错误处理策略&lt;/span&gt;&lt;/h2&gt;&lt;p style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);margin: 1.5em 8px;text-align: justify;line-height: 1.75;font-family: -apple-system-font, BlinkMacSystemFont, &amp;quot;Helvetica Neue&amp;quot;, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei UI&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, Arial, sans-serif;font-size: 14px;letter-spacing: 0.1em;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__80 js_darkmode__text__117&quot;&gt;&lt;span class=&quot;js_darkmode__text__118&quot;&gt;.NET 项目里错误处理风格差异很大：有人抛异常，有人返回&amp;nbsp;&lt;/span&gt;&lt;code style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-family: -apple-system-font, BlinkMacSystemFont, &amp;quot;Helvetica Neue&amp;quot;, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei UI&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, Arial, sans-serif;font-feature-settings: normal;font-variation-settings: normal;font-size: 12.6px;text-align: left;line-height: 1.75;color: rgb(221, 17, 68);background: rgba(27, 31, 35, 0.05);padding: 3px 5px;border-radius: 4px;&quot; class=&quot;js_darkmode__81 js_darkmode__text__119&quot;&gt;&lt;span class=&quot;js_darkmode__text__120&quot;&gt;Result&amp;lt;T&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;span class=&quot;js_darkmode__text__121&quot;&gt;，有人统一 ProblemDetails。Prompt 必须说明。&lt;/span&gt;&lt;/p&gt;&lt;pre style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-family: -apple-system-font, BlinkMacSystemFont, &amp;quot;Helvetica Neue&amp;quot;, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei UI&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, Arial, sans-serif;font-feature-settings: normal;font-variation-settings: normal;font-size: 14px;margin: 10px 8px;color: rgb(201, 209, 217);background: rgb(13, 17, 23);text-align: left;line-height: 1.5;overflow-x: auto;border-radius: 8px;padding: 0px !important;&quot; class=&quot;js_darkmode__82 js_darkmode__text__122&quot;&gt;&lt;span hidden=&quot;&quot; style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;display: flex;padding: 10px 14px 0px;&quot; class=&quot;js_darkmode__83&quot;&gt;&lt;svg x=&quot;0px&quot; y=&quot;0px&quot; width=&quot;45px&quot; height=&quot;13px&quot; viewbox=&quot;0 0 450 130&quot; aria-label=&quot;插图&quot;&gt;&lt;ellipse cx=&quot;50&quot; cy=&quot;65&quot; rx=&quot;50&quot; ry=&quot;52&quot; stroke=&quot;rgb(220,60,54)&quot; stroke-width=&quot;2&quot; fill=&quot;rgb(237,108,96)&quot;&gt;&lt;/ellipse&gt;&lt;ellipse cx=&quot;225&quot; cy=&quot;65&quot; rx=&quot;50&quot; ry=&quot;52&quot; stroke=&quot;rgb(218,151,33)&quot; stroke-width=&quot;2&quot; fill=&quot;rgb(247,193,81)&quot;&gt;&lt;/ellipse&gt;&lt;ellipse cx=&quot;400&quot; cy=&quot;65&quot; rx=&quot;50&quot; ry=&quot;52&quot; stroke=&quot;rgb(27,161,37)&quot; stroke-width=&quot;2&quot; fill=&quot;rgb(100,200,86)&quot;&gt;&lt;/ellipse&gt;&lt;/svg&gt;&lt;/span&gt;&lt;code style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-family: Menlo, &amp;quot;Operator Mono&amp;quot;, Consolas, Monaco, monospace;font-feature-settings: normal;font-variation-settings: normal;font-size: 14px;display: -webkit-box;padding: 0.5em 1em 1em;overflow-x: auto;text-indent: 0px;text-align: left;line-height: 1.75;margin: 0px;white-space: nowrap;&quot; class=&quot;js_darkmode__84 js_darkmode__text__123&quot;&gt;&lt;span class=&quot;js_darkmode__text__124&quot;&gt;错误处理要求：&lt;/span&gt;&lt;br style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);&quot; class=&quot;js_darkmode__85&quot;/&gt;&lt;span class=&quot;js_darkmode__text__125&quot;&gt;- 校验错误由 FluentValidation 产生。&lt;/span&gt;&lt;br style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);&quot; class=&quot;js_darkmode__86&quot;/&gt;&lt;span class=&quot;js_darkmode__text__126&quot;&gt;- 业务冲突返回 Result.Conflict，不抛异常。&lt;/span&gt;&lt;br style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);&quot; class=&quot;js_darkmode__87&quot;/&gt;&lt;span class=&quot;js_darkmode__text__127&quot;&gt;- Controller 将 Result 映射为 200、400、409。&lt;/span&gt;&lt;br style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);&quot; class=&quot;js_darkmode__88&quot;/&gt;&lt;span class=&quot;js_darkmode__text__128&quot;&gt;- 不要返回裸字符串错误。&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);margin: 1.5em 8px;text-align: justify;line-height: 1.75;font-family: -apple-system-font, BlinkMacSystemFont, &amp;quot;Helvetica Neue&amp;quot;, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei UI&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, Arial, sans-serif;font-size: 14px;letter-spacing: 0.1em;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__89 js_darkmode__text__129&quot;&gt;&lt;span class=&quot;js_darkmode__text__130&quot;&gt;对应的 Controller 可以是：&lt;/span&gt;&lt;/p&gt;&lt;pre style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-family: -apple-system-font, BlinkMacSystemFont, &amp;quot;Helvetica Neue&amp;quot;, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei UI&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, Arial, sans-serif;font-feature-settings: normal;font-variation-settings: normal;font-size: 14px;margin: 10px 8px;color: rgb(201, 209, 217);background: rgb(13, 17, 23);text-align: left;line-height: 1.5;overflow-x: auto;border-radius: 8px;padding: 0px !important;&quot; class=&quot;js_darkmode__90 js_darkmode__text__131&quot;&gt;&lt;span hidden=&quot;&quot; style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;display: flex;padding: 10px 14px 0px;&quot; class=&quot;js_darkmode__91&quot;&gt;&lt;svg x=&quot;0px&quot; y=&quot;0px&quot; width=&quot;45px&quot; height=&quot;13px&quot; viewbox=&quot;0 0 450 130&quot; aria-label=&quot;插图&quot;&gt;&lt;ellipse cx=&quot;50&quot; cy=&quot;65&quot; rx=&quot;50&quot; ry=&quot;52&quot; stroke=&quot;rgb(220,60,54)&quot; stroke-width=&quot;2&quot; fill=&quot;rgb(237,108,96)&quot;&gt;&lt;/ellipse&gt;&lt;ellipse cx=&quot;225&quot; cy=&quot;65&quot; rx=&quot;50&quot; ry=&quot;52&quot; stroke=&quot;rgb(218,151,33)&quot; stroke-width=&quot;2&quot; fill=&quot;rgb(247,193,81)&quot;&gt;&lt;/ellipse&gt;&lt;ellipse cx=&quot;400&quot; cy=&quot;65&quot; rx=&quot;50&quot; ry=&quot;52&quot; stroke=&quot;rgb(27,161,37)&quot; stroke-width=&quot;2&quot; fill=&quot;rgb(100,200,86)&quot;&gt;&lt;/ellipse&gt;&lt;/svg&gt;&lt;/span&gt;&lt;code style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-family: Menlo, &amp;quot;Operator Mono&amp;quot;, Consolas, Monaco, monospace;font-feature-settings: normal;font-variation-settings: normal;font-size: 14px;display: -webkit-box;padding: 0.5em 1em 1em;overflow-x: auto;text-indent: 0px;text-align: left;line-height: 1.75;margin: 0px;white-space: nowrap;&quot; class=&quot;js_darkmode__92 js_darkmode__text__132&quot;&gt;&lt;span class=&quot;js_darkmode__text__133&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;color: #79C0FF;&quot; class=&quot;js_darkmode__93 js_darkmode__text__134&quot;&gt;&lt;span class=&quot;js_darkmode__text__135&quot;&gt;HttpPost(&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;color: #A5D6FF;&quot; class=&quot;js_darkmode__94 js_darkmode__text__136&quot;&gt;&lt;span class=&quot;js_darkmode__text__137&quot;&gt;&amp;quot;register&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;js_darkmode__text__138&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;js_darkmode__text__139&quot;&gt;]&lt;/span&gt;&lt;br style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);&quot; class=&quot;js_darkmode__95&quot;/&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;&quot; class=&quot;js_darkmode__96 js_darkmode__text__140&quot;&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;color: #FF7B72;&quot; class=&quot;js_darkmode__97 js_darkmode__text__141&quot;&gt;&lt;span class=&quot;js_darkmode__text__142&quot;&gt;public&lt;/span&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;color: #FF7B72;&quot; class=&quot;js_darkmode__98 js_darkmode__text__143&quot;&gt;&lt;span class=&quot;js_darkmode__text__144&quot;&gt;async&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;js_darkmode__text__145&quot;&gt;&amp;nbsp;Task&amp;lt;IActionResult&amp;gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;color: #D2A8FF;&quot; class=&quot;js_darkmode__99 js_darkmode__text__146&quot;&gt;&lt;span class=&quot;js_darkmode__text__147&quot;&gt;Register&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;js_darkmode__text__148&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;&quot; class=&quot;js_darkmode__100 js_darkmode__text__149&quot;&gt;&lt;br style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);&quot; class=&quot;js_darkmode__101&quot;/&gt;&lt;span class=&quot;js_darkmode__text__150&quot;&gt;&amp;nbsp; &amp;nbsp; RegisterUserCommand command,&lt;/span&gt;&lt;br style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);&quot; class=&quot;js_darkmode__102&quot;/&gt;&lt;span class=&quot;js_darkmode__text__151&quot;&gt;&amp;nbsp; &amp;nbsp; CancellationToken cancellationToken&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;js_darkmode__text__152&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);&quot; class=&quot;js_darkmode__103&quot;/&gt;&lt;span class=&quot;js_darkmode__text__153&quot;&gt;{&lt;/span&gt;&lt;br style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);&quot; class=&quot;js_darkmode__104&quot;/&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;color: #FF7B72;&quot; class=&quot;js_darkmode__105 js_darkmode__text__154&quot;&gt;&lt;span class=&quot;js_darkmode__text__155&quot;&gt;var&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;js_darkmode__text__156&quot;&gt;&amp;nbsp;result =&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;color: #FF7B72;&quot; class=&quot;js_darkmode__106 js_darkmode__text__157&quot;&gt;&lt;span class=&quot;js_darkmode__text__158&quot;&gt;await&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;js_darkmode__text__159&quot;&gt;&amp;nbsp;sender.Send(command, cancellationToken);&lt;/span&gt;&lt;br style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);&quot; class=&quot;js_darkmode__107&quot;/&gt;&lt;br style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);&quot; class=&quot;js_darkmode__108&quot;/&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;color: #FF7B72;&quot; class=&quot;js_darkmode__109 js_darkmode__text__160&quot;&gt;&lt;span class=&quot;js_darkmode__text__161&quot;&gt;return&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;js_darkmode__text__162&quot;&gt;&amp;nbsp;result.Status&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;color: #FF7B72;&quot; class=&quot;js_darkmode__110 js_darkmode__text__163&quot;&gt;&lt;span class=&quot;js_darkmode__text__164&quot;&gt;switch&lt;/span&gt;&lt;/span&gt;&lt;br style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);&quot; class=&quot;js_darkmode__111&quot;/&gt;&lt;span class=&quot;js_darkmode__text__165&quot;&gt;&amp;nbsp; &amp;nbsp; {&lt;/span&gt;&lt;br style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);&quot; class=&quot;js_darkmode__112&quot;/&gt;&lt;span class=&quot;js_darkmode__text__166&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ResultStatus.Success =&amp;gt; Ok(&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;color: #FF7B72;&quot; class=&quot;js_darkmode__113 js_darkmode__text__167&quot;&gt;&lt;span class=&quot;js_darkmode__text__168&quot;&gt;new&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;js_darkmode__text__169&quot;&gt;&amp;nbsp;{ userId = result.Value }),&lt;/span&gt;&lt;br style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);&quot; class=&quot;js_darkmode__114&quot;/&gt;&lt;span class=&quot;js_darkmode__text__170&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ResultStatus.Conflict =&amp;gt; Conflict(CreateProblem(result.Error)),&lt;/span&gt;&lt;br style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);&quot; class=&quot;js_darkmode__115&quot;/&gt;&lt;span class=&quot;js_darkmode__text__171&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ResultStatus.Invalid =&amp;gt; ValidationProblem(result.ValidationErrors),&lt;/span&gt;&lt;br style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);&quot; class=&quot;js_darkmode__116&quot;/&gt;&lt;span class=&quot;js_darkmode__text__172&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; _ =&amp;gt; StatusCode(StatusCodes.Status500InternalServerError)&lt;/span&gt;&lt;br style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);&quot; class=&quot;js_darkmode__117&quot;/&gt;&lt;span class=&quot;js_darkmode__text__173&quot;&gt;&amp;nbsp; &amp;nbsp; };&lt;/span&gt;&lt;br style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);&quot; class=&quot;js_darkmode__118&quot;/&gt;&lt;span class=&quot;js_darkmode__text__174&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);margin: 1.5em 8px;text-align: justify;line-height: 1.75;font-family: -apple-system-font, BlinkMacSystemFont, &amp;quot;Helvetica Neue&amp;quot;, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei UI&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, Arial, sans-serif;font-size: 14px;letter-spacing: 0.1em;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__119 js_darkmode__text__175&quot;&gt;&lt;span class=&quot;js_darkmode__text__176&quot;&gt;Prompt 写得越清楚，AI 越不容易把异常、状态码和响应模型混成一团。&lt;/span&gt;&lt;/p&gt;&lt;h2 style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-size: 16.8px;font-weight: bold;margin: 4em auto 2em;text-align: center;line-height: 1.75;font-family: -apple-system-font, BlinkMacSystemFont, &amp;quot;Helvetica Neue&amp;quot;, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei UI&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, Arial, sans-serif;display: table;padding: 0px 0.2em;color: rgb(255, 255, 255);background: rgb(15, 76, 129);&quot; class=&quot;js_darkmode__120 js_darkmode__text__177&quot;&gt;&lt;span class=&quot;js_darkmode__text__178&quot;&gt;验收条件要可执行&lt;/span&gt;&lt;/h2&gt;&lt;p style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);margin: 1.5em 8px;text-align: justify;line-height: 1.75;font-family: -apple-system-font, BlinkMacSystemFont, &amp;quot;Helvetica Neue&amp;quot;, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei UI&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, Arial, sans-serif;font-size: 14px;letter-spacing: 0.1em;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__121 js_darkmode__text__179&quot;&gt;&lt;span class=&quot;js_darkmode__text__180&quot;&gt;只说“代码要好”没有意义。可以把验收标准写成测试要求：&lt;/span&gt;&lt;/p&gt;&lt;pre style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-family: -apple-system-font, BlinkMacSystemFont, &amp;quot;Helvetica Neue&amp;quot;, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei UI&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, Arial, sans-serif;font-feature-settings: normal;font-variation-settings: normal;font-size: 14px;margin: 10px 8px;color: rgb(201, 209, 217);background: rgb(13, 17, 23);text-align: left;line-height: 1.5;overflow-x: auto;border-radius: 8px;padding: 0px !important;&quot; class=&quot;js_darkmode__122 js_darkmode__text__181&quot;&gt;&lt;span hidden=&quot;&quot; style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;display: flex;padding: 10px 14px 0px;&quot; class=&quot;js_darkmode__123&quot;&gt;&lt;svg x=&quot;0px&quot; y=&quot;0px&quot; width=&quot;45px&quot; height=&quot;13px&quot; viewbox=&quot;0 0 450 130&quot; aria-label=&quot;插图&quot;&gt;&lt;ellipse cx=&quot;50&quot; cy=&quot;65&quot; rx=&quot;50&quot; ry=&quot;52&quot; stroke=&quot;rgb(220,60,54)&quot; stroke-width=&quot;2&quot; fill=&quot;rgb(237,108,96)&quot;&gt;&lt;/ellipse&gt;&lt;ellipse cx=&quot;225&quot; cy=&quot;65&quot; rx=&quot;50&quot; ry=&quot;52&quot; stroke=&quot;rgb(218,151,33)&quot; stroke-width=&quot;2&quot; fill=&quot;rgb(247,193,81)&quot;&gt;&lt;/ellipse&gt;&lt;ellipse cx=&quot;400&quot; cy=&quot;65&quot; rx=&quot;50&quot; ry=&quot;52&quot; stroke=&quot;rgb(27,161,37)&quot; stroke-width=&quot;2&quot; fill=&quot;rgb(100,200,86)&quot;&gt;&lt;/ellipse&gt;&lt;/svg&gt;&lt;/span&gt;&lt;code style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-family: Menlo, &amp;quot;Operator Mono&amp;quot;, Consolas, Monaco, monospace;font-feature-settings: normal;font-variation-settings: normal;font-size: 14px;display: -webkit-box;padding: 0.5em 1em 1em;overflow-x: auto;text-indent: 0px;text-align: left;line-height: 1.75;margin: 0px;white-space: nowrap;&quot; class=&quot;js_darkmode__124 js_darkmode__text__182&quot;&gt;&lt;span class=&quot;js_darkmode__text__183&quot;&gt;请同时生成单元测试，至少覆盖：&lt;/span&gt;&lt;br style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);&quot; class=&quot;js_darkmode__125&quot;/&gt;&lt;span class=&quot;js_darkmode__text__184&quot;&gt;1. 邮箱格式错误时验证失败。&lt;/span&gt;&lt;br style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);&quot; class=&quot;js_darkmode__126&quot;/&gt;&lt;span class=&quot;js_darkmode__text__185&quot;&gt;2. 邮箱已存在时返回 Conflict。&lt;/span&gt;&lt;br style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);&quot; class=&quot;js_darkmode__127&quot;/&gt;&lt;span class=&quot;js_darkmode__text__186&quot;&gt;3. 注册成功时返回新用户 ID。&lt;/span&gt;&lt;br style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);&quot; class=&quot;js_darkmode__128&quot;/&gt;&lt;span class=&quot;js_darkmode__text__187&quot;&gt;4. handler 不直接引用 Controller 或 HttpContext。&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);margin: 1.5em 8px;text-align: justify;line-height: 1.75;font-family: -apple-system-font, BlinkMacSystemFont, &amp;quot;Helvetica Neue&amp;quot;, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei UI&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, Arial, sans-serif;font-size: 14px;letter-spacing: 0.1em;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__129 js_darkmode__text__188&quot;&gt;&lt;span class=&quot;js_darkmode__text__189&quot;&gt;测试示例：&lt;/span&gt;&lt;/p&gt;&lt;pre style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-family: -apple-system-font, BlinkMacSystemFont, &amp;quot;Helvetica Neue&amp;quot;, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei UI&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, Arial, sans-serif;font-feature-settings: normal;font-variation-settings: normal;font-size: 14px;margin: 10px 8px;color: rgb(201, 209, 217);background: rgb(13, 17, 23);text-align: left;line-height: 1.5;overflow-x: auto;border-radius: 8px;padding: 0px !important;&quot; class=&quot;js_darkmode__130 js_darkmode__text__190&quot;&gt;&lt;span hidden=&quot;&quot; style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;display: flex;padding: 10px 14px 0px;&quot; class=&quot;js_darkmode__131&quot;&gt;&lt;svg x=&quot;0px&quot; y=&quot;0px&quot; width=&quot;45px&quot; height=&quot;13px&quot; viewbox=&quot;0 0 450 130&quot; aria-label=&quot;插图&quot;&gt;&lt;ellipse cx=&quot;50&quot; cy=&quot;65&quot; rx=&quot;50&quot; ry=&quot;52&quot; stroke=&quot;rgb(220,60,54)&quot; stroke-width=&quot;2&quot; fill=&quot;rgb(237,108,96)&quot;&gt;&lt;/ellipse&gt;&lt;ellipse cx=&quot;225&quot; cy=&quot;65&quot; rx=&quot;50&quot; ry=&quot;52&quot; stroke=&quot;rgb(218,151,33)&quot; stroke-width=&quot;2&quot; fill=&quot;rgb(247,193,81)&quot;&gt;&lt;/ellipse&gt;&lt;ellipse cx=&quot;400&quot; cy=&quot;65&quot; rx=&quot;50&quot; ry=&quot;52&quot; stroke=&quot;rgb(27,161,37)&quot; stroke-width=&quot;2&quot; fill=&quot;rgb(100,200,86)&quot;&gt;&lt;/ellipse&gt;&lt;/svg&gt;&lt;/span&gt;&lt;code style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-family: Menlo, &amp;quot;Operator Mono&amp;quot;, Consolas, Monaco, monospace;font-feature-settings: normal;font-variation-settings: normal;font-size: 14px;display: -webkit-box;padding: 0.5em 1em 1em;overflow-x: auto;text-indent: 0px;text-align: left;line-height: 1.75;margin: 0px;white-space: nowrap;&quot; class=&quot;js_darkmode__132 js_darkmode__text__191&quot;&gt;&lt;span class=&quot;js_darkmode__text__192&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;color: #79C0FF;&quot; class=&quot;js_darkmode__133 js_darkmode__text__193&quot;&gt;&lt;span class=&quot;js_darkmode__text__194&quot;&gt;Fact&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;js_darkmode__text__195&quot;&gt;]&lt;/span&gt;&lt;br style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);&quot; class=&quot;js_darkmode__134&quot;/&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;&quot; class=&quot;js_darkmode__135 js_darkmode__text__196&quot;&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;color: #FF7B72;&quot; class=&quot;js_darkmode__136 js_darkmode__text__197&quot;&gt;&lt;span class=&quot;js_darkmode__text__198&quot;&gt;public&lt;/span&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;color: #FF7B72;&quot; class=&quot;js_darkmode__137 js_darkmode__text__199&quot;&gt;&lt;span class=&quot;js_darkmode__text__200&quot;&gt;async&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;js_darkmode__text__201&quot;&gt;&amp;nbsp;Task&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;color: #D2A8FF;&quot; class=&quot;js_darkmode__138 js_darkmode__text__202&quot;&gt;&lt;span class=&quot;js_darkmode__text__203&quot;&gt;Handle_ShouldReturnConflict_WhenEmailAlreadyExists&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;js_darkmode__text__204&quot;&gt;()&lt;/span&gt;&lt;/span&gt;&lt;br style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);&quot; class=&quot;js_darkmode__139&quot;/&gt;&lt;span class=&quot;js_darkmode__text__205&quot;&gt;{&lt;/span&gt;&lt;br style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);&quot; class=&quot;js_darkmode__140&quot;/&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;color: #FF7B72;&quot; class=&quot;js_darkmode__141 js_darkmode__text__206&quot;&gt;&lt;span class=&quot;js_darkmode__text__207&quot;&gt;var&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;js_darkmode__text__208&quot;&gt;&amp;nbsp;repository = Substitute.For&amp;lt;IUserRepository&amp;gt;();&lt;/span&gt;&lt;br style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);&quot; class=&quot;js_darkmode__142&quot;/&gt;&lt;span class=&quot;js_darkmode__text__209&quot;&gt;&amp;nbsp; &amp;nbsp; repository.ExistsByEmailAsync(&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;color: #A5D6FF;&quot; class=&quot;js_darkmode__143 js_darkmode__text__210&quot;&gt;&lt;span class=&quot;js_darkmode__text__211&quot;&gt;&amp;quot;test@example.com&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;js_darkmode__text__212&quot;&gt;, Arg.Any&amp;lt;CancellationToken&amp;gt;())&lt;/span&gt;&lt;br style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);&quot; class=&quot;js_darkmode__144&quot;/&gt;&lt;span class=&quot;js_darkmode__text__213&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; .Returns(&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;color: #79C0FF;&quot; class=&quot;js_darkmode__145 js_darkmode__text__214&quot;&gt;&lt;span class=&quot;js_darkmode__text__215&quot;&gt;true&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;js_darkmode__text__216&quot;&gt;);&lt;/span&gt;&lt;br style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);&quot; class=&quot;js_darkmode__146&quot;/&gt;&lt;br style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);&quot; class=&quot;js_darkmode__147&quot;/&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;color: #FF7B72;&quot; class=&quot;js_darkmode__148 js_darkmode__text__217&quot;&gt;&lt;span class=&quot;js_darkmode__text__218&quot;&gt;var&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;js_darkmode__text__219&quot;&gt;&amp;nbsp;handler =&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;color: #FF7B72;&quot; class=&quot;js_darkmode__149 js_darkmode__text__220&quot;&gt;&lt;span class=&quot;js_darkmode__text__221&quot;&gt;new&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;js_darkmode__text__222&quot;&gt;&amp;nbsp;RegisterUserHandler(repository);&lt;/span&gt;&lt;br style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);&quot; class=&quot;js_darkmode__150&quot;/&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;color: #FF7B72;&quot; class=&quot;js_darkmode__151 js_darkmode__text__223&quot;&gt;&lt;span class=&quot;js_darkmode__text__224&quot;&gt;var&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;js_darkmode__text__225&quot;&gt;&amp;nbsp;command =&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;color: #FF7B72;&quot; class=&quot;js_darkmode__152 js_darkmode__text__226&quot;&gt;&lt;span class=&quot;js_darkmode__text__227&quot;&gt;new&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;js_darkmode__text__228&quot;&gt;&amp;nbsp;RegisterUserCommand(&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;color: #A5D6FF;&quot; class=&quot;js_darkmode__153 js_darkmode__text__229&quot;&gt;&lt;span class=&quot;js_darkmode__text__230&quot;&gt;&amp;quot;test@example.com&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;js_darkmode__text__231&quot;&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;color: #A5D6FF;&quot; class=&quot;js_darkmode__154 js_darkmode__text__232&quot;&gt;&lt;span class=&quot;js_darkmode__text__233&quot;&gt;&amp;quot;StrongPassword123!&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;js_darkmode__text__234&quot;&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;color: #A5D6FF;&quot; class=&quot;js_darkmode__155 js_darkmode__text__235&quot;&gt;&lt;span class=&quot;js_darkmode__text__236&quot;&gt;&amp;quot;Test&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;js_darkmode__text__237&quot;&gt;);&lt;/span&gt;&lt;br style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);&quot; class=&quot;js_darkmode__156&quot;/&gt;&lt;br style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);&quot; class=&quot;js_darkmode__157&quot;/&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;color: #FF7B72;&quot; class=&quot;js_darkmode__158 js_darkmode__text__238&quot;&gt;&lt;span class=&quot;js_darkmode__text__239&quot;&gt;var&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;js_darkmode__text__240&quot;&gt;&amp;nbsp;result =&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;color: #FF7B72;&quot; class=&quot;js_darkmode__159 js_darkmode__text__241&quot;&gt;&lt;span class=&quot;js_darkmode__text__242&quot;&gt;await&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;js_darkmode__text__243&quot;&gt;&amp;nbsp;handler.Handle(command, CancellationToken.None);&lt;/span&gt;&lt;br style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);&quot; class=&quot;js_darkmode__160&quot;/&gt;&lt;br style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);&quot; class=&quot;js_darkmode__161&quot;/&gt;&lt;span class=&quot;js_darkmode__text__244&quot;&gt;&amp;nbsp; &amp;nbsp; result.Status.Should().Be(ResultStatus.Conflict);&lt;/span&gt;&lt;br style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);&quot; class=&quot;js_darkmode__162&quot;/&gt;&lt;span class=&quot;js_darkmode__text__245&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-size: 16.8px;font-weight: bold;margin: 4em auto 2em;text-align: center;line-height: 1.75;font-family: -apple-system-font, BlinkMacSystemFont, &amp;quot;Helvetica Neue&amp;quot;, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei UI&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, Arial, sans-serif;display: table;padding: 0px 0.2em;color: rgb(255, 255, 255);background: rgb(15, 76, 129);&quot; class=&quot;js_darkmode__163 js_darkmode__text__246&quot;&gt;&lt;span class=&quot;js_darkmode__text__247&quot;&gt;Prompt 也是团队工程资产&lt;/span&gt;&lt;/h2&gt;&lt;p style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);margin: 1.5em 8px;text-align: justify;line-height: 1.75;font-family: -apple-system-font, BlinkMacSystemFont, &amp;quot;Helvetica Neue&amp;quot;, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei UI&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, Arial, sans-serif;font-size: 14px;letter-spacing: 0.1em;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__164 js_darkmode__text__248&quot;&gt;&lt;span class=&quot;js_darkmode__text__249&quot;&gt;对个人来说，Prompt 可以临时写。对团队来说，常用 Prompt 应该像代码模板一样沉淀下来。比如“新增 CRUD 模块”“新增后台任务”“新增集成测试”“重构 Controller 到 Minimal API”，都可以形成固定格式。&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);margin: 1.5em 8px;text-align: justify;line-height: 1.75;font-family: -apple-system-font, BlinkMacSystemFont, &amp;quot;Helvetica Neue&amp;quot;, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei UI&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, Arial, sans-serif;font-size: 14px;letter-spacing: 0.1em;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__165 js_darkmode__text__250&quot;&gt;&lt;span class=&quot;js_darkmode__text__251&quot;&gt;好的 .NET Prompt 不追求华丽措辞，而是把真实工程约束告诉 AI：项目怎么分层、依赖怎么注入、错误怎么返回、测试怎么验证、哪些文件不能碰。越接近开发任务单，生成结果越可控。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Tue, 14 Jul 2026 09:21:24 +0800</pubDate></item><item><title>Windows .NET生产环境高可用：NLB的工程价值与边界</title><link>https://www.codepub.top/post/626.html</link><description>&lt;p style=&quot;;margin: 1em 0;color: #3e3e3e;text-align:left;letter-spacing:normal;word-spacing:normal&quot; class=&quot;js_darkmode__1 js_darkmode__text__1&quot;&gt;&lt;span style=&quot;word-spacing: normal&quot;&gt;很多.NET团队做高可用，第一反应是上Nginx或云厂商的ALB，往往忽略了Windows Server自带的&lt;span class=&quot;&quot;&gt;NLB&lt;/span&gt;。NLB不需要额外买软件，不用改代码，在Windows生态里开箱即用。但它也有明显的局限——不检测应用健康、网络配置稍有不慎就翻车。这篇把NLB是什么、怎么接、适合谁、坑在哪说清楚，帮你快速判断它值不值得用。&lt;/span&gt;&lt;br/&gt;&lt;/p&gt;&lt;h2 style=&quot;font-size: 1.3em;font-weight: bold;color: #000;margin: 1.6em 0 .8em;padding: 0 0 6px;border-bottom: 1px solid #e7e7e7;line-height: 1.45;text-align:left;letter-spacing:normal;word-spacing:normal&quot; class=&quot;js_darkmode__2 js_darkmode__text__3&quot;&gt;NLB 是什么&lt;/h2&gt;&lt;p style=&quot;;margin: 1em 0;color: #3e3e3e;text-align:left;letter-spacing:normal;word-spacing:normal&quot; class=&quot;js_darkmode__3 js_darkmode__text__5&quot;&gt;NLB（Network Load Balancing）是Windows Server操作系统内置的网络负载均衡功能。它工作在传输层（第四层），基于TCP/IP协议将客户端请求分发到集群中的多台服务器上。NLB集群对外暴露一个虚拟IP地址（VIP），客户端访问这个VIP，NLB根据配置的端口规则将流量转发到集群内某台真实服务器。&lt;/p&gt;&lt;p style=&quot;;margin: 1em 0;color: #3e3e3e;text-align:left;letter-spacing:normal;word-spacing:normal&quot; class=&quot;js_darkmode__4 js_darkmode__text__7&quot;&gt;官网：&lt;/p&gt;&lt;p&gt;&lt;section class=&quot;code-snippet__fix code-snippet__js js_darkmode__text__9&quot;&gt;&lt;ul class=&quot;code-snippet__line-index code-snippet__js list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;pre class=&quot;code-snippet__js js_darkmode__text__10&quot; data-lang=&quot;javascript&quot;&gt;https://learn.microsoft.com/en-us/windows-server/networking/technologies/network-load-balancing&lt;/pre&gt;&lt;/section&gt;&lt;section style=&quot;text-align: center&quot;&gt;&lt;img class=&quot;rich_pages wxw-img&quot; data-aistatus=&quot;1&quot; data-imgfileid=&quot;100001571&quot; data-s=&quot;300,640&quot; data-type=&quot;png&quot; type=&quot;block&quot; style=&quot;height: auto !important;visibility: visible !important;width: 677px !important&quot; data-ratio=&quot;0.46944444444444444&quot; data-w=&quot;1080&quot; data-src=&quot;https://mmbiz.qpic.cn/mmbiz_png/pJbk7dGRBW4ULNvfARCicCgW5zDV6nEIKnobFrDxBAfdHl3pdpf9YROicqiawu1TIjjslQuzA7AqS712s5R3JpgX1lpZqLbJxfpc4k9sNoy9DQ/640?wx_fmt=png&amp;amp;from=appmsg&amp;amp;watermark=1#imgIndex=0&quot; data-original-style=&quot;height: auto !important;&quot; data-index=&quot;0&quot; src=&quot;https://mmbiz.qpic.cn/mmbiz_png/pJbk7dGRBW4ULNvfARCicCgW5zDV6nEIKnobFrDxBAfdHl3pdpf9YROicqiawu1TIjjslQuzA7AqS712s5R3JpgX1lpZqLbJxfpc4k9sNoy9DQ/640?wx_fmt=png&amp;from=appmsg&amp;wxfrom=13&amp;tp=wxpic&amp;watermark=1#imgIndex=0&quot; _width=&quot;677px&quot; __sec_open_place_holder__=&quot;true&quot; data-sec-load-status=&quot;2&quot; data-report-img-idx=&quot;0&quot; alt=&quot;图片&quot;/&gt;&lt;/section&gt;&lt;/p&gt;&lt;p style=&quot;;margin: 1em 0;color: #3e3e3e;text-align:left;letter-spacing:normal;word-spacing:normal&quot; class=&quot;js_darkmode__5 js_darkmode__text__15&quot;&gt;GitHub（PowerShell模块文档）：&lt;/p&gt;&lt;p&gt;&lt;section class=&quot;code-snippet__fix code-snippet__js js_darkmode__text__17&quot;&gt;&lt;ul class=&quot;code-snippet__line-index code-snippet__js list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;pre class=&quot;code-snippet__js js_darkmode__text__18&quot; data-lang=&quot;bash&quot;&gt;https://github.com/MicrosoftDocs/windows-powershell-docs/tree/main/docset/winserver2025-ps/NetworkLoadBalancingClusters&lt;/pre&gt;&lt;/section&gt;&lt;section style=&quot;text-align: center&quot;&gt;&lt;img class=&quot;rich_pages wxw-img&quot; data-aistatus=&quot;1&quot; data-imgfileid=&quot;100001573&quot; data-s=&quot;300,640&quot; data-type=&quot;png&quot; type=&quot;block&quot; style=&quot;height: auto !important;visibility: visible !important;width: 677px !important&quot; data-ratio=&quot;0.46944444444444444&quot; data-w=&quot;1080&quot; data-src=&quot;https://mmbiz.qpic.cn/sz_mmbiz_png/pJbk7dGRBW61XoKrR1Aesk0Tqn6KribDic8fZIovwicwwQlQxNttzVwJTW3GYtwxb4ueVysgIvQ1FdhdT1Y7rGNAKCDPLnGUkNB1GKOiaVmbicU4/640?wx_fmt=png&amp;amp;from=appmsg&amp;amp;watermark=1#imgIndex=1&quot; data-original-style=&quot;height: auto !important;&quot; data-index=&quot;1&quot; src=&quot;https://mmbiz.qpic.cn/sz_mmbiz_png/pJbk7dGRBW61XoKrR1Aesk0Tqn6KribDic8fZIovwicwwQlQxNttzVwJTW3GYtwxb4ueVysgIvQ1FdhdT1Y7rGNAKCDPLnGUkNB1GKOiaVmbicU4/640?wx_fmt=png&amp;from=appmsg&amp;wxfrom=13&amp;tp=wxpic&amp;watermark=1#imgIndex=1&quot; _width=&quot;677px&quot; __sec_open_place_holder__=&quot;true&quot; data-sec-load-status=&quot;2&quot; data-report-img-idx=&quot;1&quot; alt=&quot;图片&quot;/&gt;&lt;/section&gt;&lt;/p&gt;&lt;p style=&quot;;margin: 1em 0;color: #3e3e3e;text-align:left;letter-spacing:normal;word-spacing:normal&quot; class=&quot;js_darkmode__6 js_darkmode__text__21&quot;&gt;核心机制与工程价值：&lt;/p&gt;&lt;ul style=&quot;margin: 1em 0;padding-left: 1.6em&quot; class=&quot;js_darkmode__text__23 list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;strong style=&quot;color: #000;font-weight: bold;white-space: nowrap;display:inline;font-weight:bold&quot; class=&quot;js_darkmode__8 js_darkmode__text__25&quot;&gt;集群化流量分发：&lt;/strong&gt;&lt;/p&gt;&lt;section&gt;&amp;nbsp;最多支持32台服务器组成一个NLB集群，所有节点共享同一个虚拟IP。客户端感知不到后端有多台服务器，集群表现为一个逻辑节点。&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong style=&quot;color: #000;font-weight: bold;white-space: nowrap;display:inline;font-weight:bold&quot; class=&quot;js_darkmode__10 js_darkmode__text__30&quot;&gt;故障自动剔除：&lt;/strong&gt;&lt;/p&gt;&lt;section&gt;&amp;nbsp;NLB节点之间通过心跳检测（默认每秒一个心跳包）判断彼此存活状态。节点离线后，流量在数秒内自动重新分发到其他节点。但要注意：NLB只检测节点是否在线，不检测应用程序是否正常工作——IIS停了，NLB照常把请求发过去。&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong style=&quot;color: #000;font-weight: bold;white-space: nowrap;display:inline;font-weight:bold&quot; class=&quot;js_darkmode__12 js_darkmode__text__35&quot;&gt;三种运行模式：&lt;/strong&gt;&lt;/p&gt;&lt;section&gt;&amp;nbsp;单播（Unicast）、多播（Multicast）、&lt;span class=&quot;&quot;&gt;IGMP多播&lt;/span&gt;。单播配置最简单但可能导致交换机洪泛；多播和IGMP多播对带宽利用更友好，但需要网络设备支持静态ARP或IGMP Snooping。集群内所有节点必须使用同一种模式。&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong style=&quot;color: #000;font-weight: bold;white-space: nowrap;display:inline;font-weight:bold&quot; class=&quot;js_darkmode__14 js_darkmode__text__40&quot;&gt;无需改代码：&lt;/strong&gt;&lt;/p&gt;&lt;section&gt;&amp;nbsp;NLB工作在操作系统层面，应用本身不需要任何改造——这对遗留.NET Framework应用尤其友好。&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong style=&quot;color: #000;font-weight: bold;white-space: nowrap;display:inline;font-weight:bold&quot; class=&quot;js_darkmode__16 js_darkmode__text__45&quot;&gt;运维成本低：&lt;/strong&gt;&lt;/p&gt;&lt;section&gt;&amp;nbsp;通过Windows Server的“网络负载平衡管理器”或PowerShell的&lt;code style=&quot;background: #f5f5f5;color: #c7254e;padding: 2px 5px;border-radius: 3px;font-size: .9em;font-family: Consolas,Menlo,monospace;white-space:nowrap;word-spacing:normal;letter-spacing:normal;display:inline-block;max-width:100%;overflow-x:auto;vertical-align:middle;-webkit-overflow-scrolling:touch&quot; class=&quot;js_darkmode__17 js_darkmode__text__49&quot;&gt;NetworkLoadBalancingClusters&lt;/code&gt;模块管理，Windows运维人员上手成本低。&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong style=&quot;color: #000;font-weight: bold;white-space: nowrap;display:inline;font-weight:bold&quot; class=&quot;js_darkmode__19 js_darkmode__text__53&quot;&gt;支持非HTTP协议：&lt;/strong&gt;&lt;/p&gt;&lt;section&gt;&amp;nbsp;NLB工作在四层，不仅能负载均衡IIS的HTTP/HTTPS流量，还能支持WCF服务、自定义TCP绑定的Windows服务、.NET Remoting甚至FTP服务。这些老项目往往没有现成的七层代理方案，NLB几乎是唯一不改代码就能实现高可用的路径。&lt;/section&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2 style=&quot;font-size: 1.3em;font-weight: bold;color: #000;margin: 1.6em 0 .8em;padding: 0 0 6px;border-bottom: 1px solid #e7e7e7;line-height: 1.45;text-align:left;letter-spacing:normal;word-spacing:normal&quot; class=&quot;js_darkmode__20 js_darkmode__text__57&quot;&gt;怎么引入&lt;/h2&gt;&lt;p style=&quot;;margin: 1em 0;color: #3e3e3e;text-align:left;letter-spacing:normal;word-spacing:normal&quot; class=&quot;js_darkmode__21 js_darkmode__text__59&quot;&gt;NLB是Windows Server功能，不需要额外下载安装包。在每台要加入集群的服务器上通过服务器管理器添加角色和功能，勾选“网络负载平衡”即可。&lt;/p&gt;&lt;h3 style=&quot;font-size: 1.15em;font-weight: bold;color: #333;margin: 1.4em 0 .6em;text-align:left;letter-spacing:normal;word-spacing:normal&quot; class=&quot;js_darkmode__22 js_darkmode__text__61&quot;&gt;PowerShell脚本接入方式（适合批量自动化部署）&lt;/h3&gt;&lt;p style=&quot;;margin: 1em 0;color: #3e3e3e;text-align:left;letter-spacing:normal;word-spacing:normal&quot; class=&quot;js_darkmode__23 js_darkmode__text__63&quot;&gt;以下脚本在首台节点（WEB01）上执行，创建集群并添加第二台节点：&lt;/p&gt;&lt;pre style=&quot;background-color: #282c34;border-radius: 6px;padding: 14px 16px;margin: 1.2em 0;font-size: 13px;line-height: 1.6;hyphens: none;-webkit-hyphens: none;overflow-x: auto;overflow-x: auto;hyphens: none;-webkit-hyphens: none;margin: 1.2em 0;overflow-x: auto;hyphens: none;-webkit-hyphens: none;margin: 1.2em 0;max-width: 100%;-webkit-overflow-scrolling:touch;white-space:normal;word-spacing:normal;text-align:left;letter-spacing:0&quot; class=&quot;js_darkmode__24 js_darkmode__text__65&quot;&gt;&lt;code style=&quot;white-space:pre-wrap;font-family: Consolas,Menlo,monospace;color: #abb2bf;background: transparent;padding: 0;hyphens: none;-webkit-hyphens: none;font-family: Consolas,Menlo,monospace;hyphens: none;-webkit-hyphens: none;background: transparent;padding: 0;display: block;width: max-content;min-width: 100%;font-family: Consolas,Menlo,monospace;letter-spacing: 0;word-wrap: normal;overflow-wrap: normal;hyphens: none;-webkit-hyphens: none;background: transparent;padding: 0;word-spacing:normal;line-height:1.6&quot;&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-spacing:normal;letter-spacing:0;color:#abb2bf&quot;&gt;# 1. 安装NLB功能（所有节点都需要执行，建议加上管理工具）&lt;/span&gt;&lt;br/&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-spacing:normal;letter-spacing:0&quot;&gt;Install-WindowsFeature -Name NLB -IncludeManagementTools&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-spacing:normal;letter-spacing:0;color:#abb2bf&quot;&gt;# 2. 在首台节点（WEB01）上创建集群&lt;/span&gt;&lt;br/&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-spacing:normal;letter-spacing:0;color:#abb2bf&quot;&gt;# -InterfaceName 需替换为实际网卡名称，可通过 Get-NetAdapter 查看&lt;/span&gt;&lt;br/&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-spacing:normal;letter-spacing:0;color:#c678dd&quot;&gt;New&lt;/span&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-spacing:normal;letter-spacing:0&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-spacing:normal;letter-spacing:0&quot;&gt;NlbCluster&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-spacing:normal;letter-spacing:0&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-spacing:normal;letter-spacing:0&quot;&gt;ClusterPrimaryIP &amp;quot;192.168.1.100&amp;quot; `&lt;/span&gt;&lt;br/&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-spacing:normal;letter-spacing:0&quot;&gt;&amp;nbsp; &amp;nbsp; -InterfaceName&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-spacing:normal;letter-spacing:0;color:#98c379&quot;&gt;&amp;quot;Ethernet&amp;quot;&lt;/span&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-spacing:normal;letter-spacing:0&quot;&gt;&amp;nbsp;`&lt;/span&gt;&lt;br/&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-spacing:normal;letter-spacing:0&quot;&gt;&amp;nbsp; &amp;nbsp; -OperationMode Unicast&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-spacing:normal;letter-spacing:0;color:#abb2bf&quot;&gt;# 3. 将默认的“所有端口（0-65535）”规则删掉&lt;/span&gt;&lt;br/&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-spacing:normal;letter-spacing:0;color:#abb2bf&quot;&gt;# NLB默认放行所有端口，生产环境建议精细化管理&lt;/span&gt;&lt;br/&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-spacing:normal;letter-spacing:0;color:#c678dd&quot;&gt;Get&lt;/span&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-spacing:normal;letter-spacing:0&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-spacing:normal;letter-spacing:0&quot;&gt;NlbClusterPortRule&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-spacing:normal;letter-spacing:0&quot;&gt;|&lt;/span&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-spacing:normal;letter-spacing:0&quot;&gt;&amp;nbsp;Remove&lt;/span&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-spacing:normal;letter-spacing:0&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-spacing:normal;letter-spacing:0&quot;&gt;NlbClusterPortRule&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-spacing:normal;letter-spacing:0&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-spacing:normal;letter-spacing:0&quot;&gt;Force&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-spacing:normal;letter-spacing:0;color:#abb2bf&quot;&gt;# 4. 精确添加80端口规则（利用管道规避ClusterName参数不存在的Bug）&lt;/span&gt;&lt;br/&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-spacing:normal;letter-spacing:0;color:#c678dd&quot;&gt;Get&lt;/span&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-spacing:normal;letter-spacing:0&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-spacing:normal;letter-spacing:0&quot;&gt;NlbCluster&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-spacing:normal;letter-spacing:0&quot;&gt;|&lt;/span&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-spacing:normal;letter-spacing:0;color:#c678dd&quot;&gt;Add&lt;/span&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-spacing:normal;letter-spacing:0&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-spacing:normal;letter-spacing:0&quot;&gt;NlbClusterPortRule&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-spacing:normal;letter-spacing:0&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-spacing:normal;letter-spacing:0&quot;&gt;StartPort&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-spacing:normal;letter-spacing:0;color:#d19a66&quot;&gt;80&lt;/span&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-spacing:normal;letter-spacing:0&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-spacing:normal;letter-spacing:0&quot;&gt;EndPort&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-spacing:normal;letter-spacing:0;color:#d19a66&quot;&gt;80&lt;/span&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-spacing:normal;letter-spacing:0&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-spacing:normal;letter-spacing:0&quot;&gt;Protocol TCP&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-spacing:normal;letter-spacing:0&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-spacing:normal;letter-spacing:0&quot;&gt;Affinity Single&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-spacing:normal;letter-spacing:0;color:#abb2bf&quot;&gt;# 5. 将第二台节点（WEB02）拉入集群&lt;/span&gt;&lt;br/&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-spacing:normal;letter-spacing:0;color:#abb2bf&quot;&gt;# -HostName 指定现有集群中的任一节点，-NewNodeName 指定新节点&lt;/span&gt;&lt;br/&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-spacing:normal;letter-spacing:0;color:#c678dd&quot;&gt;Add&lt;/span&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-spacing:normal;letter-spacing:0&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-spacing:normal;letter-spacing:0&quot;&gt;NlbClusterNode&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-spacing:normal;letter-spacing:0&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-spacing:normal;letter-spacing:0&quot;&gt;HostName &amp;quot;WEB01&amp;quot; `&lt;/span&gt;&lt;br/&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-spacing:normal;letter-spacing:0&quot;&gt;&amp;nbsp; &amp;nbsp; -NewNodeName&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-spacing:normal;letter-spacing:0;color:#98c379&quot;&gt;&amp;quot;WEB02&amp;quot;&lt;/span&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-spacing:normal;letter-spacing:0&quot;&gt;&amp;nbsp;`&lt;/span&gt;&lt;br/&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-spacing:normal;letter-spacing:0&quot;&gt;&amp;nbsp; &amp;nbsp; -NewNodeInterface&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-spacing:normal;letter-spacing:0;color:#98c379&quot;&gt;&amp;quot;Ethernet&amp;quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p style=&quot;;margin: 1em 0;color: #3e3e3e;text-align:left;letter-spacing:normal;word-spacing:normal&quot; class=&quot;js_darkmode__25 js_darkmode__text__175&quot;&gt;图形化和脚本方式可混用——界面上创建的集群同样可以通过PowerShell管理，反之亦然。两种方式选择取决于团队习惯：少量服务器、临时测试用图形界面更直观；大批量部署或自动化运维场景建议优先脚本。&lt;/p&gt;&lt;p style=&quot;;margin: 1em 0;color: #3e3e3e;text-align:left;letter-spacing:normal;word-spacing:normal&quot; class=&quot;js_darkmode__26 js_darkmode__text__177&quot;&gt;&lt;strong style=&quot;color: #000;font-weight: bold;display:inline;font-weight:bold&quot; class=&quot;js_darkmode__27 js_darkmode__text__178&quot;&gt;必须项：&lt;/strong&gt;&lt;/p&gt;&lt;ul style=&quot;margin: 1em 0;padding-left: 1.6em&quot; class=&quot;js_darkmode__text__180 list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;section&gt;每台节点的NLB功能已安装&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section&gt;每台节点配置静态IP（不能用DHCP）&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section&gt;集群虚拟IP与节点真实IP在同一子网&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section&gt;所有节点操作系统版本一致（跨版本混用存在兼容性风险）&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section&gt;集群内所有节点使用相同的操作模式&lt;/section&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p style=&quot;;margin: 1em 0;color: #3e3e3e;text-align:left;letter-spacing:normal;word-spacing:normal&quot; class=&quot;js_darkmode__33 js_darkmode__text__196&quot;&gt;&lt;strong style=&quot;color: #000;font-weight: bold;display:inline;font-weight:bold&quot; class=&quot;js_darkmode__34 js_darkmode__text__197&quot;&gt;可选项：&lt;/strong&gt;&lt;/p&gt;&lt;ul style=&quot;margin: 1em 0;padding-left: 1.6em&quot; class=&quot;js_darkmode__text__199 list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;section&gt;双网卡：建议业务网卡和NLB心跳通信使用不同网卡&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section&gt;IGMP多播模式：如果交换机支持&lt;span class=&quot;&quot;&gt;IGMP Snooping&lt;/span&gt;，可考虑启用&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section&gt;Drainstop：节点下线前先用&lt;code style=&quot;background: #f5f5f5;color: #c7254e;padding: 2px 5px;border-radius: 3px;font-size: .9em;font-family: Consolas,Menlo,monospace;white-space:nowrap;word-spacing:normal;letter-spacing:normal;display:inline-block;max-width:100%;overflow-x:auto;vertical-align:middle;-webkit-overflow-scrolling:touch&quot; class=&quot;js_darkmode__38 js_darkmode__text__209&quot;&gt;Drainstop&lt;/code&gt;排空现有连接，避免连接中断&lt;/section&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p style=&quot;;margin: 1em 0;color: #3e3e3e;text-align:left;letter-spacing:normal;word-spacing:normal&quot; class=&quot;js_darkmode__39 js_darkmode__text__212&quot;&gt;&lt;strong style=&quot;color: #000;font-weight: bold;display:inline;font-weight:bold&quot; class=&quot;js_darkmode__40 js_darkmode__text__213&quot;&gt;验证是否接入成功：&lt;/strong&gt;&lt;/p&gt;&lt;ol style=&quot;margin: 1em 0;padding-left: 1.6em&quot; class=&quot;js_darkmode__text__215 list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;section&gt;打开“网络负载平衡管理器”，确认所有节点状态为“已聚合”（绿色对勾）&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section&gt;从客户端ping集群虚拟IP，确认可达&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section&gt;访问集群VIP上的服务（如HTTP），确认能正常返回&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section&gt;手动停止其中一台节点的NLB服务（管理器右键节点 → “停止”，或&lt;code style=&quot;background: #f5f5f5;color: #c7254e;padding: 2px 5px;border-radius: 3px;font-size: .9em;font-family: Consolas,Menlo,monospace;white-space:nowrap;word-spacing:normal;letter-spacing:normal;display:inline-block;max-width:100%;overflow-x:auto;vertical-align:middle;-webkit-overflow-scrolling:touch&quot; class=&quot;js_darkmode__45 js_darkmode__text__228&quot;&gt;Stop-NlbClusterNode -NodeName WEB01&lt;/code&gt;），观察流量是否在数秒内切换到其他节点&lt;/section&gt;&lt;/li&gt;&lt;/ol&gt;&lt;h2 style=&quot;font-size: 1.3em;font-weight: bold;color: #000;margin: 1.6em 0 .8em;padding: 0 0 6px;border-bottom: 1px solid #e7e7e7;line-height: 1.45;text-align:left;letter-spacing:normal;word-spacing:normal;&quot; class=&quot;js_darkmode__46 js_darkmode__text__231&quot;&gt;&lt;span class=&quot;js_darkmode__text__232&quot;&gt;快速上手&lt;/span&gt;&lt;/h2&gt;&lt;h3 style=&quot;font-size: 1.15em;font-weight: bold;color: #333;margin: 1.4em 0 .6em;text-align:left;letter-spacing:normal;word-spacing:normal;&quot; class=&quot;js_darkmode__47 js_darkmode__text__233&quot;&gt;&lt;span class=&quot;js_darkmode__text__234&quot;&gt;示例1：最小可用接入——两台IIS服务器构成NLB集群&lt;/span&gt;&lt;/h3&gt;&lt;p style=&quot;word-break: break-word;margin: 1em 0;color: #3e3e3e;text-align:left;letter-spacing:normal;word-spacing:normal;&quot; class=&quot;js_darkmode__48 js_darkmode__text__235&quot;&gt;&lt;span class=&quot;js_darkmode__text__236&quot;&gt;目标：两台Windows Server（WEB01、WEB02）上部署相同的IIS站点，通过NLB集群VIP对外提供服务。&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;word-break: break-word;margin: 1em 0;color: #3e3e3e;text-align:left;letter-spacing:normal;word-spacing:normal;&quot; class=&quot;js_darkmode__49 js_darkmode__text__237&quot;&gt;&lt;span class=&quot;js_darkmode__text__238&quot;&gt;前置条件：两台服务器已安装IIS，站点内容已同步（可用DFS或手动复制）。&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;word-break: break-word;margin: 1em 0;color: #3e3e3e;text-align:left;letter-spacing:normal;word-spacing:normal;&quot; class=&quot;js_darkmode__50 js_darkmode__text__239&quot;&gt;&lt;strong style=&quot;color: #000;font-weight: bold;display:inline;font-weight:bold;&quot; class=&quot;js_darkmode__51 js_darkmode__text__240&quot;&gt;&lt;span class=&quot;js_darkmode__text__241&quot;&gt;PowerShell配置&lt;/span&gt;&lt;/strong&gt;&lt;span class=&quot;js_darkmode__text__242&quot;&gt;（在WEB01上执行）：&lt;/span&gt;&lt;/p&gt;&lt;pre style=&quot;background-color: #282c34;border-radius: 6px;padding: 14px 16px;margin: 1.2em 0;font-size: 13px;line-height: 1.6;hyphens: none;-webkit-hyphens: none;overflow-x: auto;overflow-x: auto;hyphens: none;-webkit-hyphens: none;margin: 1.2em 0;overflow-x: auto;hyphens: none;-webkit-hyphens: none;tab-size: 4;margin: 1.2em 0;max-width: 100%;-webkit-overflow-scrolling:touch;white-space:normal;word-break:normal;word-spacing:normal;text-align:left;letter-spacing:0;&quot; class=&quot;js_darkmode__52 js_darkmode__text__243&quot;&gt;&lt;code style=&quot;white-space:pre-wrap;font-family: Consolas,Menlo,monospace;color: #abb2bf;background: transparent;padding: 0;hyphens: none;-webkit-hyphens: none;font-family: Consolas,Menlo,monospace;hyphens: none;-webkit-hyphens: none;background: transparent;padding: 0;display: block;width: max-content;min-width: 100%;font-family: Consolas,Menlo,monospace;letter-spacing: 0;word-break: normal;word-wrap: normal;overflow-wrap: normal;hyphens: none;-webkit-hyphens: none;background: transparent;padding: 0;margin:0;word-spacing:normal;line-height:1.6;&quot; class=&quot;js_darkmode__text__244&quot;&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;color:#abb2bf;&quot; class=&quot;js_darkmode__text__245&quot;&gt;&lt;span class=&quot;js_darkmode__text__246&quot;&gt;# 在WEB01和WEB02上分别安装NLB&lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;&quot; class=&quot;js_darkmode__text__247&quot;&gt;&lt;span class=&quot;js_darkmode__text__248&quot;&gt;Install-WindowsFeature -Name NLB -IncludeManagementTools&lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;color:#abb2bf;&quot; class=&quot;js_darkmode__text__249&quot;&gt;&lt;span class=&quot;js_darkmode__text__250&quot;&gt;# WEB01上创建集群，VIP为192.168.1.100&lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;color:#c678dd;&quot; class=&quot;js_darkmode__text__251&quot;&gt;&lt;span class=&quot;js_darkmode__text__252&quot;&gt;New&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;&quot; class=&quot;js_darkmode__text__253&quot;&gt;&lt;span class=&quot;js_darkmode__text__254&quot;&gt;-&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;&quot; class=&quot;js_darkmode__text__255&quot;&gt;&lt;span class=&quot;js_darkmode__text__256&quot;&gt;NlbCluster&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;&quot; class=&quot;js_darkmode__text__257&quot;&gt;&lt;span class=&quot;js_darkmode__text__258&quot;&gt;-&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;&quot; class=&quot;js_darkmode__text__259&quot;&gt;&lt;span class=&quot;js_darkmode__text__260&quot;&gt;ClusterPrimaryIP &amp;quot;192.168.1.100&amp;quot; `&lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;&quot; class=&quot;js_darkmode__text__261&quot;&gt;&lt;span class=&quot;js_darkmode__text__262&quot;&gt;&amp;nbsp; &amp;nbsp; -InterfaceName&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;color:#98c379;&quot; class=&quot;js_darkmode__text__263&quot;&gt;&lt;span class=&quot;js_darkmode__text__264&quot;&gt;&amp;quot;Ethernet&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;&quot; class=&quot;js_darkmode__text__265&quot;&gt;&lt;span class=&quot;js_darkmode__text__266&quot;&gt;&amp;nbsp;`&lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;&quot; class=&quot;js_darkmode__text__267&quot;&gt;&lt;span class=&quot;js_darkmode__text__268&quot;&gt;&amp;nbsp; &amp;nbsp; -OperationMode Unicast&lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;color:#abb2bf;&quot; class=&quot;js_darkmode__text__269&quot;&gt;&lt;span class=&quot;js_darkmode__text__270&quot;&gt;# 删除默认端口规则&lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;color:#c678dd;&quot; class=&quot;js_darkmode__text__271&quot;&gt;&lt;span class=&quot;js_darkmode__text__272&quot;&gt;Get&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;&quot; class=&quot;js_darkmode__text__273&quot;&gt;&lt;span class=&quot;js_darkmode__text__274&quot;&gt;-&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;&quot; class=&quot;js_darkmode__text__275&quot;&gt;&lt;span class=&quot;js_darkmode__text__276&quot;&gt;NlbClusterPortRule&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;&quot; class=&quot;js_darkmode__text__277&quot;&gt;&lt;span class=&quot;js_darkmode__text__278&quot;&gt;|&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;&quot; class=&quot;js_darkmode__text__279&quot;&gt;&lt;span class=&quot;js_darkmode__text__280&quot;&gt;&amp;nbsp;Remove&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;&quot; class=&quot;js_darkmode__text__281&quot;&gt;&lt;span class=&quot;js_darkmode__text__282&quot;&gt;-&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;&quot; class=&quot;js_darkmode__text__283&quot;&gt;&lt;span class=&quot;js_darkmode__text__284&quot;&gt;NlbClusterPortRule&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;&quot; class=&quot;js_darkmode__text__285&quot;&gt;&lt;span class=&quot;js_darkmode__text__286&quot;&gt;-&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;&quot; class=&quot;js_darkmode__text__287&quot;&gt;&lt;span class=&quot;js_darkmode__text__288&quot;&gt;Force&lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;color:#abb2bf;&quot; class=&quot;js_darkmode__text__289&quot;&gt;&lt;span class=&quot;js_darkmode__text__290&quot;&gt;# 添加80端口规则&lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;color:#c678dd;&quot; class=&quot;js_darkmode__text__291&quot;&gt;&lt;span class=&quot;js_darkmode__text__292&quot;&gt;Get&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;&quot; class=&quot;js_darkmode__text__293&quot;&gt;&lt;span class=&quot;js_darkmode__text__294&quot;&gt;-&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;&quot; class=&quot;js_darkmode__text__295&quot;&gt;&lt;span class=&quot;js_darkmode__text__296&quot;&gt;NlbCluster&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;&quot; class=&quot;js_darkmode__text__297&quot;&gt;&lt;span class=&quot;js_darkmode__text__298&quot;&gt;|&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;color:#c678dd;&quot; class=&quot;js_darkmode__text__299&quot;&gt;&lt;span class=&quot;js_darkmode__text__300&quot;&gt;Add&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;&quot; class=&quot;js_darkmode__text__301&quot;&gt;&lt;span class=&quot;js_darkmode__text__302&quot;&gt;-&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;&quot; class=&quot;js_darkmode__text__303&quot;&gt;&lt;span class=&quot;js_darkmode__text__304&quot;&gt;NlbClusterPortRule&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;&quot; class=&quot;js_darkmode__text__305&quot;&gt;&lt;span class=&quot;js_darkmode__text__306&quot;&gt;-&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;&quot; class=&quot;js_darkmode__text__307&quot;&gt;&lt;span class=&quot;js_darkmode__text__308&quot;&gt;StartPort&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;color:#d19a66;&quot; class=&quot;js_darkmode__text__309&quot;&gt;&lt;span class=&quot;js_darkmode__text__310&quot;&gt;80&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;&quot; class=&quot;js_darkmode__text__311&quot;&gt;&lt;span class=&quot;js_darkmode__text__312&quot;&gt;-&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;&quot; class=&quot;js_darkmode__text__313&quot;&gt;&lt;span class=&quot;js_darkmode__text__314&quot;&gt;EndPort&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;color:#d19a66;&quot; class=&quot;js_darkmode__text__315&quot;&gt;&lt;span class=&quot;js_darkmode__text__316&quot;&gt;80&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;&quot; class=&quot;js_darkmode__text__317&quot;&gt;&lt;span class=&quot;js_darkmode__text__318&quot;&gt;-&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;&quot; class=&quot;js_darkmode__text__319&quot;&gt;&lt;span class=&quot;js_darkmode__text__320&quot;&gt;Protocol TCP&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;&quot; class=&quot;js_darkmode__text__321&quot;&gt;&lt;span class=&quot;js_darkmode__text__322&quot;&gt;-&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;&quot; class=&quot;js_darkmode__text__323&quot;&gt;&lt;span class=&quot;js_darkmode__text__324&quot;&gt;Affinity Single&lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;color:#abb2bf;&quot; class=&quot;js_darkmode__text__325&quot;&gt;&lt;span class=&quot;js_darkmode__text__326&quot;&gt;# 添加WEB02到集群&lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;color:#c678dd;&quot; class=&quot;js_darkmode__text__327&quot;&gt;&lt;span class=&quot;js_darkmode__text__328&quot;&gt;Add&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;&quot; class=&quot;js_darkmode__text__329&quot;&gt;&lt;span class=&quot;js_darkmode__text__330&quot;&gt;-&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;&quot; class=&quot;js_darkmode__text__331&quot;&gt;&lt;span class=&quot;js_darkmode__text__332&quot;&gt;NlbClusterNode&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;&quot; class=&quot;js_darkmode__text__333&quot;&gt;&lt;span class=&quot;js_darkmode__text__334&quot;&gt;-&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;&quot; class=&quot;js_darkmode__text__335&quot;&gt;&lt;span class=&quot;js_darkmode__text__336&quot;&gt;HostName &amp;quot;WEB01&amp;quot; `&lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;&quot; class=&quot;js_darkmode__text__337&quot;&gt;&lt;span class=&quot;js_darkmode__text__338&quot;&gt;&amp;nbsp; &amp;nbsp; -NewNodeName&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;color:#98c379;&quot; class=&quot;js_darkmode__text__339&quot;&gt;&lt;span class=&quot;js_darkmode__text__340&quot;&gt;&amp;quot;WEB02&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;&quot; class=&quot;js_darkmode__text__341&quot;&gt;&lt;span class=&quot;js_darkmode__text__342&quot;&gt;&amp;nbsp;`&lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;&quot; class=&quot;js_darkmode__text__343&quot;&gt;&lt;span class=&quot;js_darkmode__text__344&quot;&gt;&amp;nbsp; &amp;nbsp; -NewNodeInterface&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;color:#98c379;&quot; class=&quot;js_darkmode__text__345&quot;&gt;&lt;span class=&quot;js_darkmode__text__346&quot;&gt;&amp;quot;Ethernet&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p style=&quot;word-break: break-word;margin: 1em 0;color: #3e3e3e;text-align:left;letter-spacing:normal;word-spacing:normal;&quot; class=&quot;js_darkmode__53 js_darkmode__text__347&quot;&gt;&lt;span class=&quot;js_darkmode__text__348&quot;&gt;预期输出：NLB管理器显示两个节点状态均为“已聚合”。客户端访问&lt;/span&gt;&lt;code style=&quot;background: #f5f5f5;color: #c7254e;padding: 2px 5px;border-radius: 3px;font-size: .9em;font-family: Consolas,Menlo,monospace;white-space:nowrap;word-break:normal;word-spacing:normal;letter-spacing:normal;display:inline-block;max-width:100%;overflow-x:auto;vertical-align:middle;-webkit-overflow-scrolling:touch;&quot; class=&quot;js_darkmode__54 js_darkmode__text__349&quot;&gt;&lt;span class=&quot;js_darkmode__text__350&quot;&gt;http://192.168.1.100&lt;/span&gt;&lt;/code&gt;&lt;span class=&quot;js_darkmode__text__351&quot;&gt;能看到站点页面。&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;word-break: break-word;margin: 1em 0;color: #3e3e3e;text-align:left;letter-spacing:normal;word-spacing:normal;&quot; class=&quot;js_darkmode__55 js_darkmode__text__352&quot;&gt;&lt;strong style=&quot;color: #000;font-weight: bold;display:inline;font-weight:bold;&quot; class=&quot;js_darkmode__56 js_darkmode__text__353&quot;&gt;&lt;span class=&quot;js_darkmode__text__354&quot;&gt;验证步骤：&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;ol style=&quot;margin: 1em 0;padding-left: 1.6em;&quot; class=&quot;js_darkmode__text__355 list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;section class=&quot;js_darkmode__text__357&quot;&gt;&lt;span class=&quot;js_darkmode__text__358&quot;&gt;访问VIP，确认页面正常返回&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section class=&quot;js_darkmode__text__360&quot;&gt;&lt;span class=&quot;js_darkmode__text__361&quot;&gt;停止WEB01的NLB服务（管理器右键节点 → “停止”，或&lt;/span&gt;&lt;code style=&quot;background: #f5f5f5;color: #c7254e;padding: 2px 5px;border-radius: 3px;font-size: .9em;font-family: Consolas,Menlo,monospace;white-space:nowrap;word-break:normal;word-spacing:normal;letter-spacing:normal;display:inline-block;max-width:100%;overflow-x:auto;vertical-align:middle;-webkit-overflow-scrolling:touch;&quot; class=&quot;js_darkmode__59 js_darkmode__text__362&quot;&gt;&lt;span class=&quot;js_darkmode__text__363&quot;&gt;Stop-NlbClusterNode -NodeName WEB01&lt;/span&gt;&lt;/code&gt;&lt;span class=&quot;js_darkmode__text__364&quot;&gt;），再次访问VIP，确认请求被转发到WEB02&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section class=&quot;js_darkmode__text__366&quot;&gt;&lt;span class=&quot;js_darkmode__text__367&quot;&gt;重新启动WEB01的NLB服务（管理器右键节点 → “启动”），等待状态恢复“已聚合”&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;/ol&gt;&lt;h3 style=&quot;font-size: 1.15em;font-weight: bold;color: #333;margin: 1.4em 0 .6em;text-align:left;letter-spacing:normal;word-spacing:normal;&quot; class=&quot;js_darkmode__61 js_darkmode__text__368&quot;&gt;&lt;span class=&quot;js_darkmode__text__369&quot;&gt;示例2：典型业务场景——ASP.NET Core应用+NLB + Redis共享Session&lt;/span&gt;&lt;/h3&gt;&lt;p style=&quot;word-break: break-word;margin: 1em 0;color: #3e3e3e;text-align:left;letter-spacing:normal;word-spacing:normal;&quot; class=&quot;js_darkmode__62 js_darkmode__text__370&quot;&gt;&lt;span class=&quot;js_darkmode__text__371&quot;&gt;目标：多台服务器运行同一套ASP.NET Core应用，通过NLB分发流量，Session状态存储在Redis中，实现无状态水平扩展。&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;word-break: break-word;margin: 1em 0;color: #3e3e3e;text-align:left;letter-spacing:normal;word-spacing:normal;&quot; class=&quot;js_darkmode__63 js_darkmode__text__372&quot;&gt;&lt;span class=&quot;js_darkmode__text__373&quot;&gt;关键依赖：每台服务器安装.NET运行时；Redis作为分布式缓存（独立部署或云服务）。&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;word-break: break-word;margin: 1em 0;color: #3e3e3e;text-align:left;letter-spacing:normal;word-spacing:normal;&quot; class=&quot;js_darkmode__64 js_darkmode__text__374&quot;&gt;&lt;strong style=&quot;color: #000;font-weight: bold;display:inline;font-weight:bold;&quot; class=&quot;js_darkmode__65 js_darkmode__text__375&quot;&gt;&lt;span class=&quot;js_darkmode__text__376&quot;&gt;核心配置（Program.cs）：&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;pre style=&quot;background-color: #282c34;border-radius: 6px;padding: 14px 16px;margin: 1.2em 0;font-size: 13px;line-height: 1.6;hyphens: none;-webkit-hyphens: none;overflow-x: auto;overflow-x: auto;hyphens: none;-webkit-hyphens: none;margin: 1.2em 0;overflow-x: auto;hyphens: none;-webkit-hyphens: none;tab-size: 4;margin: 1.2em 0;max-width: 100%;-webkit-overflow-scrolling:touch;white-space:normal;word-break:normal;word-spacing:normal;text-align:left;letter-spacing:0;&quot; class=&quot;js_darkmode__66 js_darkmode__text__377&quot;&gt;&lt;code style=&quot;white-space:pre-wrap;font-family: Consolas,Menlo,monospace;color: #abb2bf;background: transparent;padding: 0;hyphens: none;-webkit-hyphens: none;font-family: Consolas,Menlo,monospace;hyphens: none;-webkit-hyphens: none;background: transparent;padding: 0;display: block;width: max-content;min-width: 100%;font-family: Consolas,Menlo,monospace;letter-spacing: 0;word-break: normal;word-wrap: normal;overflow-wrap: normal;hyphens: none;-webkit-hyphens: none;background: transparent;padding: 0;margin:0;word-spacing:normal;line-height:1.6;&quot; class=&quot;js_darkmode__text__378&quot;&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;color:#c678dd;&quot; class=&quot;js_darkmode__text__379&quot;&gt;&lt;span class=&quot;js_darkmode__text__380&quot;&gt;var&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;&quot; class=&quot;js_darkmode__text__381&quot;&gt;&lt;span class=&quot;js_darkmode__text__382&quot;&gt;&amp;nbsp;builder = WebApplication.CreateBuilder(&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;color:#c678dd;&quot; class=&quot;js_darkmode__text__383&quot;&gt;&lt;span class=&quot;js_darkmode__text__384&quot;&gt;args&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;&quot; class=&quot;js_darkmode__text__385&quot;&gt;&lt;span class=&quot;js_darkmode__text__386&quot;&gt;);&lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;color:#5c6370;font-style:italic;&quot; class=&quot;js_darkmode__67 js_darkmode__text__387&quot;&gt;&lt;span class=&quot;js_darkmode__text__388&quot;&gt;// 配置Redis作为分布式Session存储&lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;&quot; class=&quot;js_darkmode__text__389&quot;&gt;&lt;span class=&quot;js_darkmode__text__390&quot;&gt;builder.&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;&quot; class=&quot;js_darkmode__text__391&quot;&gt;&lt;span class=&quot;js_darkmode__text__392&quot;&gt;Services&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;&quot; class=&quot;js_darkmode__text__393&quot;&gt;&lt;span class=&quot;js_darkmode__text__394&quot;&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;color:#e06c75;&quot; class=&quot;js_darkmode__text__395&quot;&gt;&lt;span class=&quot;js_darkmode__text__396&quot;&gt;AddDistributedRedisCache&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;&quot; class=&quot;js_darkmode__text__397&quot;&gt;&lt;span class=&quot;js_darkmode__text__398&quot;&gt;(&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;color:#61afef;&quot; class=&quot;js_darkmode__text__399&quot;&gt;&lt;span class=&quot;js_darkmode__text__400&quot;&gt;options =&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;&quot; class=&quot;js_darkmode__text__401&quot;&gt;&lt;span class=&quot;js_darkmode__text__402&quot;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;&quot; class=&quot;js_darkmode__text__403&quot;&gt;&lt;span class=&quot;js_darkmode__text__404&quot;&gt;&amp;nbsp; &amp;nbsp; options.Configuration =&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;color:#98c379;&quot; class=&quot;js_darkmode__text__405&quot;&gt;&lt;span class=&quot;js_darkmode__text__406&quot;&gt;&amp;quot;192.168.1.200:6379&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;&quot; class=&quot;js_darkmode__text__407&quot;&gt;&lt;span class=&quot;js_darkmode__text__408&quot;&gt;;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;color:#5c6370;font-style:italic;&quot; class=&quot;js_darkmode__68 js_darkmode__text__409&quot;&gt;&lt;span class=&quot;js_darkmode__text__410&quot;&gt;// Redis地址&lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;&quot; class=&quot;js_darkmode__text__411&quot;&gt;&lt;span class=&quot;js_darkmode__text__412&quot;&gt;&amp;nbsp; &amp;nbsp; options.InstanceName =&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;color:#98c379;&quot; class=&quot;js_darkmode__text__413&quot;&gt;&lt;span class=&quot;js_darkmode__text__414&quot;&gt;&amp;quot;Session&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;&quot; class=&quot;js_darkmode__text__415&quot;&gt;&lt;span class=&quot;js_darkmode__text__416&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;&quot; class=&quot;js_darkmode__text__417&quot;&gt;&lt;span class=&quot;js_darkmode__text__418&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;&quot; class=&quot;js_darkmode__text__419&quot;&gt;&lt;span class=&quot;js_darkmode__text__420&quot;&gt;builder.&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;&quot; class=&quot;js_darkmode__text__421&quot;&gt;&lt;span class=&quot;js_darkmode__text__422&quot;&gt;Services&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;&quot; class=&quot;js_darkmode__text__423&quot;&gt;&lt;span class=&quot;js_darkmode__text__424&quot;&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;color:#e06c75;&quot; class=&quot;js_darkmode__text__425&quot;&gt;&lt;span class=&quot;js_darkmode__text__426&quot;&gt;AddSession&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;&quot; class=&quot;js_darkmode__text__427&quot;&gt;&lt;span class=&quot;js_darkmode__text__428&quot;&gt;(&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;color:#61afef;&quot; class=&quot;js_darkmode__text__429&quot;&gt;&lt;span class=&quot;js_darkmode__text__430&quot;&gt;options =&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;&quot; class=&quot;js_darkmode__text__431&quot;&gt;&lt;span class=&quot;js_darkmode__text__432&quot;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;&quot; class=&quot;js_darkmode__text__433&quot;&gt;&lt;span class=&quot;js_darkmode__text__434&quot;&gt;&amp;nbsp; &amp;nbsp; options.IdleTimeout = TimeSpan.FromMinutes(30);&lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;&quot; class=&quot;js_darkmode__text__435&quot;&gt;&lt;span class=&quot;js_darkmode__text__436&quot;&gt;&amp;nbsp; &amp;nbsp; options.Cookie.HttpOnly =&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;color:#d19a66;&quot; class=&quot;js_darkmode__text__437&quot;&gt;&lt;span class=&quot;js_darkmode__text__438&quot;&gt;true&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;&quot; class=&quot;js_darkmode__text__439&quot;&gt;&lt;span class=&quot;js_darkmode__text__440&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;&quot; class=&quot;js_darkmode__text__441&quot;&gt;&lt;span class=&quot;js_darkmode__text__442&quot;&gt;&amp;nbsp; &amp;nbsp; options.Cookie.IsEssential =&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;color:#d19a66;&quot; class=&quot;js_darkmode__text__443&quot;&gt;&lt;span class=&quot;js_darkmode__text__444&quot;&gt;true&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;&quot; class=&quot;js_darkmode__text__445&quot;&gt;&lt;span class=&quot;js_darkmode__text__446&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;&quot; class=&quot;js_darkmode__text__447&quot;&gt;&lt;span class=&quot;js_darkmode__text__448&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;color:#c678dd;&quot; class=&quot;js_darkmode__text__449&quot;&gt;&lt;span class=&quot;js_darkmode__text__450&quot;&gt;var&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;&quot; class=&quot;js_darkmode__text__451&quot;&gt;&lt;span class=&quot;js_darkmode__text__452&quot;&gt;&amp;nbsp;app = builder.Build();&lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;&quot; class=&quot;js_darkmode__text__453&quot;&gt;&lt;span class=&quot;js_darkmode__text__454&quot;&gt;app.UseSession();&lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;&quot; class=&quot;js_darkmode__text__455&quot;&gt;&lt;span class=&quot;js_darkmode__text__456&quot;&gt;app.&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;color:#e06c75;&quot; class=&quot;js_darkmode__text__457&quot;&gt;&lt;span class=&quot;js_darkmode__text__458&quot;&gt;MapGet&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;&quot; class=&quot;js_darkmode__text__459&quot;&gt;&lt;span class=&quot;js_darkmode__text__460&quot;&gt;(&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;color:#98c379;&quot; class=&quot;js_darkmode__text__461&quot;&gt;&lt;span class=&quot;js_darkmode__text__462&quot;&gt;&amp;quot;/&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;&quot; class=&quot;js_darkmode__text__463&quot;&gt;&lt;span class=&quot;js_darkmode__text__464&quot;&gt;,&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;color:#61afef;&quot; class=&quot;js_darkmode__text__465&quot;&gt;&lt;span class=&quot;js_darkmode__text__466&quot;&gt;(HttpContext ctx) =&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;&quot; class=&quot;js_darkmode__text__467&quot;&gt;&lt;span class=&quot;js_darkmode__text__468&quot;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;color:#c678dd;&quot; class=&quot;js_darkmode__text__469&quot;&gt;&lt;span class=&quot;js_darkmode__text__470&quot;&gt;var&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;&quot; class=&quot;js_darkmode__text__471&quot;&gt;&lt;span class=&quot;js_darkmode__text__472&quot;&gt;&amp;nbsp;count = ctx.Session.GetInt32(&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;color:#98c379;&quot; class=&quot;js_darkmode__text__473&quot;&gt;&lt;span class=&quot;js_darkmode__text__474&quot;&gt;&amp;quot;Count&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;&quot; class=&quot;js_darkmode__text__475&quot;&gt;&lt;span class=&quot;js_darkmode__text__476&quot;&gt;) ??&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;color:#d19a66;&quot; class=&quot;js_darkmode__text__477&quot;&gt;&lt;span class=&quot;js_darkmode__text__478&quot;&gt;0&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;&quot; class=&quot;js_darkmode__text__479&quot;&gt;&lt;span class=&quot;js_darkmode__text__480&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;&quot; class=&quot;js_darkmode__text__481&quot;&gt;&lt;span class=&quot;js_darkmode__text__482&quot;&gt;&amp;nbsp; &amp;nbsp; count++;&lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;&quot; class=&quot;js_darkmode__text__483&quot;&gt;&lt;span class=&quot;js_darkmode__text__484&quot;&gt;&amp;nbsp; &amp;nbsp; ctx.Session.SetInt32(&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;color:#98c379;&quot; class=&quot;js_darkmode__text__485&quot;&gt;&lt;span class=&quot;js_darkmode__text__486&quot;&gt;&amp;quot;Count&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;&quot; class=&quot;js_darkmode__text__487&quot;&gt;&lt;span class=&quot;js_darkmode__text__488&quot;&gt;, count);&lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;color:#c678dd;&quot; class=&quot;js_darkmode__text__489&quot;&gt;&lt;span class=&quot;js_darkmode__text__490&quot;&gt;return&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;color:#98c379;&quot; class=&quot;js_darkmode__text__491&quot;&gt;&lt;span class=&quot;js_darkmode__text__492&quot;&gt;$&amp;quot;访问次数：{count}，节点：{Environment.MachineName}&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;&quot; class=&quot;js_darkmode__text__493&quot;&gt;&lt;span class=&quot;js_darkmode__text__494&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;&quot; class=&quot;js_darkmode__text__495&quot;&gt;&lt;span class=&quot;js_darkmode__text__496&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;&quot; class=&quot;js_darkmode__text__497&quot;&gt;&lt;span class=&quot;js_darkmode__text__498&quot;&gt;app.Run();&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p style=&quot;word-break: break-word;margin: 1em 0;color: #3e3e3e;text-align:left;letter-spacing:normal;word-spacing:normal;&quot; class=&quot;js_darkmode__69 js_darkmode__text__499&quot;&gt;&lt;span class=&quot;js_darkmode__text__500&quot;&gt;NLB端口规则配置（与示例1相同，80端口，亲和性选“单一”或“无”均可——因为Session已外置，不需要保持会话粘滞，选“无”可实现更均匀的轮询分发）。&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;word-break: break-word;margin: 1em 0;color: #3e3e3e;text-align:left;letter-spacing:normal;word-spacing:normal;&quot; class=&quot;js_darkmode__70 js_darkmode__text__501&quot;&gt;&lt;span class=&quot;js_darkmode__text__502&quot;&gt;预期输出：多次刷新页面，&lt;/span&gt;&lt;code style=&quot;background: #f5f5f5;color: #c7254e;padding: 2px 5px;border-radius: 3px;font-size: .9em;font-family: Consolas,Menlo,monospace;white-space:nowrap;word-break:normal;word-spacing:normal;letter-spacing:normal;display:inline-block;max-width:100%;overflow-x:auto;vertical-align:middle;-webkit-overflow-scrolling:touch;&quot; class=&quot;js_darkmode__71 js_darkmode__text__503&quot;&gt;&lt;span class=&quot;js_darkmode__text__504&quot;&gt;Environment.MachineName&lt;/span&gt;&lt;/code&gt;&lt;span class=&quot;js_darkmode__text__505&quot;&gt;可能在WEB01和WEB02之间切换（取决于NLB的分发策略），但Session中的计数持续累加——说明Session在Redis中共享。&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;word-break: break-word;margin: 1em 0;color: #3e3e3e;text-align:left;letter-spacing:normal;word-spacing:normal;&quot; class=&quot;js_darkmode__72 js_darkmode__text__506&quot;&gt;&lt;strong style=&quot;color: #000;font-weight: bold;display:inline;font-weight:bold;&quot; class=&quot;js_darkmode__73 js_darkmode__text__507&quot;&gt;&lt;span class=&quot;js_darkmode__text__508&quot;&gt;验证步骤：&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;ol style=&quot;margin: 1em 0;padding-left: 1.6em;&quot; class=&quot;js_darkmode__text__509 list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;section class=&quot;js_darkmode__text__511&quot;&gt;&lt;span class=&quot;js_darkmode__text__512&quot;&gt;在WEB01和WEB02上分别部署同一应用&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section class=&quot;js_darkmode__text__514&quot;&gt;&lt;span class=&quot;js_darkmode__text__515&quot;&gt;配置NLB集群VIP&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section class=&quot;js_darkmode__text__517&quot;&gt;&lt;span class=&quot;js_darkmode__text__518&quot;&gt;多次访问VIP，确认Session状态不丢失&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section class=&quot;js_darkmode__text__520&quot;&gt;&lt;span class=&quot;js_darkmode__text__521&quot;&gt;停止其中一台节点的NLB服务，确认Session仍然可用&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;/ol&gt;&lt;h3 style=&quot;font-size: 1.15em;font-weight: bold;color: #333;margin: 1.4em 0 .6em;text-align:left;letter-spacing:normal;word-spacing:normal;&quot; class=&quot;js_darkmode__78 js_darkmode__text__522&quot;&gt;&lt;span class=&quot;js_darkmode__text__523&quot;&gt;示例3：典型业务场景——HTTPS站点（NLB四层透传）&lt;/span&gt;&lt;/h3&gt;&lt;p style=&quot;word-break: break-word;margin: 1em 0;color: #3e3e3e;text-align:left;letter-spacing:normal;word-spacing:normal;&quot; class=&quot;js_darkmode__79 js_darkmode__text__524&quot;&gt;&lt;span class=&quot;js_darkmode__text__525&quot;&gt;目标：NLB在四层透传TCP 443流量，SSL证书在每台后端服务器上独立配置，NLB不做SSL卸载。&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;word-break: break-word;margin: 1em 0;color: #3e3e3e;text-align:left;letter-spacing:normal;word-spacing:normal;&quot; class=&quot;js_darkmode__80 js_darkmode__text__526&quot;&gt;&lt;strong style=&quot;color: #000;font-weight: bold;display:inline;font-weight:bold;&quot; class=&quot;js_darkmode__81 js_darkmode__text__527&quot;&gt;&lt;span class=&quot;js_darkmode__text__528&quot;&gt;图形化配置：&lt;/span&gt;&lt;/strong&gt;&lt;span class=&quot;js_darkmode__text__529&quot;&gt;&amp;nbsp;在端口规则页面添加443端口的规则，协议选TCP，亲和性选“单一”。&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;word-break: break-word;margin: 1em 0;color: #3e3e3e;text-align:left;letter-spacing:normal;word-spacing:normal;&quot; class=&quot;js_darkmode__82 js_darkmode__text__530&quot;&gt;&lt;strong style=&quot;color: #000;font-weight: bold;display:inline;font-weight:bold;&quot; class=&quot;js_darkmode__83 js_darkmode__text__531&quot;&gt;&lt;span class=&quot;js_darkmode__text__532&quot;&gt;PowerShell配置：&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;pre style=&quot;background-color: #282c34;border-radius: 6px;padding: 14px 16px;margin: 1.2em 0;font-size: 13px;line-height: 1.6;hyphens: none;-webkit-hyphens: none;overflow-x: auto;overflow-x: auto;hyphens: none;-webkit-hyphens: none;margin: 1.2em 0;overflow-x: auto;hyphens: none;-webkit-hyphens: none;tab-size: 4;margin: 1.2em 0;max-width: 100%;-webkit-overflow-scrolling:touch;white-space:normal;word-break:normal;word-spacing:normal;text-align:left;letter-spacing:0;&quot; class=&quot;js_darkmode__84 js_darkmode__text__533&quot;&gt;Get-NlbCluster&amp;nbsp;|&amp;nbsp;Add-NlbClusterPortRule&amp;nbsp;-StartPort&amp;nbsp;443&amp;nbsp;-EndPort&amp;nbsp;443&amp;nbsp;-Protocol&amp;nbsp;TCP&amp;nbsp;-Affinity&amp;nbsp;Single&lt;/pre&gt;&lt;p style=&quot;word-break: break-word;margin: 1em 0;color: #3e3e3e;text-align:left;letter-spacing:normal;word-spacing:normal;&quot; class=&quot;js_darkmode__85 js_darkmode__text__569&quot;&gt;&lt;span class=&quot;js_darkmode__text__570&quot;&gt;后端IIS绑定SSL证书（每台服务器独立导入证书，绑定到443端口）。&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;word-break: break-word;margin: 1em 0;color: #3e3e3e;text-align:left;letter-spacing:normal;word-spacing:normal;&quot; class=&quot;js_darkmode__86 js_darkmode__text__571&quot;&gt;&lt;span class=&quot;js_darkmode__text__572&quot;&gt;预期输出：客户端访问&lt;/span&gt;&lt;code style=&quot;background: #f5f5f5;color: #c7254e;padding: 2px 5px;border-radius: 3px;font-size: .9em;font-family: Consolas,Menlo,monospace;white-space:nowrap;word-break:normal;word-spacing:normal;letter-spacing:normal;display:inline-block;max-width:100%;overflow-x:auto;vertical-align:middle;-webkit-overflow-scrolling:touch;&quot; class=&quot;js_darkmode__87 js_darkmode__text__573&quot;&gt;&lt;span class=&quot;js_darkmode__text__574&quot;&gt;https://VIP&lt;/span&gt;&lt;/code&gt;&lt;span class=&quot;js_darkmode__text__575&quot;&gt;，证书正常、页面正常返回。&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;word-break: break-word;margin: 1em 0;color: #3e3e3e;text-align:left;letter-spacing:normal;word-spacing:normal;&quot; class=&quot;js_darkmode__88 js_darkmode__text__576&quot;&gt;&lt;strong style=&quot;color: #000;font-weight: bold;display:inline;font-weight:bold;&quot; class=&quot;js_darkmode__89 js_darkmode__text__577&quot;&gt;&lt;span class=&quot;js_darkmode__text__578&quot;&gt;验证步骤：&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;ol style=&quot;margin: 1em 0;padding-left: 1.6em;&quot; class=&quot;js_darkmode__text__579 list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;section class=&quot;js_darkmode__text__581&quot;&gt;&lt;span class=&quot;js_darkmode__text__582&quot;&gt;在各节点分别配置SSL证书（证书需一致或使用通配符证书）&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section class=&quot;js_darkmode__text__584&quot;&gt;&lt;span class=&quot;js_darkmode__text__585&quot;&gt;通过浏览器访问&lt;/span&gt;&lt;code style=&quot;background: #f5f5f5;color: #c7254e;padding: 2px 5px;border-radius: 3px;font-size: .9em;font-family: Consolas,Menlo,monospace;white-space:nowrap;word-break:normal;word-spacing:normal;letter-spacing:normal;display:inline-block;max-width:100%;overflow-x:auto;vertical-align:middle;-webkit-overflow-scrolling:touch;&quot; class=&quot;js_darkmode__92 js_darkmode__text__586&quot;&gt;&lt;span class=&quot;js_darkmode__text__587&quot;&gt;https://VIP&lt;/span&gt;&lt;/code&gt;&lt;span class=&quot;js_darkmode__text__588&quot;&gt;，确认无证书警告&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section class=&quot;js_darkmode__text__590&quot;&gt;&lt;span class=&quot;js_darkmode__text__591&quot;&gt;抓包确认NLB没有解密流量，TCP payload原样透传&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;/ol&gt;&lt;h3 style=&quot;font-size: 1.15em;font-weight: bold;color: #333;margin: 1.4em 0 .6em;text-align:left;letter-spacing:normal;word-spacing:normal;&quot; class=&quot;js_darkmode__94 js_darkmode__text__592&quot;&gt;&lt;span class=&quot;js_darkmode__text__593&quot;&gt;示例4：进阶能力——通过PowerShell脚本实现自动化节点上下线&lt;/span&gt;&lt;/h3&gt;&lt;p style=&quot;word-break: break-word;margin: 1em 0;color: #3e3e3e;text-align:left;letter-spacing:normal;word-spacing:normal;&quot; class=&quot;js_darkmode__95 js_darkmode__text__594&quot;&gt;&lt;span class=&quot;js_darkmode__text__595&quot;&gt;目标：发布新版本时，通过脚本将节点从NLB集群中优雅摘除，更新完成后重新加入。&lt;/span&gt;&lt;/p&gt;&lt;pre style=&quot;background-color: #282c34;border-radius: 6px;padding: 14px 16px;margin: 1.2em 0;font-size: 13px;line-height: 1.6;hyphens: none;-webkit-hyphens: none;overflow-x: auto;overflow-x: auto;hyphens: none;-webkit-hyphens: none;margin: 1.2em 0;overflow-x: auto;hyphens: none;-webkit-hyphens: none;tab-size: 4;margin: 1.2em 0;max-width: 100%;-webkit-overflow-scrolling:touch;white-space:normal;word-break:normal;word-spacing:normal;text-align:left;letter-spacing:0;&quot; class=&quot;js_darkmode__96 js_darkmode__text__596&quot;&gt;&lt;code style=&quot;white-space:pre-wrap;font-family: Consolas,Menlo,monospace;color: #abb2bf;background: transparent;padding: 0;hyphens: none;-webkit-hyphens: none;font-family: Consolas,Menlo,monospace;hyphens: none;-webkit-hyphens: none;background: transparent;padding: 0;display: block;width: max-content;min-width: 100%;font-family: Consolas,Menlo,monospace;letter-spacing: 0;word-break: normal;word-wrap: normal;overflow-wrap: normal;hyphens: none;-webkit-hyphens: none;background: transparent;padding: 0;margin:0;word-spacing:normal;line-height:1.6;&quot; class=&quot;js_darkmode__text__597&quot;&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;color:#abb2bf;&quot; class=&quot;js_darkmode__text__598&quot;&gt;&lt;span class=&quot;js_darkmode__text__599&quot;&gt;# 将节点置为&amp;quot;排空&amp;quot;状态——停止接收新连接，但保持现有连接&lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;&quot; class=&quot;js_darkmode__text__600&quot;&gt;&lt;span class=&quot;js_darkmode__text__601&quot;&gt;Suspend-NlbClusterNode -NodeName&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;color:#98c379;&quot; class=&quot;js_darkmode__text__602&quot;&gt;&lt;span class=&quot;js_darkmode__text__603&quot;&gt;&amp;quot;WEB02&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;color:#abb2bf;&quot; class=&quot;js_darkmode__text__604&quot;&gt;&lt;span class=&quot;js_darkmode__text__605&quot;&gt;# 等待现有连接处理完毕（可根据业务自定义等待时间）&lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;color:#c678dd;&quot; class=&quot;js_darkmode__text__606&quot;&gt;&lt;span class=&quot;js_darkmode__text__607&quot;&gt;Start&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;&quot; class=&quot;js_darkmode__text__608&quot;&gt;&lt;span class=&quot;js_darkmode__text__609&quot;&gt;-&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;&quot; class=&quot;js_darkmode__text__610&quot;&gt;&lt;span class=&quot;js_darkmode__text__611&quot;&gt;Sleep&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;&quot; class=&quot;js_darkmode__text__612&quot;&gt;&lt;span class=&quot;js_darkmode__text__613&quot;&gt;-&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;&quot; class=&quot;js_darkmode__text__614&quot;&gt;&lt;span class=&quot;js_darkmode__text__615&quot;&gt;Seconds&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;color:#d19a66;&quot; class=&quot;js_darkmode__text__616&quot;&gt;&lt;span class=&quot;js_darkmode__text__617&quot;&gt;60&lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;color:#abb2bf;&quot; class=&quot;js_darkmode__text__618&quot;&gt;&lt;span class=&quot;js_darkmode__text__619&quot;&gt;# 停止该节点的NLB服务&lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;&quot; class=&quot;js_darkmode__text__620&quot;&gt;&lt;span class=&quot;js_darkmode__text__621&quot;&gt;Stop-NlbClusterNode -NodeName&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;color:#98c379;&quot; class=&quot;js_darkmode__text__622&quot;&gt;&lt;span class=&quot;js_darkmode__text__623&quot;&gt;&amp;quot;WEB02&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;color:#abb2bf;&quot; class=&quot;js_darkmode__text__624&quot;&gt;&lt;span class=&quot;js_darkmode__text__625&quot;&gt;# ---- 在此执行应用更新 ----&lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;color:#abb2bf;&quot; class=&quot;js_darkmode__text__626&quot;&gt;&lt;span class=&quot;js_darkmode__text__627&quot;&gt;# 启动NLB服务&lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;color:#c678dd;&quot; class=&quot;js_darkmode__text__628&quot;&gt;&lt;span class=&quot;js_darkmode__text__629&quot;&gt;Start&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;&quot; class=&quot;js_darkmode__text__630&quot;&gt;&lt;span class=&quot;js_darkmode__text__631&quot;&gt;-&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;&quot; class=&quot;js_darkmode__text__632&quot;&gt;&lt;span class=&quot;js_darkmode__text__633&quot;&gt;NlbClusterNode&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;&quot; class=&quot;js_darkmode__text__634&quot;&gt;&lt;span class=&quot;js_darkmode__text__635&quot;&gt;-&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;&quot; class=&quot;js_darkmode__text__636&quot;&gt;&lt;span class=&quot;js_darkmode__text__637&quot;&gt;NodeName &amp;quot;WEB02&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;color:#abb2bf;&quot; class=&quot;js_darkmode__text__638&quot;&gt;&lt;span class=&quot;js_darkmode__text__639&quot;&gt;# 恢复节点接收流量&lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;&quot; class=&quot;js_darkmode__text__640&quot;&gt;&lt;span class=&quot;js_darkmode__text__641&quot;&gt;Resume-NlbClusterNode -NodeName&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:inline;white-space:inherit;word-break:normal;word-spacing:normal;letter-spacing:0;color:#98c379;&quot; class=&quot;js_darkmode__text__642&quot;&gt;&lt;span class=&quot;js_darkmode__text__643&quot;&gt;&amp;quot;WEB02&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p style=&quot;word-break: break-word;margin: 1em 0;color: #3e3e3e;text-align:left;letter-spacing:normal;word-spacing:normal;&quot; class=&quot;js_darkmode__97 js_darkmode__text__644&quot;&gt;&lt;span class=&quot;js_darkmode__text__645&quot;&gt;图形化对应操作：右键节点 → “控制主机” → “排空” → 等待 → “停止” → 更新完成后右键 → “启动” → 再右键 → “恢复”。&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;word-break: break-word;margin: 1em 0;color: #3e3e3e;text-align:left;letter-spacing:normal;word-spacing:normal;&quot; class=&quot;js_darkmode__98 js_darkmode__text__646&quot;&gt;&lt;span class=&quot;js_darkmode__text__647&quot;&gt;预期输出：节点WEB02进入暂停状态后，新请求不再转发到该节点；已有连接继续服务直至完成。更新完成后恢复。&lt;/span&gt;&lt;/p&gt;&lt;h3 style=&quot;font-size: 1.15em;font-weight: bold;color: #333;margin: 1.4em 0 .6em;text-align:left;letter-spacing:normal;word-spacing:normal;&quot; class=&quot;js_darkmode__99 js_darkmode__text__648&quot;&gt;&lt;span class=&quot;js_darkmode__text__649&quot;&gt;实战常见报错&lt;/span&gt;&lt;/h3&gt;&lt;table class=&quot;js_darkmode__text__650&quot; width=&quot;100&quot;&gt;&lt;thead class=&quot;js_darkmode__text__651&quot;&gt;&lt;tr class=&quot;js_darkmode__text__652 firstRow&quot;&gt;&lt;th valign=&quot;top&quot; align=&quot;left&quot; style=&quot;background: #f5f5f5;color: #333;padding: 10px 12px;font-weight: bold;border: 1px solid #e7e7e7;vertical-align: top;word-break: break-word;text-align:left;letter-spacing:normal;word-spacing:normal;&quot; class=&quot;js_darkmode__100 js_darkmode__text__653&quot;&gt;&lt;section class=&quot;js_darkmode__text__654&quot;&gt;&lt;span class=&quot;js_darkmode__text__655&quot;&gt;报错现象&lt;/span&gt;&lt;/section&gt;&lt;/th&gt;&lt;th valign=&quot;top&quot; align=&quot;left&quot; style=&quot;background: #f5f5f5;color: #333;padding: 10px 12px;font-weight: bold;border: 1px solid #e7e7e7;vertical-align: top;word-break: break-word;text-align:left;letter-spacing:normal;word-spacing:normal;&quot; class=&quot;js_darkmode__101 js_darkmode__text__656&quot;&gt;&lt;section class=&quot;js_darkmode__text__657&quot;&gt;&lt;span class=&quot;js_darkmode__text__658&quot;&gt;触发条件&lt;/span&gt;&lt;/section&gt;&lt;/th&gt;&lt;th valign=&quot;top&quot; align=&quot;left&quot; style=&quot;background: #f5f5f5;color: #333;padding: 10px 12px;font-weight: bold;border: 1px solid #e7e7e7;vertical-align: top;word-break: break-word;text-align:left;letter-spacing:normal;word-spacing:normal;&quot; class=&quot;js_darkmode__102 js_darkmode__text__659&quot;&gt;&lt;section class=&quot;js_darkmode__text__660&quot;&gt;&lt;span class=&quot;js_darkmode__text__661&quot;&gt;修复方式&lt;/span&gt;&lt;/section&gt;&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody class=&quot;js_darkmode__text__662&quot;&gt;&lt;tr class=&quot;js_darkmode__text__663&quot;&gt;&lt;td valign=&quot;top&quot; style=&quot;border: 1px solid #e7e7e7;padding: 10px 12px;color: #3e3e3e;vertical-align: top;word-break: break-word;text-align:left;letter-spacing:normal;word-spacing:normal;&quot; class=&quot;js_darkmode__103 js_darkmode__text__664&quot;&gt;&lt;section class=&quot;js_darkmode__text__665&quot;&gt;&lt;span class=&quot;js_darkmode__text__666&quot;&gt;NLB管理器显示节点状态为“未聚合”&lt;/span&gt;&lt;/section&gt;&lt;/td&gt;&lt;td valign=&quot;top&quot; style=&quot;border: 1px solid #e7e7e7;padding: 10px 12px;color: #3e3e3e;vertical-align: top;word-break: break-word;text-align:left;letter-spacing:normal;word-spacing:normal;&quot; class=&quot;js_darkmode__104 js_darkmode__text__667&quot;&gt;&lt;section class=&quot;js_darkmode__text__668&quot;&gt;&lt;span class=&quot;js_darkmode__text__669&quot;&gt;节点间心跳不通，通常因防火墙阻挡、网络隔离或MAC地址冲突&lt;/span&gt;&lt;/section&gt;&lt;/td&gt;&lt;td valign=&quot;top&quot; style=&quot;border: 1px solid #e7e7e7;padding: 10px 12px;color: #3e3e3e;vertical-align: top;word-break: break-word;text-align:left;letter-spacing:normal;word-spacing:normal;&quot; class=&quot;js_darkmode__105 js_darkmode__text__670&quot;&gt;&lt;section class=&quot;js_darkmode__text__671&quot;&gt;&lt;span class=&quot;js_darkmode__text__672&quot;&gt;检查防火墙放行NLB相关端口（UDP 2504、TCP 2505）；确认所有节点在同一二层网络；单播模式下确认交换机未因MAC冲突导致丢包&lt;/span&gt;&lt;/section&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;js_darkmode__text__673&quot;&gt;&lt;td valign=&quot;top&quot; style=&quot;border: 1px solid #e7e7e7;padding: 10px 12px;color: #3e3e3e;vertical-align: top;word-break: break-word;text-align:left;letter-spacing:normal;word-spacing:normal;&quot; class=&quot;js_darkmode__106 js_darkmode__text__674&quot;&gt;&lt;section class=&quot;js_darkmode__text__675&quot;&gt;&lt;span class=&quot;js_darkmode__text__676&quot;&gt;跨网段访问VIP间歇性失败&lt;/span&gt;&lt;/section&gt;&lt;/td&gt;&lt;td valign=&quot;top&quot; style=&quot;border: 1px solid #e7e7e7;padding: 10px 12px;color: #3e3e3e;vertical-align: top;word-break: break-word;text-align:left;letter-spacing:normal;word-spacing:normal;&quot; class=&quot;js_darkmode__107 js_darkmode__text__677&quot;&gt;&lt;section class=&quot;js_darkmode__text__678&quot;&gt;&lt;span class=&quot;js_darkmode__text__679&quot;&gt;单播模式下，交换机ARP表学习异常&lt;/span&gt;&lt;/section&gt;&lt;/td&gt;&lt;td valign=&quot;top&quot; style=&quot;border: 1px solid #e7e7e7;padding: 10px 12px;color: #3e3e3e;vertical-align: top;word-break: break-word;text-align:left;letter-spacing:normal;word-spacing:normal;&quot; class=&quot;js_darkmode__108 js_darkmode__text__680&quot;&gt;&lt;section class=&quot;js_darkmode__text__681&quot;&gt;&lt;span class=&quot;js_darkmode__text__682&quot;&gt;改用多播模式，或在交换机上配置静态ARP条目&lt;/span&gt;&lt;/section&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;js_darkmode__text__683&quot;&gt;&lt;td valign=&quot;top&quot; style=&quot;border: 1px solid #e7e7e7;padding: 10px 12px;color: #3e3e3e;vertical-align: top;word-break: break-word;text-align:left;letter-spacing:normal;word-spacing:normal;&quot; class=&quot;js_darkmode__109 js_darkmode__text__684&quot;&gt;&lt;section class=&quot;js_darkmode__text__685&quot;&gt;&lt;span class=&quot;js_darkmode__text__686&quot;&gt;节点离线后流量切换超过10秒&lt;/span&gt;&lt;/section&gt;&lt;/td&gt;&lt;td valign=&quot;top&quot; style=&quot;border: 1px solid #e7e7e7;padding: 10px 12px;color: #3e3e3e;vertical-align: top;word-break: break-word;text-align:left;letter-spacing:normal;word-spacing:normal;&quot; class=&quot;js_darkmode__110 js_darkmode__text__687&quot;&gt;&lt;section class=&quot;js_darkmode__text__688&quot;&gt;&lt;span class=&quot;js_darkmode__text__689&quot;&gt;心跳参数&lt;/span&gt;&lt;code style=&quot;background: #f5f5f5;color: #c7254e;padding: 2px 5px;border-radius: 3px;font-size: .9em;font-family: Consolas,Menlo,monospace;white-space:nowrap;word-break:normal;word-spacing:normal;letter-spacing:normal;display:inline-block;max-width:100%;overflow-x:auto;vertical-align:middle;-webkit-overflow-scrolling:touch;&quot; class=&quot;js_darkmode__111 js_darkmode__text__690&quot;&gt;&lt;span class=&quot;js_darkmode__text__691&quot;&gt;AliveMsgTolerance&lt;/span&gt;&lt;/code&gt;&lt;span class=&quot;js_darkmode__text__692&quot;&gt;默认值过大，或网络延迟高&lt;/span&gt;&lt;/section&gt;&lt;/td&gt;&lt;td valign=&quot;top&quot; style=&quot;border: 1px solid #e7e7e7;padding: 10px 12px;color: #3e3e3e;vertical-align: top;word-break: break-word;text-align:left;letter-spacing:normal;word-spacing:normal;&quot; class=&quot;js_darkmode__112 js_darkmode__text__693&quot;&gt;&lt;section class=&quot;js_darkmode__text__694&quot;&gt;&lt;span class=&quot;js_darkmode__text__695&quot;&gt;调整注册表&lt;/span&gt;&lt;code style=&quot;background: #f5f5f5;color: #c7254e;padding: 2px 5px;border-radius: 3px;font-size: .9em;font-family: Consolas,Menlo,monospace;white-space:nowrap;word-break:normal;word-spacing:normal;letter-spacing:normal;display:inline-block;max-width:100%;overflow-x:auto;vertical-align:middle;-webkit-overflow-scrolling:touch;&quot; class=&quot;js_darkmode__113 js_darkmode__text__696&quot;&gt;&lt;span class=&quot;js_darkmode__text__697&quot;&gt;AliveMsgPeriod&lt;/span&gt;&lt;/code&gt;&lt;span class=&quot;js_darkmode__text__698&quot;&gt;和&lt;/span&gt;&lt;code style=&quot;background: #f5f5f5;color: #c7254e;padding: 2px 5px;border-radius: 3px;font-size: .9em;font-family: Consolas,Menlo,monospace;white-space:nowrap;word-break:normal;word-spacing:normal;letter-spacing:normal;display:inline-block;max-width:100%;overflow-x:auto;vertical-align:middle;-webkit-overflow-scrolling:touch;&quot; class=&quot;js_darkmode__114 js_darkmode__text__699&quot;&gt;&lt;span class=&quot;js_darkmode__text__700&quot;&gt;AliveMsgTolerance&lt;/span&gt;&lt;/code&gt;&lt;span class=&quot;js_darkmode__text__701&quot;&gt;值；检查网络质量&lt;/span&gt;&lt;/section&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h2 style=&quot;font-size: 1.3em;font-weight: bold;color: #000;margin: 1.6em 0 .8em;padding: 0 0 6px;border-bottom: 1px solid #e7e7e7;line-height: 1.45;text-align:left;letter-spacing:normal;word-spacing:normal;&quot; class=&quot;js_darkmode__115 js_darkmode__text__702&quot;&gt;&lt;span class=&quot;js_darkmode__text__703&quot;&gt;适用场景&lt;/span&gt;&lt;/h2&gt;&lt;p style=&quot;word-break: break-word;margin: 1em 0;color: #3e3e3e;text-align:left;letter-spacing:normal;word-spacing:normal;&quot; class=&quot;js_darkmode__116 js_darkmode__text__704&quot;&gt;&lt;strong style=&quot;color: #000;font-weight: bold;display:inline;font-weight:bold;&quot; class=&quot;js_darkmode__117 js_darkmode__text__705&quot;&gt;&lt;span class=&quot;js_darkmode__text__706&quot;&gt;高并发、无状态服务：&lt;/span&gt;&lt;/strong&gt;&lt;span class=&quot;js_darkmode__text__707&quot;&gt;&amp;nbsp;NLB工作在四层，转发效率高、延迟低，适合对性能敏感的场景。单实例可支撑亿级并发连接。但如果业务对请求路由有七层需求（如按URL路径分发），NLB做不了——需要用&lt;span class=&quot;&quot;&gt;ALB&lt;/span&gt;或反向代理。&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;word-break: break-word;margin: 1em 0;color: #3e3e3e;text-align:left;letter-spacing:normal;word-spacing:normal;&quot; class=&quot;js_darkmode__118 js_darkmode__text__708&quot;&gt;&lt;strong style=&quot;color: #000;font-weight: bold;display:inline;font-weight:bold;&quot; class=&quot;js_darkmode__119 js_darkmode__text__709&quot;&gt;&lt;span class=&quot;js_darkmode__text__710&quot;&gt;Windows Server + IIS技术栈：&lt;/span&gt;&lt;/strong&gt;&lt;span class=&quot;js_darkmode__text__711&quot;&gt;&amp;nbsp;这是NLB最经典的落地场景。如果你的团队主要维护Windows Server上的.NET应用，NLB与IIS的集成度是最高的，运维成本也最低。&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;word-break: break-word;margin: 1em 0;color: #3e3e3e;text-align:left;letter-spacing:normal;word-spacing:normal;&quot; class=&quot;js_darkmode__120 js_darkmode__text__712&quot;&gt;&lt;strong style=&quot;color: #000;font-weight: bold;display:inline;font-weight:bold;&quot; class=&quot;js_darkmode__121 js_darkmode__text__713&quot;&gt;&lt;span class=&quot;js_darkmode__text__714&quot;&gt;老旧TCP服务的救星：&lt;/span&gt;&lt;/strong&gt;&lt;span class=&quot;js_darkmode__text__715&quot;&gt;&amp;nbsp;很多.NET团队的后端还有&lt;span class=&quot;&quot;&gt;WCF服务&lt;/span&gt;、自定义TCP绑定的Windows服务、.NET Remoting甚至FTP服务。这些场景下，Nginx/ALB这类七层代理要么原生不支持，要么需要大量改造。NLB工作在四层，不管上层协议是HTTP还是TCP，照单全收，这是NLB相比七层方案的独特优势。&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;word-break: break-word;margin: 1em 0;color: #3e3e3e;text-align:left;letter-spacing:normal;word-spacing:normal;&quot; class=&quot;js_darkmode__122 js_darkmode__text__716&quot;&gt;&lt;strong style=&quot;color: #000;font-weight: bold;display:inline;font-weight:bold;&quot; class=&quot;js_darkmode__123 js_darkmode__text__717&quot;&gt;&lt;span class=&quot;js_darkmode__text__718&quot;&gt;微服务架构：&lt;/span&gt;&lt;/strong&gt;&lt;span class=&quot;js_darkmode__text__719&quot;&gt;&amp;nbsp;通常不建议直接拿NLB做微服务网关。微服务需要七层路由、灰度发布、熔断降级等能力，NLB只提供四层负载均衡。更常见的做法是：NLB作为入口的第一层（四层负载），后端接API网关（如Ocelot、YARP）或Kubernetes Ingress。&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;word-break: break-word;margin: 1em 0;color: #3e3e3e;text-align:left;letter-spacing:normal;word-spacing:normal;&quot; class=&quot;js_darkmode__124 js_darkmode__text__720&quot;&gt;&lt;strong style=&quot;color: #000;font-weight: bold;display:inline;font-weight:bold;&quot; class=&quot;js_darkmode__125 js_darkmode__text__721&quot;&gt;&lt;span class=&quot;js_darkmode__text__722&quot;&gt;单体应用水平扩展：&lt;/span&gt;&lt;/strong&gt;&lt;span class=&quot;js_darkmode__text__723&quot;&gt;&amp;nbsp;NLB非常适合。业务逻辑无状态或状态外置（如Session存Redis），加几台服务器、配好NLB，扩展就完成了。代码零改动。&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;word-break: break-word;margin: 1em 0;color: #3e3e3e;text-align:left;letter-spacing:normal;word-spacing:normal;&quot; class=&quot;js_darkmode__126 js_darkmode__text__724&quot;&gt;&lt;strong style=&quot;color: #000;font-weight: bold;display:inline;font-weight:bold;&quot; class=&quot;js_darkmode__127 js_darkmode__text__725&quot;&gt;&lt;span class=&quot;js_darkmode__text__726&quot;&gt;前置条件：&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;ul style=&quot;margin: 1em 0;padding-left: 1.6em;&quot; class=&quot;js_darkmode__text__727 list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;section class=&quot;js_darkmode__text__729&quot;&gt;&lt;span class=&quot;js_darkmode__text__730&quot;&gt;应用必须是无状态或状态已外置（如Session存Redis/数据库）；如有状态应用依赖本地Session，开启&lt;/span&gt;&lt;code style=&quot;background: #f5f5f5;color: #c7254e;padding: 2px 5px;border-radius: 3px;font-size: .9em;font-family: Consolas,Menlo,monospace;white-space:nowrap;word-break:normal;word-spacing:normal;letter-spacing:normal;display:inline-block;max-width:100%;overflow-x:auto;vertical-align:middle;-webkit-overflow-scrolling:touch;&quot; class=&quot;js_darkmode__129 js_darkmode__text__731&quot;&gt;&lt;span class=&quot;js_darkmode__text__732&quot;&gt;Affinity Single&lt;/span&gt;&lt;/code&gt;&lt;span class=&quot;js_darkmode__text__733&quot;&gt;可基于源IP保持会话粘滞，但客户端IP变化或大量用户挤在同一NAT出口时会失效，需自行评估&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section class=&quot;js_darkmode__text__735&quot;&gt;&lt;span class=&quot;js_darkmode__text__736&quot;&gt;服务器必须在同一二层网络（除非用多播+静态路由）&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section class=&quot;js_darkmode__text__738&quot;&gt;&lt;span class=&quot;js_darkmode__text__739&quot;&gt;所有节点操作系统版本需一致&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section class=&quot;js_darkmode__text__741&quot;&gt;&lt;span class=&quot;js_darkmode__text__742&quot;&gt;网络设备需支持NLB所选的操作模式&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p style=&quot;word-break: break-word;margin: 1em 0;color: #3e3e3e;text-align:left;letter-spacing:normal;word-spacing:normal;&quot; class=&quot;js_darkmode__133 js_darkmode__text__743&quot;&gt;&lt;strong style=&quot;color: #000;font-weight: bold;display:inline;font-weight:bold;&quot; class=&quot;js_darkmode__134 js_darkmode__text__744&quot;&gt;&lt;span class=&quot;js_darkmode__text__745&quot;&gt;风险：&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;ul style=&quot;margin: 1em 0;padding-left: 1.6em;&quot; class=&quot;js_darkmode__text__746 list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;section class=&quot;js_darkmode__text__748&quot;&gt;&lt;span class=&quot;js_darkmode__text__749&quot;&gt;NLB不检测应用健康，应用进程挂了但节点在线，流量照常转发&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section class=&quot;js_darkmode__text__751&quot;&gt;&lt;span class=&quot;js_darkmode__text__752&quot;&gt;单播模式下可能引发交换机洪泛，影响整个网络性能&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section class=&quot;js_darkmode__text__754&quot;&gt;&lt;span class=&quot;js_darkmode__text__755&quot;&gt;不支持跨子网集群（除非借助多播+静态路由等复杂配置）&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2 style=&quot;font-size: 1.3em;font-weight: bold;color: #000;margin: 1.6em 0 .8em;padding: 0 0 6px;border-bottom: 1px solid #e7e7e7;line-height: 1.45;text-align:left;letter-spacing:normal;word-spacing:normal;&quot; class=&quot;js_darkmode__138 js_darkmode__text__756&quot;&gt;&lt;span class=&quot;js_darkmode__text__757&quot;&gt;实战建议&lt;/span&gt;&lt;/h2&gt;&lt;h3 style=&quot;font-size: 1.15em;font-weight: bold;color: #333;margin: 1.4em 0 .6em;text-align:left;letter-spacing:normal;word-spacing:normal;&quot; class=&quot;js_darkmode__139 js_darkmode__text__758&quot;&gt;&lt;span class=&quot;js_darkmode__text__759&quot;&gt;高频坑位1：单播模式导致交换机洪泛&lt;/span&gt;&lt;/h3&gt;&lt;p style=&quot;word-break: break-word;margin: 1em 0;color: #3e3e3e;text-align:left;letter-spacing:normal;word-spacing:normal;&quot; class=&quot;js_darkmode__140 js_darkmode__text__760&quot;&gt;&lt;strong style=&quot;color: #000;font-weight: bold;display:inline;font-weight:bold;&quot; class=&quot;js_darkmode__141 js_darkmode__text__761&quot;&gt;&lt;span class=&quot;js_darkmode__text__762&quot;&gt;触发条件：&lt;/span&gt;&lt;/strong&gt;&lt;span class=&quot;js_darkmode__text__763&quot;&gt;&amp;nbsp;采用默认的单播模式，NLB将所有节点的网卡MAC地址修改为同一个虚拟MAC地址。交换机MAC地址表混乱，将发往VIP的流量广播到所有端口。&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;word-break: break-word;margin: 1em 0;color: #3e3e3e;text-align:left;letter-spacing:normal;word-spacing:normal;&quot; class=&quot;js_darkmode__142 js_darkmode__text__764&quot;&gt;&lt;strong style=&quot;color: #000;font-weight: bold;display:inline;font-weight:bold;&quot; class=&quot;js_darkmode__143 js_darkmode__text__765&quot;&gt;&lt;span class=&quot;js_darkmode__text__766&quot;&gt;错误表现：&lt;/span&gt;&lt;/strong&gt;&lt;span class=&quot;js_darkmode__text__767&quot;&gt;&amp;nbsp;网络性能骤降，非NLB节点也收到大量无关广播包，严重时整个网段瘫痪。&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;word-break: break-word;margin: 1em 0;color: #3e3e3e;text-align:left;letter-spacing:normal;word-spacing:normal;&quot; class=&quot;js_darkmode__144 js_darkmode__text__768&quot;&gt;&lt;strong style=&quot;color: #000;font-weight: bold;display:inline;font-weight:bold;&quot; class=&quot;js_darkmode__145 js_darkmode__text__769&quot;&gt;&lt;span class=&quot;js_darkmode__text__770&quot;&gt;修复策略：&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;ul style=&quot;margin: 1em 0;padding-left: 1.6em;&quot; class=&quot;js_darkmode__text__771 list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;section class=&quot;js_darkmode__text__773&quot;&gt;&lt;span class=&quot;js_darkmode__text__774&quot;&gt;方案A：改用多播模式（需在交换机配置静态ARP和MAC表项）&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section class=&quot;js_darkmode__text__776&quot;&gt;&lt;span class=&quot;js_darkmode__text__777&quot;&gt;方案B：在交换机和NLB节点之间加一台Hub&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section class=&quot;js_darkmode__text__779&quot;&gt;&lt;span class=&quot;js_darkmode__text__780&quot;&gt;方案C：为NLB节点单独划分VLAN&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section class=&quot;js_darkmode__text__782&quot;&gt;&lt;span class=&quot;js_darkmode__text__783&quot;&gt;方案D：启用IGMP多播模式（需交换机支持IGMP Snooping）&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p style=&quot;word-break: break-word;margin: 1em 0;color: #3e3e3e;text-align:left;letter-spacing:normal;word-spacing:normal;&quot; class=&quot;js_darkmode__150 js_darkmode__text__784&quot;&gt;&lt;span class=&quot;js_darkmode__text__785&quot;&gt;图形化修改操作模式：右键集群 → “群集属性” → “群集参数”选项卡 → 将“群集操作模式”从“单播”改为“多播”或“IGMP多播”。&lt;/span&gt;&lt;/p&gt;&lt;h3 style=&quot;font-size: 1.15em;font-weight: bold;color: #333;margin: 1.4em 0 .6em;text-align:left;letter-spacing:normal;word-spacing:normal;&quot; class=&quot;js_darkmode__151 js_darkmode__text__786&quot;&gt;&lt;span class=&quot;js_darkmode__text__787&quot;&gt;高频坑位2：应用挂了但节点还在集群里&lt;/span&gt;&lt;/h3&gt;&lt;p style=&quot;word-break: break-word;margin: 1em 0;color: #3e3e3e;text-align:left;letter-spacing:normal;word-spacing:normal;&quot; class=&quot;js_darkmode__152 js_darkmode__text__788&quot;&gt;&lt;strong style=&quot;color: #000;font-weight: bold;display:inline;font-weight:bold;&quot; class=&quot;js_darkmode__153 js_darkmode__text__789&quot;&gt;&lt;span class=&quot;js_darkmode__text__790&quot;&gt;触发条件：&lt;/span&gt;&lt;/strong&gt;&lt;span class=&quot;js_darkmode__text__791&quot;&gt;&amp;nbsp;IIS或ASP.NET Core进程崩溃，但操作系统正常运行，NLB心跳正常发送。&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;word-break: break-word;margin: 1em 0;color: #3e3e3e;text-align:left;letter-spacing:normal;word-spacing:normal;&quot; class=&quot;js_darkmode__154 js_darkmode__text__792&quot;&gt;&lt;strong style=&quot;color: #000;font-weight: bold;display:inline;font-weight:bold;&quot; class=&quot;js_darkmode__155 js_darkmode__text__793&quot;&gt;&lt;span class=&quot;js_darkmode__text__794&quot;&gt;错误表现：&lt;/span&gt;&lt;/strong&gt;&lt;span class=&quot;js_darkmode__text__795&quot;&gt;&amp;nbsp;部分请求返回500或超时，监控显示节点在线但服务不可用。&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;word-break: break-word;margin: 1em 0;color: #3e3e3e;text-align:left;letter-spacing:normal;word-spacing:normal;&quot; class=&quot;js_darkmode__156 js_darkmode__text__796&quot;&gt;&lt;strong style=&quot;color: #000;font-weight: bold;display:inline;font-weight:bold;&quot; class=&quot;js_darkmode__157 js_darkmode__text__797&quot;&gt;&lt;span class=&quot;js_darkmode__text__798&quot;&gt;修复策略：&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;ul style=&quot;margin: 1em 0;padding-left: 1.6em;&quot; class=&quot;js_darkmode__text__799 list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;section class=&quot;js_darkmode__text__801&quot;&gt;&lt;span class=&quot;js_darkmode__text__802&quot;&gt;部署外部健康检查脚本，定时探测应用端口/健康检查接口，发现问题时通过PowerShell暂停该节点的NLB服务&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section class=&quot;js_darkmode__text__804&quot;&gt;&lt;span class=&quot;js_darkmode__text__805&quot;&gt;或在前端再加一层ARR（Application Request Routing），由ARR做七层健康检查&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section class=&quot;js_darkmode__text__807&quot;&gt;&lt;span class=&quot;js_darkmode__text__808&quot;&gt;廉价平替方案：用Windows任务计划程序，写一个PowerShell脚本每分钟执行&lt;/span&gt;&lt;code style=&quot;background: #f5f5f5;color: #c7254e;padding: 2px 5px;border-radius: 3px;font-size: .9em;font-family: Consolas,Menlo,monospace;white-space:nowrap;word-break:normal;word-spacing:normal;letter-spacing:normal;display:inline-block;max-width:100%;overflow-x:auto;vertical-align:middle;-webkit-overflow-scrolling:touch;&quot; class=&quot;js_darkmode__161 js_darkmode__text__809&quot;&gt;&lt;span class=&quot;js_darkmode__text__810&quot;&gt;Invoke-WebRequest&lt;/span&gt;&lt;/code&gt;&lt;span class=&quot;js_darkmode__text__811&quot;&gt;访问本机&lt;/span&gt;&lt;code style=&quot;background: #f5f5f5;color: #c7254e;padding: 2px 5px;border-radius: 3px;font-size: .9em;font-family: Consolas,Menlo,monospace;white-space:nowrap;word-break:normal;word-spacing:normal;letter-spacing:normal;display:inline-block;max-width:100%;overflow-x:auto;vertical-align:middle;-webkit-overflow-scrolling:touch;&quot; class=&quot;js_darkmode__162 js_darkmode__text__812&quot;&gt;&lt;span class=&quot;js_darkmode__text__813&quot;&gt;localhost&lt;/span&gt;&lt;/code&gt;&lt;span class=&quot;js_darkmode__text__814&quot;&gt;的健康检查接口。如果连续3次返回非200状态码，执行&lt;/span&gt;&lt;code style=&quot;background: #f5f5f5;color: #c7254e;padding: 2px 5px;border-radius: 3px;font-size: .9em;font-family: Consolas,Menlo,monospace;white-space:nowrap;word-break:normal;word-spacing:normal;letter-spacing:normal;display:inline-block;max-width:100%;overflow-x:auto;vertical-align:middle;-webkit-overflow-scrolling:touch;&quot; class=&quot;js_darkmode__163 js_darkmode__text__815&quot;&gt;&lt;span class=&quot;js_darkmode__text__816&quot;&gt;Stop-NlbClusterNode -NodeName $env:COMPUTERNAME&lt;/span&gt;&lt;/code&gt;&lt;span class=&quot;js_darkmode__text__817&quot;&gt;让节点自残下线；应用恢复后再通过脚本执行&lt;/span&gt;&lt;code style=&quot;background: #f5f5f5;color: #c7254e;padding: 2px 5px;border-radius: 3px;font-size: .9em;font-family: Consolas,Menlo,monospace;white-space:nowrap;word-break:normal;word-spacing:normal;letter-spacing:normal;display:inline-block;max-width:100%;overflow-x:auto;vertical-align:middle;-webkit-overflow-scrolling:touch;&quot; class=&quot;js_darkmode__164 js_darkmode__text__818&quot;&gt;&lt;span class=&quot;js_darkmode__text__819&quot;&gt;Start-NlbClusterNode -NodeName $env:COMPUTERNAME&lt;/span&gt;&lt;/code&gt;&lt;span class=&quot;js_darkmode__text__820&quot;&gt;重新上线。这是成本最低的应用级健康检查方案。&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3 style=&quot;font-size: 1.15em;font-weight: bold;color: #333;margin: 1.4em 0 .6em;text-align:left;letter-spacing:normal;word-spacing:normal;&quot; class=&quot;js_darkmode__165 js_darkmode__text__821&quot;&gt;&lt;span class=&quot;js_darkmode__text__822&quot;&gt;高频坑位3：跨Windows Server版本的节点混用&lt;/span&gt;&lt;/h3&gt;&lt;p style=&quot;word-break: break-word;margin: 1em 0;color: #3e3e3e;text-align:left;letter-spacing:normal;word-spacing:normal;&quot; class=&quot;js_darkmode__166 js_darkmode__text__823&quot;&gt;&lt;strong style=&quot;color: #000;font-weight: bold;display:inline;font-weight:bold;&quot; class=&quot;js_darkmode__167 js_darkmode__text__824&quot;&gt;&lt;span class=&quot;js_darkmode__text__825&quot;&gt;触发条件：&lt;/span&gt;&lt;/strong&gt;&lt;span class=&quot;js_darkmode__text__826&quot;&gt;&amp;nbsp;集群中混用不同版本的Windows Server（如2016和2019）。&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;word-break: break-word;margin: 1em 0;color: #3e3e3e;text-align:left;letter-spacing:normal;word-spacing:normal;&quot; class=&quot;js_darkmode__168 js_darkmode__text__827&quot;&gt;&lt;strong style=&quot;color: #000;font-weight: bold;display:inline;font-weight:bold;&quot; class=&quot;js_darkmode__169 js_darkmode__text__828&quot;&gt;&lt;span class=&quot;js_darkmode__text__829&quot;&gt;错误表现：&lt;/span&gt;&lt;/strong&gt;&lt;span class=&quot;js_darkmode__text__830&quot;&gt;&amp;nbsp;节点无法聚合、心跳异常、流量分发不规则。实测跨版本混用存在较高概率的兼容性问题。&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;word-break: break-word;margin: 1em 0;color: #3e3e3e;text-align:left;letter-spacing:normal;word-spacing:normal;&quot; class=&quot;js_darkmode__170 js_darkmode__text__831&quot;&gt;&lt;strong style=&quot;color: #000;font-weight: bold;display:inline;font-weight:bold;&quot; class=&quot;js_darkmode__171 js_darkmode__text__832&quot;&gt;&lt;span class=&quot;js_darkmode__text__833&quot;&gt;修复策略：&lt;/span&gt;&lt;/strong&gt;&lt;span class=&quot;js_darkmode__text__834&quot;&gt;&amp;nbsp;所有NLB节点统一使用相同版本的操作系统镜像。规划阶段就明确版本标准，避免临时拼凑。&lt;/span&gt;&lt;/p&gt;&lt;h3 style=&quot;font-size: 1.15em;font-weight: bold;color: #333;margin: 1.4em 0 .6em;text-align:left;letter-spacing:normal;word-spacing:normal;&quot; class=&quot;js_darkmode__172 js_darkmode__text__835&quot;&gt;&lt;span class=&quot;js_darkmode__text__836&quot;&gt;其他建议&lt;/span&gt;&lt;/h3&gt;&lt;ul style=&quot;margin: 1em 0;padding-left: 1.6em;&quot; class=&quot;js_darkmode__text__837 list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;section class=&quot;js_darkmode__text__839&quot;&gt;&lt;span class=&quot;js_darkmode__text__840&quot;&gt;建议为NLB心跳配置独立网卡，避免心跳流量与业务流量互相干扰&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section class=&quot;js_darkmode__text__842&quot;&gt;&lt;span class=&quot;js_darkmode__text__843&quot;&gt;节点下线时优先用“排空”（Drainstop）而非直接“停止”，避免粗暴切断现有连接&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section class=&quot;js_darkmode__text__845&quot;&gt;&lt;span class=&quot;js_darkmode__text__846&quot;&gt;部署新版本时，逐台摘节点、更新、加回，实现零停机发布&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section class=&quot;js_darkmode__text__848&quot;&gt;&lt;span class=&quot;js_darkmode__text__849&quot;&gt;定期检查事件日志中的NLB相关警告（Event ID 34等）&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section class=&quot;js_darkmode__text__851&quot;&gt;&lt;span class=&quot;js_darkmode__text__852&quot;&gt;图形化管理器支持远程管理其他服务器的NLB集群：打开管理器 → “群集”菜单 → “连接到现存的” → 输入目标集群的任意节点IP&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2 style=&quot;font-size: 1.3em;font-weight: bold;color: #000;margin: 1.6em 0 .8em;padding: 0 0 6px;border-bottom: 1px solid #e7e7e7;line-height: 1.45;text-align:left;letter-spacing:normal;word-spacing:normal;&quot; class=&quot;js_darkmode__178 js_darkmode__text__853&quot;&gt;&lt;span class=&quot;js_darkmode__text__854&quot;&gt;选型建议&lt;/span&gt;&lt;/h2&gt;&lt;p style=&quot;word-break: break-word;margin: 1em 0;color: #3e3e3e;text-align:left;letter-spacing:normal;word-spacing:normal;&quot; class=&quot;js_darkmode__179 js_darkmode__text__855&quot;&gt;&lt;strong style=&quot;color: #000;font-weight: bold;display:inline;font-weight:bold;&quot; class=&quot;js_darkmode__180 js_darkmode__text__856&quot;&gt;&lt;span class=&quot;js_darkmode__text__857&quot;&gt;更适合NLB的场景：&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;ul style=&quot;margin: 1em 0;padding-left: 1.6em;&quot; class=&quot;js_darkmode__text__858 list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;section class=&quot;js_darkmode__text__860&quot;&gt;&lt;span class=&quot;js_darkmode__text__861&quot;&gt;团队以Windows Server运维为主，不想引入额外的负载均衡软件&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section class=&quot;js_darkmode__text__863&quot;&gt;&lt;span class=&quot;js_darkmode__text__864&quot;&gt;应用是传统的.NET Framework + IIS，改造为容器化或云原生成本高&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section class=&quot;js_darkmode__text__866&quot;&gt;&lt;span class=&quot;js_darkmode__text__867&quot;&gt;只需要四层负载均衡，没有七层路由需求&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section class=&quot;js_darkmode__text__869&quot;&gt;&lt;span class=&quot;js_darkmode__text__870&quot;&gt;服务器数量不多（2-8台），网络环境可控&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section class=&quot;js_darkmode__text__872&quot;&gt;&lt;span class=&quot;js_darkmode__text__873&quot;&gt;对延迟敏感，需要四层的高转发效率&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section class=&quot;js_darkmode__text__875&quot;&gt;&lt;span class=&quot;js_darkmode__text__876&quot;&gt;需要负载均衡的服务不是HTTP协议（如WCF、自定义TCP服务、FTP等）&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p style=&quot;word-break: break-word;margin: 1em 0;color: #3e3e3e;text-align:left;letter-spacing:normal;word-spacing:normal;&quot; class=&quot;js_darkmode__187 js_darkmode__text__877&quot;&gt;&lt;strong style=&quot;color: #000;font-weight: bold;display:inline;font-weight:bold;&quot; class=&quot;js_darkmode__188 js_darkmode__text__878&quot;&gt;&lt;span class=&quot;js_darkmode__text__879&quot;&gt;不太适合NLB的场景：&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;ul style=&quot;margin: 1em 0;padding-left: 1.6em;&quot; class=&quot;js_darkmode__text__880 list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;section class=&quot;js_darkmode__text__882&quot;&gt;&lt;span class=&quot;js_darkmode__text__883&quot;&gt;需要七层路由（按URL、Header分发）——选ALB或反向代理（Nginx、YARP）&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section class=&quot;js_darkmode__text__885&quot;&gt;&lt;span class=&quot;js_darkmode__text__886&quot;&gt;服务器分布在多个子网或混合云环境——选云厂商LB或软件定义LB&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section class=&quot;js_darkmode__text__888&quot;&gt;&lt;span class=&quot;js_darkmode__text__889&quot;&gt;应用严重依赖本地Session，且客户端网络环境复杂（如移动端频繁切换IP，或大量客户端隐匿在同一个企业NAT大网IP后面导致负载极度不均衡）——NLB基于IP的亲和性在NAT场景下会失效&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section class=&quot;js_darkmode__text__891&quot;&gt;&lt;span class=&quot;js_darkmode__text__892&quot;&gt;需要细粒度的健康检查（如检查具体API返回值）——NLB只做端口级检测&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section class=&quot;js_darkmode__text__894&quot;&gt;&lt;span class=&quot;js_darkmode__text__895&quot;&gt;团队对Linux更熟悉、没有Windows Server运维能力&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p style=&quot;word-break: break-word;margin: 1em 0;color: #3e3e3e;text-align:left;letter-spacing:normal;word-spacing:normal;&quot; class=&quot;js_darkmode__194 js_darkmode__text__896&quot;&gt;&lt;strong style=&quot;color: #000;font-weight: bold;display:inline;font-weight:bold;&quot; class=&quot;js_darkmode__195 js_darkmode__text__897&quot;&gt;&lt;span class=&quot;js_darkmode__text__898&quot;&gt;判断倾向：&lt;/span&gt;&lt;/strong&gt;&lt;span class=&quot;js_darkmode__text__899&quot;&gt;&amp;nbsp;如果你的应用跑在Windows Server上、只需要四层负载均衡，NLB是一个值得优先考虑的方案——成本低、上手快、与Windows生态集成好。但如果网络环境复杂或对七层路由有要求，不要把NLB硬撑到它不擅长的领域，前端加一层Nginx或YARP是更稳妥的做法。&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;word-break: break-word;margin: 1em 0;color: #3e3e3e;text-align:left;letter-spacing:normal;word-spacing:normal;&quot; class=&quot;js_darkmode__196 js_darkmode__text__900&quot;&gt;&lt;strong style=&quot;color: #000;font-weight: bold;display:inline;font-weight:bold;&quot; class=&quot;js_darkmode__197 js_darkmode__text__901&quot;&gt;&lt;span class=&quot;js_darkmode__text__902&quot;&gt;参考建议：&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;ul style=&quot;margin: 1em 0;padding-left: 1.6em;&quot; class=&quot;js_darkmode__text__903 list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;section class=&quot;js_darkmode__text__905&quot;&gt;&lt;span class=&quot;js_darkmode__text__906&quot;&gt;小团队（2-3人）、并发量不大（百万级以下）、上线周期紧：NLB可以快速落地&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section class=&quot;js_darkmode__text__908&quot;&gt;&lt;span class=&quot;js_darkmode__text__909&quot;&gt;中大规模（并发千万级以上）、有专职运维：建议NLB + ARR组合，或云厂商LB&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section class=&quot;js_darkmode__text__911&quot;&gt;&lt;span class=&quot;js_darkmode__text__912&quot;&gt;容器化/K8s环境：不用NLB，用Ingress Controller或Service LoadBalancer&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2 style=&quot;font-size: 1.3em;font-weight: bold;color: #000;margin: 1.6em 0 .8em;padding: 0 0 6px;border-bottom: 1px solid #e7e7e7;line-height: 1.45;text-align:left;letter-spacing:normal;word-spacing:normal;&quot; class=&quot;js_darkmode__201 js_darkmode__text__913&quot;&gt;&lt;span class=&quot;js_darkmode__text__914&quot;&gt;总结收尾&lt;/span&gt;&lt;/h2&gt;&lt;p style=&quot;word-break: break-word;margin: 1em 0;color: #3e3e3e;text-align:left;letter-spacing:normal;word-spacing:normal;&quot; class=&quot;js_darkmode__202 js_darkmode__text__915&quot;&gt;&lt;span class=&quot;js_darkmode__text__916&quot;&gt;NLB解决的是Windows Server环境下多台服务器之间流量分发和故障转移的问题——开箱即用、不改代码、运维友好。图形化管理器让不熟悉命令行的运维人员也能十分钟内搭起一套集群。但它不检测应用健康、网络配置有坑，也不是七层路由的替代方案。如果你们的应用跑在Windows Server上、无状态、只需要四层负载均衡，NLB值得认真考虑；如果需要七层能力或网络环境复杂，别硬撑，加一层Nginx或YARP更稳妥。先从一个最小集群试起来，把网络模式和健康检查想清楚，再往生产推。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Tue, 14 Jul 2026 09:20:02 +0800</pubDate></item><item><title>前端又一个 “全家桶” 出现了！</title><link>https://www.codepub.top/post/625.html</link><description>&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(0, 0, 0); font-size: 16px; line-height: 1.8em; letter-spacing: 0em; text-align: left; text-indent: 0em; margin: 0px; padding: 8px 0px; visibility: visible;&quot; class=&quot;js_darkmode__1&quot;&gt;&lt;span style=&quot;visibility: visible;&quot;&gt;做后台系统的人，迟早都会碰到一个需求：&lt;/span&gt;&lt;/p&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(0, 0, 0); font-size: 16px; line-height: 1.8em; letter-spacing: 0em; text-align: left; text-indent: 0em; margin: 0px; padding: 8px 0px; visibility: visible;&quot; class=&quot;js_darkmode__2&quot;&gt;&lt;strong style=&quot;color: rgb(0, 0, 0); font-weight: bold; background: none 0% 0% / auto no-repeat scroll padding-box border-box rgba(0, 0, 0, 0); width: auto; height: auto; margin: 0px; padding: 0px; border-style: none; border-width: 3px; border-color: rgba(0, 0, 0, 0.4); border-radius: 0px; visibility: visible;&quot; class=&quot;js_darkmode__3&quot;&gt;&lt;span style=&quot;visibility: visible;&quot;&gt;附件在线预览。&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(0, 0, 0); font-size: 16px; line-height: 1.8em; letter-spacing: 0em; text-align: left; text-indent: 0em; margin: 0px; padding: 8px 0px; visibility: visible;&quot; class=&quot;js_darkmode__4&quot;&gt;&lt;span style=&quot;visibility: visible;&quot;&gt;一开始看着很简单，图片直接展示，&lt;/span&gt;&lt;code style=&quot;color: rgb(30, 107, 184); font-size: 14px; line-height: 1.8em; letter-spacing: 0em; background: none 0% 0% / auto no-repeat scroll padding-box border-box rgba(27, 31, 35, 0.05); width: auto; height: auto; margin: 0px 2px; padding: 2px 4px; border-style: none; border-width: 3px; border-color: rgb(0, 0, 0) rgba(0, 0, 0, 0.4) rgba(0, 0, 0, 0.4); border-radius: 4px; overflow-wrap: break-word; font-family: Consolas, Monaco, Menlo, monospace; word-break: break-all; visibility: visible;&quot; class=&quot;js_darkmode__5&quot;&gt;&lt;span style=&quot;visibility: visible;&quot;&gt;PDF&lt;/span&gt;&lt;/code&gt;&lt;span style=&quot;visibility: visible;&quot;&gt;&amp;nbsp;接个&amp;nbsp;&lt;/span&gt;&lt;code style=&quot;color: rgb(30, 107, 184); font-size: 14px; line-height: 1.8em; letter-spacing: 0em; background: none 0% 0% / auto no-repeat scroll padding-box border-box rgba(27, 31, 35, 0.05); width: auto; height: auto; margin: 0px 2px; padding: 2px 4px; border-style: none; border-width: 3px; border-color: rgb(0, 0, 0) rgba(0, 0, 0, 0.4) rgba(0, 0, 0, 0.4); border-radius: 4px; overflow-wrap: break-word; font-family: Consolas, Monaco, Menlo, monospace; word-break: break-all; visibility: visible;&quot; class=&quot;js_darkmode__6&quot;&gt;&lt;span style=&quot;visibility: visible;&quot;&gt;pdf.js&lt;/span&gt;&lt;/code&gt;&lt;span style=&quot;visibility: visible;&quot;&gt;，文本塞进代码编辑器，视频交给浏览器。&lt;/span&gt;&lt;/p&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(0, 0, 0); font-size: 16px; line-height: 1.8em; letter-spacing: 0em; text-align: left; text-indent: 0em; margin: 0px; padding: 8px 0px; visibility: visible;&quot; class=&quot;js_darkmode__7&quot;&gt;&lt;span style=&quot;visibility: visible;&quot;&gt;真正麻烦的是后面。&lt;/span&gt;&lt;/p&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(0, 0, 0); font-size: 16px; line-height: 1.8em; letter-spacing: 0em; text-align: left; text-indent: 0em; margin: 0px; padding: 8px 0px; visibility: visible;&quot; class=&quot;js_darkmode__8&quot;&gt;&lt;span style=&quot;visibility: visible;&quot;&gt;用户开始上传&amp;nbsp;&lt;/span&gt;&lt;code style=&quot;color: rgb(30, 107, 184); font-size: 14px; line-height: 1.8em; letter-spacing: 0em; background: none 0% 0% / auto no-repeat scroll padding-box border-box rgba(27, 31, 35, 0.05); width: auto; height: auto; margin: 0px 2px; padding: 2px 4px; border-style: none; border-width: 3px; border-color: rgb(0, 0, 0) rgba(0, 0, 0, 0.4) rgba(0, 0, 0, 0.4); border-radius: 4px; overflow-wrap: break-word; font-family: Consolas, Monaco, Menlo, monospace; word-break: break-all; visibility: visible;&quot; class=&quot;js_darkmode__9&quot;&gt;&lt;span style=&quot;visibility: visible;&quot;&gt;doc&lt;/span&gt;&lt;/code&gt;&lt;span style=&quot;visibility: visible;&quot;&gt;、&lt;/span&gt;&lt;code style=&quot;color: rgb(30, 107, 184); font-size: 14px; line-height: 1.8em; letter-spacing: 0em; background: none 0% 0% / auto no-repeat scroll padding-box border-box rgba(27, 31, 35, 0.05); width: auto; height: auto; margin: 0px 2px; padding: 2px 4px; border-style: none; border-width: 3px; border-color: rgb(0, 0, 0) rgba(0, 0, 0, 0.4) rgba(0, 0, 0, 0.4); border-radius: 4px; overflow-wrap: break-word; font-family: Consolas, Monaco, Menlo, monospace; word-break: break-all; visibility: visible;&quot; class=&quot;js_darkmode__10&quot;&gt;&lt;span style=&quot;visibility: visible;&quot;&gt;xls&lt;/span&gt;&lt;/code&gt;&lt;span style=&quot;visibility: visible;&quot;&gt;、&lt;/span&gt;&lt;code style=&quot;color: rgb(30, 107, 184); font-size: 14px; line-height: 1.8em; letter-spacing: 0em; background: none 0% 0% / auto no-repeat scroll padding-box border-box rgba(27, 31, 35, 0.05); width: auto; height: auto; margin: 0px 2px; padding: 2px 4px; border-style: none; border-width: 3px; border-color: rgb(0, 0, 0) rgba(0, 0, 0, 0.4) rgba(0, 0, 0, 0.4); border-radius: 4px; overflow-wrap: break-word; font-family: Consolas, Monaco, Menlo, monospace; word-break: break-all; visibility: visible;&quot; class=&quot;js_darkmode__11&quot;&gt;&lt;span style=&quot;visibility: visible;&quot;&gt;pptx&lt;/span&gt;&lt;/code&gt;&lt;span style=&quot;visibility: visible;&quot;&gt;、&lt;/span&gt;&lt;code style=&quot;color: rgb(30, 107, 184); font-size: 14px; line-height: 1.8em; letter-spacing: 0em; background: none 0% 0% / auto no-repeat scroll padding-box border-box rgba(27, 31, 35, 0.05); width: auto; height: auto; margin: 0px 2px; padding: 2px 4px; border-style: none; border-width: 3px; border-color: rgb(0, 0, 0) rgba(0, 0, 0, 0.4) rgba(0, 0, 0, 0.4); border-radius: 4px; overflow-wrap: break-word; font-family: Consolas, Monaco, Menlo, monospace; word-break: break-all; visibility: visible;&quot; class=&quot;js_darkmode__12&quot;&gt;&lt;span style=&quot;visibility: visible;&quot;&gt;wps&lt;/span&gt;&lt;/code&gt;&lt;span style=&quot;visibility: visible;&quot;&gt;、&lt;/span&gt;&lt;code style=&quot;color: rgb(30, 107, 184); font-size: 14px; line-height: 1.8em; letter-spacing: 0em; background: none 0% 0% / auto no-repeat scroll padding-box border-box rgba(27, 31, 35, 0.05); width: auto; height: auto; margin: 0px 2px; padding: 2px 4px; border-style: none; border-width: 3px; border-color: rgb(0, 0, 0) rgba(0, 0, 0, 0.4) rgba(0, 0, 0, 0.4); border-radius: 4px; overflow-wrap: break-word; font-family: Consolas, Monaco, Menlo, monospace; word-break: break-all; visibility: visible;&quot; class=&quot;js_darkmode__13&quot;&gt;&lt;span style=&quot;visibility: visible;&quot;&gt;et&lt;/span&gt;&lt;/code&gt;&lt;span style=&quot;visibility: visible;&quot;&gt;，再混进压缩包、邮件、图纸、代码文件，原本一个小功能，很快就变成一套独立系统。&lt;/span&gt;&lt;/p&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(0, 0, 0); font-size: 16px; line-height: 1.8em; letter-spacing: 0em; text-align: left; text-indent: 0em; margin: 0px; padding: 8px 0px; visibility: visible;&quot; class=&quot;js_darkmode__14&quot;&gt;&lt;span style=&quot;visibility: visible;&quot;&gt;我自己也被这个问题折腾过很多次。&lt;/span&gt;&lt;/p&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(0, 0, 0); font-size: 16px; line-height: 1.8em; letter-spacing: 0em; text-align: left; text-indent: 0em; margin: 0px; padding: 8px 0px; visibility: visible;&quot; class=&quot;js_darkmode__15&quot;&gt;&lt;span style=&quot;visibility: visible;&quot;&gt;所以我做了一个文件预览&amp;nbsp;&lt;/span&gt;&lt;strong style=&quot;color: rgb(0, 0, 0); font-weight: bold; background: none 0% 0% / auto no-repeat scroll padding-box border-box rgba(0, 0, 0, 0); width: auto; height: auto; margin: 0px; padding: 0px; border-style: none; border-width: 3px; border-color: rgba(0, 0, 0, 0.4); border-radius: 0px; visibility: visible;&quot; class=&quot;js_darkmode__16&quot;&gt;&lt;span style=&quot;visibility: visible;&quot;&gt;SDK&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;visibility: visible;&quot;&gt;：&lt;/span&gt;&lt;/p&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(0, 0, 0); font-size: 16px; line-height: 1.8em; letter-spacing: 0em; text-align: left; text-indent: 0em; margin: 0px; padding: 8px 0px; visibility: visible;&quot; class=&quot;js_darkmode__17&quot;&gt;&lt;strong style=&quot;color: rgb(0, 0, 0); font-weight: bold; background: none 0% 0% / auto no-repeat scroll padding-box border-box rgba(0, 0, 0, 0); width: auto; height: auto; margin: 0px; padding: 0px; border-style: none; border-width: 3px; border-color: rgba(0, 0, 0, 0.4); border-radius: 0px; visibility: visible;&quot; class=&quot;js_darkmode__18&quot;&gt;&lt;span style=&quot;visibility: visible;&quot;&gt;Open File Viewer。&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;figure data-tool=&quot;mdnice编辑器&quot; style=&quot;margin: 10px 0px; padding: 0px; display: flex; flex-direction: column; justify-content: center; align-items: center; visibility: visible;&quot;&gt;&lt;span style=&quot;visibility: visible;&quot;&gt;&lt;img data-src=&quot;https://mmbiz.qpic.cn/mmbiz_jpg/7YalpHdlCYic0oUpbiaaFgzPEn2zQ5a2WeK9yKttfJJCHFf7jI0nrToamxsz63ufKb1ibB1d3icsJHEiaz7re1l8ibxkjrjmBIy60PoMD6vH3aJhk/640?wx_fmt=webp&amp;amp;from=appmsg#imgIndex=0&quot; class=&quot;rich_pages wxw-img js_darkmode__19&quot; data-ratio=&quot;0.5425925925925926&quot; data-type=&quot;webp&quot; data-w=&quot;1080&quot; style=&quot;display: block; margin: 0px auto; max-width: 100%; border-style: none; border-width: 3px; border-color: rgba(0, 0, 0, 0.4); border-radius: 0px; object-fit: fill; box-shadow: rgba(0, 0, 0, 0) 0px 0px 0px 0px; height: auto !important; visibility: visible !important; width: 594px !important;&quot; data-imgfileid=&quot;100040509&quot; data-aistatus=&quot;1&quot; data-original-style=&quot;display: block;margin-top: 0px;margin-right: auto;margin-bottom: 0px;margin-left: auto;max-width: 100%;border-top-style: none;border-bottom-style: none;border-left-style: none;border-right-style: none;border-top-width: 3px;border-bottom-width: 3px;border-left-width: 3px;border-right-width: 3px;border-top-color: rgba(0, 0, 0, 0.4);border-bottom-color: rgba(0, 0, 0, 0.4);border-left-color: rgba(0, 0, 0, 0.4);border-right-color: rgba(0, 0, 0, 0.4);border-top-left-radius: 0px;border-top-right-radius: 0px;border-bottom-right-radius: 0px;border-bottom-left-radius: 0px;object-fit: fill;box-shadow: rgba(0, 0, 0, 0) 0px 0px 0px 0px;&quot; data-index=&quot;3&quot; src=&quot;https://mmbiz.qpic.cn/mmbiz_jpg/7YalpHdlCYic0oUpbiaaFgzPEn2zQ5a2WeK9yKttfJJCHFf7jI0nrToamxsz63ufKb1ibB1d3icsJHEiaz7re1l8ibxkjrjmBIy60PoMD6vH3aJhk/640?wx_fmt=webp&amp;from=appmsg&amp;tp=wxpic&amp;wxfrom=5&amp;wx_lazy=1#imgIndex=0&quot; _width=&quot;614px&quot; alt=&quot;图片&quot; data-before-load-time=&quot;1783923772716&quot; data-report-img-idx=&quot;1&quot; data-fail=&quot;0&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;&lt;/p&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(0, 0, 0); font-size: 16px; line-height: 1.8em; letter-spacing: 0em; text-align: left; text-indent: 0em; margin: 0px; padding: 8px 0px; visibility: visible;&quot; class=&quot;js_darkmode__20&quot;&gt;&lt;span style=&quot;visibility: visible;&quot;&gt;目前已经支持原生&amp;nbsp;&lt;/span&gt;&lt;code style=&quot;color: rgb(30, 107, 184); font-size: 14px; line-height: 1.8em; letter-spacing: 0em; background: none 0% 0% / auto no-repeat scroll padding-box border-box rgba(27, 31, 35, 0.05); width: auto; height: auto; margin: 0px 2px; padding: 2px 4px; border-style: none; border-width: 3px; border-color: rgb(0, 0, 0) rgba(0, 0, 0, 0.4) rgba(0, 0, 0, 0.4); border-radius: 4px; overflow-wrap: break-word; font-family: Consolas, Monaco, Menlo, monospace; word-break: break-all; visibility: visible;&quot; class=&quot;js_darkmode__21&quot;&gt;&lt;span style=&quot;visibility: visible;&quot;&gt;JavaScript&lt;/span&gt;&lt;/code&gt;&lt;span style=&quot;visibility: visible;&quot;&gt;、&lt;/span&gt;&lt;code style=&quot;color: rgb(30, 107, 184); font-size: 14px; line-height: 1.8em; letter-spacing: 0em; background: none 0% 0% / auto no-repeat scroll padding-box border-box rgba(27, 31, 35, 0.05); width: auto; height: auto; margin: 0px 2px; padding: 2px 4px; border-style: none; border-width: 3px; border-color: rgb(0, 0, 0) rgba(0, 0, 0, 0.4) rgba(0, 0, 0, 0.4); border-radius: 4px; overflow-wrap: break-word; font-family: Consolas, Monaco, Menlo, monospace; word-break: break-all; visibility: visible;&quot; class=&quot;js_darkmode__22&quot;&gt;&lt;span style=&quot;visibility: visible;&quot;&gt;Vue&lt;/span&gt;&lt;/code&gt;&lt;span style=&quot;visibility: visible;&quot;&gt;、&lt;/span&gt;&lt;code style=&quot;color: rgb(30, 107, 184); font-size: 14px; line-height: 1.8em; letter-spacing: 0em; background: none 0% 0% / auto no-repeat scroll padding-box border-box rgba(27, 31, 35, 0.05); width: auto; height: auto; margin: 0px 2px; padding: 2px 4px; border-style: none; border-width: 3px; border-color: rgb(0, 0, 0) rgba(0, 0, 0, 0.4) rgba(0, 0, 0, 0.4); border-radius: 4px; overflow-wrap: break-word; font-family: Consolas, Monaco, Menlo, monospace; word-break: break-all; visibility: visible;&quot; class=&quot;js_darkmode__23&quot;&gt;&lt;span style=&quot;visibility: visible;&quot;&gt;React&lt;/span&gt;&lt;/code&gt;&lt;span style=&quot;visibility: visible;&quot;&gt;、&lt;/span&gt;&lt;code style=&quot;color: rgb(30, 107, 184); font-size: 14px; line-height: 1.8em; letter-spacing: 0em; background: none 0% 0% / auto no-repeat scroll padding-box border-box rgba(27, 31, 35, 0.05); width: auto; height: auto; margin: 0px 2px; padding: 2px 4px; border-style: none; border-width: 3px; border-color: rgb(0, 0, 0) rgba(0, 0, 0, 0.4) rgba(0, 0, 0, 0.4); border-radius: 4px; overflow-wrap: break-word; font-family: Consolas, Monaco, Menlo, monospace; word-break: break-all; visibility: visible;&quot; class=&quot;js_darkmode__24&quot;&gt;&lt;span style=&quot;visibility: visible;&quot;&gt;Svelte&lt;/span&gt;&lt;/code&gt;&lt;span style=&quot;visibility: visible;&quot;&gt;，Office 方向也覆盖了&amp;nbsp;&lt;/span&gt;&lt;code style=&quot;color: rgb(30, 107, 184); font-size: 14px; line-height: 1.8em; letter-spacing: 0em; background: none 0% 0% / auto no-repeat scroll padding-box border-box rgba(27, 31, 35, 0.05); width: auto; height: auto; margin: 0px 2px; padding: 2px 4px; border-style: none; border-width: 3px; border-color: rgb(0, 0, 0) rgba(0, 0, 0, 0.4) rgba(0, 0, 0, 0.4); border-radius: 4px; overflow-wrap: break-word; font-family: Consolas, Monaco, Menlo, monospace; word-break: break-all; visibility: visible;&quot; class=&quot;js_darkmode__25&quot;&gt;&lt;span style=&quot;visibility: visible;&quot;&gt;doc&lt;/span&gt;&lt;/code&gt;&lt;span style=&quot;visibility: visible;&quot;&gt;、&lt;/span&gt;&lt;code style=&quot;color: rgb(30, 107, 184); font-size: 14px; line-height: 1.8em; letter-spacing: 0em; background: none 0% 0% / auto no-repeat scroll padding-box border-box rgba(27, 31, 35, 0.05); width: auto; height: auto; margin: 0px 2px; padding: 2px 4px; border-style: none; border-width: 3px; border-color: rgb(0, 0, 0) rgba(0, 0, 0, 0.4) rgba(0, 0, 0, 0.4); border-radius: 4px; overflow-wrap: break-word; font-family: Consolas, Monaco, Menlo, monospace; word-break: break-all; visibility: visible;&quot; class=&quot;js_darkmode__26&quot;&gt;&lt;span style=&quot;visibility: visible;&quot;&gt;docx&lt;/span&gt;&lt;/code&gt;&lt;span style=&quot;visibility: visible;&quot;&gt;、&lt;/span&gt;&lt;code style=&quot;color: rgb(30, 107, 184); font-size: 14px; line-height: 1.8em; letter-spacing: 0em; background: none 0% 0% / auto no-repeat scroll padding-box border-box rgba(27, 31, 35, 0.05); width: auto; height: auto; margin: 0px 2px; padding: 2px 4px; border-style: none; border-width: 3px; border-color: rgb(0, 0, 0) rgba(0, 0, 0, 0.4) rgba(0, 0, 0, 0.4); border-radius: 4px; overflow-wrap: break-word; font-family: Consolas, Monaco, Menlo, monospace; word-break: break-all; visibility: visible;&quot; class=&quot;js_darkmode__27&quot;&gt;&lt;span style=&quot;visibility: visible;&quot;&gt;xls&lt;/span&gt;&lt;/code&gt;&lt;span style=&quot;visibility: visible;&quot;&gt;、&lt;/span&gt;&lt;code style=&quot;color: rgb(30, 107, 184); font-size: 14px; line-height: 1.8em; letter-spacing: 0em; background: none 0% 0% / auto no-repeat scroll padding-box border-box rgba(27, 31, 35, 0.05); width: auto; height: auto; margin: 0px 2px; padding: 2px 4px; border-style: none; border-width: 3px; border-color: rgb(0, 0, 0) rgba(0, 0, 0, 0.4) rgba(0, 0, 0, 0.4); border-radius: 4px; overflow-wrap: break-word; font-family: Consolas, Monaco, Menlo, monospace; word-break: break-all; visibility: visible;&quot; class=&quot;js_darkmode__28&quot;&gt;&lt;span style=&quot;visibility: visible;&quot;&gt;xlsx&lt;/span&gt;&lt;/code&gt;&lt;span style=&quot;visibility: visible;&quot;&gt;、&lt;/span&gt;&lt;code style=&quot;color: rgb(30, 107, 184); font-size: 14px; line-height: 1.8em; letter-spacing: 0em; background: none 0% 0% / auto no-repeat scroll padding-box border-box rgba(27, 31, 35, 0.05); width: auto; height: auto; margin: 0px 2px; padding: 2px 4px; border-style: none; border-width: 3px; border-color: rgb(0, 0, 0) rgba(0, 0, 0, 0.4) rgba(0, 0, 0, 0.4); border-radius: 4px; overflow-wrap: break-word; font-family: Consolas, Monaco, Menlo, monospace; word-break: break-all; visibility: visible;&quot; class=&quot;js_darkmode__29&quot;&gt;&lt;span style=&quot;visibility: visible;&quot;&gt;pptx&lt;/span&gt;&lt;/code&gt;&lt;span style=&quot;visibility: visible;&quot;&gt;&amp;nbsp;等常见格式。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;figure data-tool=&quot;mdnice编辑器&quot; style=&quot;margin: 10px 0px; padding: 0px; display: flex; flex-direction: column; justify-content: center; align-items: center; visibility: visible;&quot;&gt;&lt;span style=&quot;visibility: visible;&quot;&gt;&lt;img data-src=&quot;https://mmbiz.qpic.cn/mmbiz_jpg/7YalpHdlCYicoI7ibHnnQlYpVjEaHMAgrNJKWSLe53kiarws1WszXNkJKLJJIRXSjU6S4PThsuGmWccHeicm7QUncmf2QQzM9bcAvtWBZxhTZS8/640?wx_fmt=webp&amp;amp;from=appmsg#imgIndex=1&quot; class=&quot;rich_pages wxw-img js_darkmode__30&quot; data-ratio=&quot;0.6812386156648452&quot; data-type=&quot;webp&quot; data-w=&quot;549&quot; style=&quot;display: block; margin: 0px auto; max-width: 100%; border-style: none; border-width: 3px; border-color: rgba(0, 0, 0, 0.4); border-radius: 0px; object-fit: fill; box-shadow: rgba(0, 0, 0, 0) 0px 0px 0px 0px; height: auto !important; visibility: visible !important; width: 549px !important;&quot; data-imgfileid=&quot;100040508&quot; data-aistatus=&quot;1&quot; data-original-style=&quot;display: block;margin-top: 0px;margin-right: auto;margin-bottom: 0px;margin-left: auto;max-width: 100%;border-top-style: none;border-bottom-style: none;border-left-style: none;border-right-style: none;border-top-width: 3px;border-bottom-width: 3px;border-left-width: 3px;border-right-width: 3px;border-top-color: rgba(0, 0, 0, 0.4);border-bottom-color: rgba(0, 0, 0, 0.4);border-left-color: rgba(0, 0, 0, 0.4);border-right-color: rgba(0, 0, 0, 0.4);border-top-left-radius: 0px;border-top-right-radius: 0px;border-bottom-right-radius: 0px;border-bottom-left-radius: 0px;object-fit: fill;box-shadow: rgba(0, 0, 0, 0) 0px 0px 0px 0px;&quot; data-index=&quot;4&quot; src=&quot;https://mmbiz.qpic.cn/mmbiz_jpg/7YalpHdlCYicoI7ibHnnQlYpVjEaHMAgrNJKWSLe53kiarws1WszXNkJKLJJIRXSjU6S4PThsuGmWccHeicm7QUncmf2QQzM9bcAvtWBZxhTZS8/640?wx_fmt=webp&amp;from=appmsg&amp;tp=wxpic&amp;wxfrom=5&amp;wx_lazy=1#imgIndex=1&quot; _width=&quot;549px&quot; alt=&quot;图片&quot; data-before-load-time=&quot;1783923772716&quot; data-report-img-idx=&quot;0&quot; data-fail=&quot;0&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;&lt;/p&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(0, 0, 0);font-size: 16px;line-height: 1.8em;letter-spacing: 0em;text-align: left;text-indent: 0em;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 8px;padding-bottom: 8px;padding-left: 0px;padding-right: 0px;&quot; class=&quot;js_darkmode__31&quot;&gt;这篇文章不讲概念，直接聊它解决了什么，以及这套 SDK 是怎么设计的。&lt;/p&gt;&lt;h2 data-tool=&quot;mdnice编辑器&quot; style=&quot;margin-top: 30px;margin-bottom: 15px;margin-left: 0px;margin-right: 0px;padding-top: 0px;padding-bottom: 0px;padding-left: 0px;padding-right: 0px;display: block;&quot;&gt;&lt;span style=&quot;font-size: 22px;color: #000000;line-height: 1.5em;letter-spacing: 0em;text-align: left;font-weight: bold;display: block;&quot; class=&quot;js_darkmode__32&quot;&gt;文件预览最难的地方，是失控&lt;/span&gt;&lt;/h2&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(0, 0, 0);font-size: 16px;line-height: 1.8em;letter-spacing: 0em;text-align: left;text-indent: 0em;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 8px;padding-bottom: 8px;padding-left: 0px;padding-right: 0px;&quot; class=&quot;js_darkmode__33&quot;&gt;很多项目最早的预览代码，大概都是这样：&lt;/p&gt;&lt;pre data-tool=&quot;mdnice编辑器&quot; style=&quot;border-radius: 5px;box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;text-align: left;margin-top: 10px;margin-bottom: 10px;margin-left: 0px;margin-right: 0px;padding-top: 0px;padding-bottom: 0px;padding-left: 0px;padding-right: 0px;&quot; class=&quot;js_darkmode__34&quot;&gt;&lt;code style=&quot;overflow-x: auto;padding: 16px;color: #abb2bf;padding-top: 15px;background: #282c34;border-radius: 5px;display: -webkit-box;font-family: Consolas, Monaco, Menlo, monospace;font-size: 12px;&quot; class=&quot;js_darkmode__35&quot;&gt;&lt;span style=&quot;color: #c678dd;line-height: 26px;&quot;&gt;if&lt;/span&gt;&amp;nbsp;(isPdf(file)) {&lt;br/&gt;&amp;nbsp; openPdf(file);&lt;br/&gt;}&amp;nbsp;&lt;span style=&quot;color: #c678dd;line-height: 26px;&quot;&gt;else&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #c678dd;line-height: 26px;&quot;&gt;if&lt;/span&gt;&amp;nbsp;(isImage(file)) {&lt;br/&gt;&amp;nbsp; openImage(file);&lt;br/&gt;}&amp;nbsp;&lt;span style=&quot;color: #c678dd;line-height: 26px;&quot;&gt;else&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #c678dd;line-height: 26px;&quot;&gt;if&lt;/span&gt;&amp;nbsp;(isOffice(file)) {&lt;br/&gt;&amp;nbsp; openOffice(file);&lt;br/&gt;}&amp;nbsp;&lt;span style=&quot;color: #c678dd;line-height: 26px;&quot;&gt;else&lt;/span&gt;&amp;nbsp;{&lt;br/&gt;&amp;nbsp; download(file);&lt;br/&gt;}&lt;br/&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(0, 0, 0);font-size: 16px;line-height: 1.8em;letter-spacing: 0em;text-align: left;text-indent: 0em;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 8px;padding-bottom: 8px;padding-left: 0px;padding-right: 0px;&quot; class=&quot;js_darkmode__36&quot;&gt;刚开始没问题。&lt;/p&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(0, 0, 0);font-size: 16px;line-height: 1.8em;letter-spacing: 0em;text-align: left;text-indent: 0em;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 8px;padding-bottom: 8px;padding-left: 0px;padding-right: 0px;&quot; class=&quot;js_darkmode__37&quot;&gt;等格式一多，业务就会慢慢失控：&lt;/p&gt;&lt;pre data-tool=&quot;mdnice编辑器&quot; style=&quot;border-radius: 5px;box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;text-align: left;margin-top: 10px;margin-bottom: 10px;margin-left: 0px;margin-right: 0px;padding-top: 0px;padding-bottom: 0px;padding-left: 0px;padding-right: 0px;&quot; class=&quot;js_darkmode__38&quot;&gt;&lt;code style=&quot;overflow-x: auto;padding: 16px;color: #abb2bf;padding-top: 15px;background: #282c34;border-radius: 5px;display: -webkit-box;font-family: Consolas, Monaco, Menlo, monospace;font-size: 12px;&quot; class=&quot;js_darkmode__39&quot;&gt;PDF 有一套工具栏&lt;br/&gt;图片有一套缩放逻辑&lt;br/&gt;Office 有一套加载状态&lt;br/&gt;视频有自己的控制器&lt;br/&gt;压缩包只能下载&lt;br/&gt;错误状态各写各的&lt;br/&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(0, 0, 0);font-size: 16px;line-height: 1.8em;letter-spacing: 0em;text-align: left;text-indent: 0em;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 8px;padding-bottom: 8px;padding-left: 0px;padding-right: 0px;&quot; class=&quot;js_darkmode__40&quot;&gt;同一个预览功能，弹窗里写一遍，详情页再写一遍，审批流和附件中心继续复制。&lt;/p&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(0, 0, 0);font-size: 16px;line-height: 1.8em;letter-spacing: 0em;text-align: left;text-indent: 0em;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 8px;padding-bottom: 8px;padding-left: 0px;padding-right: 0px;&quot; class=&quot;js_darkmode__41&quot;&gt;最后项目里没有“文件预览能力”，只有一堆散落的格式判断。&lt;/p&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(0, 0, 0);font-size: 16px;line-height: 1.8em;letter-spacing: 0em;text-align: left;text-indent: 0em;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 8px;padding-bottom: 8px;padding-left: 0px;padding-right: 0px;&quot; class=&quot;js_darkmode__42&quot;&gt;我开发&amp;nbsp;&lt;code style=&quot;color: rgb(30, 107, 184);font-size: 14px;line-height: 1.8em;letter-spacing: 0em;background-attachment: scroll;background-clip: border-box;background-color: rgba(27, 31, 35, 0.05);background-image: none;background-origin: padding-box;background-position-x: left;background-position-y: top;background-repeat: no-repeat;background-size: auto;width: auto;height: auto;margin-top: 0px;margin-bottom: 0px;margin-left: 2px;margin-right: 2px;padding-top: 2px;padding-bottom: 2px;padding-left: 4px;padding-right: 4px;border-top-style: none;border-bottom-style: none;border-left-style: none;border-right-style: none;border-top-width: 3px;border-bottom-width: 3px;border-left-width: 3px;border-right-width: 3px;border-top-color: rgb(0, 0, 0);border-bottom-color: rgba(0, 0, 0, 0.4);border-left-color: rgba(0, 0, 0, 0.4);border-right-color: rgba(0, 0, 0, 0.4);border-top-left-radius: 4px;border-top-right-radius: 4px;border-bottom-right-radius: 4px;border-bottom-left-radius: 4px;overflow-wrap: break-word;font-family: Consolas, Monaco, Menlo, monospace;word-break: break-all;&quot; class=&quot;js_darkmode__43&quot;&gt;Open File Viewer&lt;/code&gt;，最先解决的就是这个问题：&lt;/p&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(0, 0, 0);font-size: 16px;line-height: 1.8em;letter-spacing: 0em;text-align: left;text-indent: 0em;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 8px;padding-bottom: 8px;padding-left: 0px;padding-right: 0px;&quot; class=&quot;js_darkmode__44&quot;&gt;&lt;strong style=&quot;color: rgb(0, 0, 0);font-weight: bold;background-attachment: scroll;background-clip: border-box;background-color: rgba(0, 0, 0, 0);background-image: none;background-origin: padding-box;background-position-x: left;background-position-y: top;background-repeat: no-repeat;background-size: auto;width: auto;height: auto;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 0px;padding-bottom: 0px;padding-left: 0px;padding-right: 0px;border-top-style: none;border-bottom-style: none;border-left-style: none;border-right-style: none;border-top-width: 3px;border-bottom-width: 3px;border-left-width: 3px;border-right-width: 3px;border-top-color: rgba(0, 0, 0, 0.4);border-bottom-color: rgba(0, 0, 0, 0.4);border-left-color: rgba(0, 0, 0, 0.4);border-right-color: rgba(0, 0, 0, 0.4);border-top-left-radius: 0px;border-top-right-radius: 0px;border-bottom-right-radius: 0px;border-bottom-left-radius: 0px;&quot; class=&quot;js_darkmode__45&quot;&gt;把所有文件预览统一收口到一个入口。&lt;/strong&gt;&lt;/p&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(0, 0, 0);font-size: 16px;line-height: 1.8em;letter-spacing: 0em;text-align: left;text-indent: 0em;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 8px;padding-bottom: 8px;padding-left: 0px;padding-right: 0px;&quot; class=&quot;js_darkmode__46&quot;&gt;业务层只负责传文件，剩下的格式识别、插件匹配、渲染、错误处理、下载兜底，全部交给 SDK。&lt;/p&gt;&lt;h2 data-tool=&quot;mdnice编辑器&quot; style=&quot;margin-top: 30px;margin-bottom: 15px;margin-left: 0px;margin-right: 0px;padding-top: 0px;padding-bottom: 0px;padding-left: 0px;padding-right: 0px;display: block;&quot;&gt;&lt;span style=&quot;font-size: 22px;color: #000000;line-height: 1.5em;letter-spacing: 0em;text-align: left;font-weight: bold;display: block;&quot; class=&quot;js_darkmode__47&quot;&gt;一套 Core，支持四种技术栈&lt;/span&gt;&lt;/h2&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(0, 0, 0);font-size: 16px;line-height: 1.8em;letter-spacing: 0em;text-align: left;text-indent: 0em;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 8px;padding-bottom: 8px;padding-left: 0px;padding-right: 0px;&quot; class=&quot;js_darkmode__48&quot;&gt;&lt;code style=&quot;color: rgb(30, 107, 184);font-size: 14px;line-height: 1.8em;letter-spacing: 0em;background-attachment: scroll;background-clip: border-box;background-color: rgba(27, 31, 35, 0.05);background-image: none;background-origin: padding-box;background-position-x: left;background-position-y: top;background-repeat: no-repeat;background-size: auto;width: auto;height: auto;margin-top: 0px;margin-bottom: 0px;margin-left: 2px;margin-right: 2px;padding-top: 2px;padding-bottom: 2px;padding-left: 4px;padding-right: 4px;border-top-style: none;border-bottom-style: none;border-left-style: none;border-right-style: none;border-top-width: 3px;border-bottom-width: 3px;border-left-width: 3px;border-right-width: 3px;border-top-color: rgb(0, 0, 0);border-bottom-color: rgba(0, 0, 0, 0.4);border-left-color: rgba(0, 0, 0, 0.4);border-right-color: rgba(0, 0, 0, 0.4);border-top-left-radius: 4px;border-top-right-radius: 4px;border-bottom-right-radius: 4px;border-bottom-left-radius: 4px;overflow-wrap: break-word;font-family: Consolas, Monaco, Menlo, monospace;word-break: break-all;&quot; class=&quot;js_darkmode__49&quot;&gt;Open File Viewer&lt;/code&gt;&amp;nbsp;没有把能力绑死在某个框架里。&lt;/p&gt;&lt;p&gt;&lt;figure data-tool=&quot;mdnice编辑器&quot; style=&quot;margin-top: 10px;margin-bottom: 10px;margin-left: 0px;margin-right: 0px;padding-top: 0px;padding-bottom: 0px;padding-left: 0px;padding-right: 0px;display: flex;flex-direction: column;justify-content: center;align-items: center;&quot;&gt;&lt;img data-src=&quot;https://mmbiz.qpic.cn/sz_mmbiz_jpg/7YalpHdlCY8rRFbmcuOFGK7JxDSH4bqG6eSry1icmu6VQReh1AuFqFU1UlULCjiccIH16nyhHTLz7JkmW0aiakDPA8QpmlpFuDhUgPSylvRB7A/640?wx_fmt=webp&amp;amp;from=appmsg#imgIndex=2&quot; class=&quot;rich_pages wxw-img js_darkmode__50&quot; data-ratio=&quot;0.562962962962963&quot; data-type=&quot;webp&quot; data-w=&quot;1080&quot; style=&quot;display: block; margin: 0px auto; max-width: 100%; border-style: none; border-width: 3px; border-color: rgba(0, 0, 0, 0.4); border-radius: 0px; object-fit: fill; box-shadow: rgba(0, 0, 0, 0) 0px 0px 0px 0px; height: auto !important; visibility: visible !important; width: 657px !important;&quot; data-imgfileid=&quot;100040507&quot; data-aistatus=&quot;1&quot; data-original-style=&quot;display: block;margin-top: 0px;margin-right: auto;margin-bottom: 0px;margin-left: auto;max-width: 100%;border-top-style: none;border-bottom-style: none;border-left-style: none;border-right-style: none;border-top-width: 3px;border-bottom-width: 3px;border-left-width: 3px;border-right-width: 3px;border-top-color: rgba(0, 0, 0, 0.4);border-bottom-color: rgba(0, 0, 0, 0.4);border-left-color: rgba(0, 0, 0, 0.4);border-right-color: rgba(0, 0, 0, 0.4);border-top-left-radius: 0px;border-top-right-radius: 0px;border-bottom-right-radius: 0px;border-bottom-left-radius: 0px;object-fit: fill;box-shadow: rgba(0, 0, 0, 0) 0px 0px 0px 0px;&quot; data-index=&quot;5&quot; src=&quot;https://mmbiz.qpic.cn/sz_mmbiz_jpg/7YalpHdlCY8rRFbmcuOFGK7JxDSH4bqG6eSry1icmu6VQReh1AuFqFU1UlULCjiccIH16nyhHTLz7JkmW0aiakDPA8QpmlpFuDhUgPSylvRB7A/640?wx_fmt=webp&amp;from=appmsg&amp;tp=wxpic&amp;wxfrom=5&amp;wx_lazy=1#imgIndex=2&quot; _width=&quot;614px&quot; alt=&quot;图片&quot; data-before-load-time=&quot;1783924552576&quot; data-report-img-idx=&quot;2&quot; data-fail=&quot;0&quot;/&gt;&lt;/figure&gt;&lt;/p&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(0, 0, 0);font-size: 16px;line-height: 1.8em;letter-spacing: 0em;text-align: left;text-indent: 0em;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 8px;padding-bottom: 8px;padding-left: 0px;padding-right: 0px;&quot; class=&quot;js_darkmode__51&quot;&gt;它的核心结构分成几层：&lt;/p&gt;&lt;pre data-tool=&quot;mdnice编辑器&quot; style=&quot;border-radius: 5px;box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;text-align: left;margin-top: 10px;margin-bottom: 10px;margin-left: 0px;margin-right: 0px;padding-top: 0px;padding-bottom: 0px;padding-left: 0px;padding-right: 0px;&quot; class=&quot;js_darkmode__52&quot;&gt;&lt;code style=&quot;overflow-x: auto;padding: 16px;color: #abb2bf;padding-top: 15px;background: #282c34;border-radius: 5px;display: -webkit-box;font-family: Consolas, Monaco, Menlo, monospace;font-size: 12px;&quot; class=&quot;js_darkmode__53&quot;&gt;JavaScript / Vue / React / Svelte&lt;br/&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ↓&lt;br/&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Framework Adapter&lt;br/&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ↓&lt;br/&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; Open File Viewer Core&lt;br/&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ↓&lt;br/&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Plugin System&lt;br/&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ↓&lt;br/&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Renderer&lt;br/&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(0, 0, 0);font-size: 16px;line-height: 1.8em;letter-spacing: 0em;text-align: left;text-indent: 0em;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 8px;padding-bottom: 8px;padding-left: 0px;padding-right: 0px;&quot; class=&quot;js_darkmode__54&quot;&gt;底层&amp;nbsp;&lt;code style=&quot;color: rgb(30, 107, 184);font-size: 14px;line-height: 1.8em;letter-spacing: 0em;background-attachment: scroll;background-clip: border-box;background-color: rgba(27, 31, 35, 0.05);background-image: none;background-origin: padding-box;background-position-x: left;background-position-y: top;background-repeat: no-repeat;background-size: auto;width: auto;height: auto;margin-top: 0px;margin-bottom: 0px;margin-left: 2px;margin-right: 2px;padding-top: 2px;padding-bottom: 2px;padding-left: 4px;padding-right: 4px;border-top-style: none;border-bottom-style: none;border-left-style: none;border-right-style: none;border-top-width: 3px;border-bottom-width: 3px;border-left-width: 3px;border-right-width: 3px;border-top-color: rgb(0, 0, 0);border-bottom-color: rgba(0, 0, 0, 0.4);border-left-color: rgba(0, 0, 0, 0.4);border-right-color: rgba(0, 0, 0, 0.4);border-top-left-radius: 4px;border-top-right-radius: 4px;border-bottom-right-radius: 4px;border-bottom-left-radius: 4px;overflow-wrap: break-word;font-family: Consolas, Monaco, Menlo, monospace;word-break: break-all;&quot; class=&quot;js_darkmode__55&quot;&gt;Core&lt;/code&gt;&amp;nbsp;负责：&lt;/p&gt;&lt;pre data-tool=&quot;mdnice编辑器&quot; style=&quot;border-radius: 5px;box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;text-align: left;margin-top: 10px;margin-bottom: 10px;margin-left: 0px;margin-right: 0px;padding-top: 0px;padding-bottom: 0px;padding-left: 0px;padding-right: 0px;&quot; class=&quot;js_darkmode__56&quot;&gt;&lt;code style=&quot;overflow-x: auto;padding: 16px;color: #abb2bf;padding-top: 15px;background: #282c34;border-radius: 5px;display: -webkit-box;font-family: Consolas, Monaco, Menlo, monospace;font-size: 12px;&quot; class=&quot;js_darkmode__57&quot;&gt;文件识别&lt;br/&gt;插件调度&lt;br/&gt;状态管理&lt;br/&gt;容器生命周期&lt;br/&gt;工具栏&lt;br/&gt;主题&lt;br/&gt;错误处理&lt;br/&gt;Fallback&lt;br/&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(0, 0, 0);font-size: 16px;line-height: 1.8em;letter-spacing: 0em;text-align: left;text-indent: 0em;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 8px;padding-bottom: 8px;padding-left: 0px;padding-right: 0px;&quot; class=&quot;js_darkmode__58&quot;&gt;上层的&amp;nbsp;&lt;code style=&quot;color: rgb(30, 107, 184);font-size: 14px;line-height: 1.8em;letter-spacing: 0em;background-attachment: scroll;background-clip: border-box;background-color: rgba(27, 31, 35, 0.05);background-image: none;background-origin: padding-box;background-position-x: left;background-position-y: top;background-repeat: no-repeat;background-size: auto;width: auto;height: auto;margin-top: 0px;margin-bottom: 0px;margin-left: 2px;margin-right: 2px;padding-top: 2px;padding-bottom: 2px;padding-left: 4px;padding-right: 4px;border-top-style: none;border-bottom-style: none;border-left-style: none;border-right-style: none;border-top-width: 3px;border-bottom-width: 3px;border-left-width: 3px;border-right-width: 3px;border-top-color: rgb(0, 0, 0);border-bottom-color: rgba(0, 0, 0, 0.4);border-left-color: rgba(0, 0, 0, 0.4);border-right-color: rgba(0, 0, 0, 0.4);border-top-left-radius: 4px;border-top-right-radius: 4px;border-bottom-right-radius: 4px;border-bottom-left-radius: 4px;overflow-wrap: break-word;font-family: Consolas, Monaco, Menlo, monospace;word-break: break-all;&quot; class=&quot;js_darkmode__59&quot;&gt;Vue&lt;/code&gt;、&lt;code style=&quot;color: rgb(30, 107, 184);font-size: 14px;line-height: 1.8em;letter-spacing: 0em;background-attachment: scroll;background-clip: border-box;background-color: rgba(27, 31, 35, 0.05);background-image: none;background-origin: padding-box;background-position-x: left;background-position-y: top;background-repeat: no-repeat;background-size: auto;width: auto;height: auto;margin-top: 0px;margin-bottom: 0px;margin-left: 2px;margin-right: 2px;padding-top: 2px;padding-bottom: 2px;padding-left: 4px;padding-right: 4px;border-top-style: none;border-bottom-style: none;border-left-style: none;border-right-style: none;border-top-width: 3px;border-bottom-width: 3px;border-left-width: 3px;border-right-width: 3px;border-top-color: rgb(0, 0, 0);border-bottom-color: rgba(0, 0, 0, 0.4);border-left-color: rgba(0, 0, 0, 0.4);border-right-color: rgba(0, 0, 0, 0.4);border-top-left-radius: 4px;border-top-right-radius: 4px;border-bottom-right-radius: 4px;border-bottom-left-radius: 4px;overflow-wrap: break-word;font-family: Consolas, Monaco, Menlo, monospace;word-break: break-all;&quot; class=&quot;js_darkmode__60&quot;&gt;React&lt;/code&gt;、&lt;code style=&quot;color: rgb(30, 107, 184);font-size: 14px;line-height: 1.8em;letter-spacing: 0em;background-attachment: scroll;background-clip: border-box;background-color: rgba(27, 31, 35, 0.05);background-image: none;background-origin: padding-box;background-position-x: left;background-position-y: top;background-repeat: no-repeat;background-size: auto;width: auto;height: auto;margin-top: 0px;margin-bottom: 0px;margin-left: 2px;margin-right: 2px;padding-top: 2px;padding-bottom: 2px;padding-left: 4px;padding-right: 4px;border-top-style: none;border-bottom-style: none;border-left-style: none;border-right-style: none;border-top-width: 3px;border-bottom-width: 3px;border-left-width: 3px;border-right-width: 3px;border-top-color: rgb(0, 0, 0);border-bottom-color: rgba(0, 0, 0, 0.4);border-left-color: rgba(0, 0, 0, 0.4);border-right-color: rgba(0, 0, 0, 0.4);border-top-left-radius: 4px;border-top-right-radius: 4px;border-bottom-right-radius: 4px;border-bottom-left-radius: 4px;overflow-wrap: break-word;font-family: Consolas, Monaco, Menlo, monospace;word-break: break-all;&quot; class=&quot;js_darkmode__61&quot;&gt;Svelte&lt;/code&gt;&amp;nbsp;只负责框架适配。&lt;/p&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(0, 0, 0);font-size: 16px;line-height: 1.8em;letter-spacing: 0em;text-align: left;text-indent: 0em;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 8px;padding-bottom: 8px;padding-left: 0px;padding-right: 0px;&quot; class=&quot;js_darkmode__62&quot;&gt;所以不管项目用什么技术栈，底层走的都是同一套预览能力。&lt;/p&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(0, 0, 0);font-size: 16px;line-height: 1.8em;letter-spacing: 0em;text-align: left;text-indent: 0em;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 8px;padding-bottom: 8px;padding-left: 0px;padding-right: 0px;&quot; class=&quot;js_darkmode__63&quot;&gt;一个团队里完全可能同时存在：&lt;/p&gt;&lt;pre data-tool=&quot;mdnice编辑器&quot; style=&quot;border-radius: 5px;box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;text-align: left;margin-top: 10px;margin-bottom: 10px;margin-left: 0px;margin-right: 0px;padding-top: 0px;padding-bottom: 0px;padding-left: 0px;padding-right: 0px;&quot; class=&quot;js_darkmode__64&quot;&gt;&lt;code style=&quot;overflow-x: auto;padding: 16px;color: #abb2bf;padding-top: 15px;background: #282c34;border-radius: 5px;display: -webkit-box;font-family: Consolas, Monaco, Menlo, monospace;font-size: 12px;&quot; class=&quot;js_darkmode__65&quot;&gt;老后台：原生 JavaScript&lt;br/&gt;管理端：Vue&lt;br/&gt;新产品：React&lt;br/&gt;轻量页面：Svelte&lt;br/&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(0, 0, 0);font-size: 16px;line-height: 1.8em;letter-spacing: 0em;text-align: left;text-indent: 0em;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 8px;padding-bottom: 8px;padding-left: 0px;padding-right: 0px;&quot; class=&quot;js_darkmode__66&quot;&gt;以前需要分别维护四套方案，现在可以共用一套插件和渲染逻辑。&lt;/p&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(0, 0, 0);font-size: 16px;line-height: 1.8em;letter-spacing: 0em;text-align: left;text-indent: 0em;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 8px;padding-bottom: 8px;padding-left: 0px;padding-right: 0px;&quot; class=&quot;js_darkmode__67&quot;&gt;这也是我一开始就把它做成 SDK，而不是只做一个 Vue 组件的原因。&lt;/p&gt;&lt;h2 data-tool=&quot;mdnice编辑器&quot; style=&quot;margin-top: 30px;margin-bottom: 15px;margin-left: 0px;margin-right: 0px;padding-top: 0px;padding-bottom: 0px;padding-left: 0px;padding-right: 0px;display: block;&quot;&gt;&lt;span style=&quot;font-size: 22px;color: #000000;line-height: 1.5em;letter-spacing: 0em;text-align: left;font-weight: bold;display: block;&quot; class=&quot;js_darkmode__68&quot;&gt;插件系统才是核心&lt;/span&gt;&lt;/h2&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(0, 0, 0);font-size: 16px;line-height: 1.8em;letter-spacing: 0em;text-align: left;text-indent: 0em;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 8px;padding-bottom: 8px;padding-left: 0px;padding-right: 0px;&quot; class=&quot;js_darkmode__69&quot;&gt;文件格式太多，靠一个超级组件硬扛，后面一定会越来越重。&lt;/p&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(0, 0, 0);font-size: 16px;line-height: 1.8em;letter-spacing: 0em;text-align: left;text-indent: 0em;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 8px;padding-bottom: 8px;padding-left: 0px;padding-right: 0px;&quot; class=&quot;js_darkmode__70&quot;&gt;所以&amp;nbsp;&lt;code style=&quot;color: rgb(30, 107, 184);font-size: 14px;line-height: 1.8em;letter-spacing: 0em;background-attachment: scroll;background-clip: border-box;background-color: rgba(27, 31, 35, 0.05);background-image: none;background-origin: padding-box;background-position-x: left;background-position-y: top;background-repeat: no-repeat;background-size: auto;width: auto;height: auto;margin-top: 0px;margin-bottom: 0px;margin-left: 2px;margin-right: 2px;padding-top: 2px;padding-bottom: 2px;padding-left: 4px;padding-right: 4px;border-top-style: none;border-bottom-style: none;border-left-style: none;border-right-style: none;border-top-width: 3px;border-bottom-width: 3px;border-left-width: 3px;border-right-width: 3px;border-top-color: rgb(0, 0, 0);border-bottom-color: rgba(0, 0, 0, 0.4);border-left-color: rgba(0, 0, 0, 0.4);border-right-color: rgba(0, 0, 0, 0.4);border-top-left-radius: 4px;border-top-right-radius: 4px;border-bottom-right-radius: 4px;border-bottom-left-radius: 4px;overflow-wrap: break-word;font-family: Consolas, Monaco, Menlo, monospace;word-break: break-all;&quot; class=&quot;js_darkmode__71&quot;&gt;Open File Viewer&lt;/code&gt;&amp;nbsp;把不同格式拆成独立插件。&lt;/p&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(0, 0, 0);font-size: 16px;line-height: 1.8em;letter-spacing: 0em;text-align: left;text-indent: 0em;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 8px;padding-bottom: 8px;padding-left: 0px;padding-right: 0px;&quot; class=&quot;js_darkmode__72&quot;&gt;比如：&lt;/p&gt;&lt;pre data-tool=&quot;mdnice编辑器&quot; style=&quot;border-radius: 5px;box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;text-align: left;margin-top: 10px;margin-bottom: 10px;margin-left: 0px;margin-right: 0px;padding-top: 0px;padding-bottom: 0px;padding-left: 0px;padding-right: 0px;&quot; class=&quot;js_darkmode__73&quot;&gt;&lt;code style=&quot;overflow-x: auto;padding: 16px;color: #abb2bf;padding-top: 15px;background: #282c34;border-radius: 5px;display: -webkit-box;font-family: Consolas, Monaco, Menlo, monospace;font-size: 12px;&quot; class=&quot;js_darkmode__74&quot;&gt;&lt;span style=&quot;color: #c678dd;line-height: 26px;&quot;&gt;const&lt;/span&gt;&amp;nbsp;plugins = [&lt;br/&gt;&amp;nbsp; officePlugin(),&lt;br/&gt;&amp;nbsp; pdfPlugin(),&lt;br/&gt;&amp;nbsp; imagePlugin(),&lt;br/&gt;&amp;nbsp; textPlugin()&lt;br/&gt;];&lt;br/&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(0, 0, 0);font-size: 16px;line-height: 1.8em;letter-spacing: 0em;text-align: left;text-indent: 0em;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 8px;padding-bottom: 8px;padding-left: 0px;padding-right: 0px;&quot; class=&quot;js_darkmode__75&quot;&gt;文件传入之后，内部流程大致是：&lt;/p&gt;&lt;pre data-tool=&quot;mdnice编辑器&quot; style=&quot;border-radius: 5px;box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;text-align: left;margin-top: 10px;margin-bottom: 10px;margin-left: 0px;margin-right: 0px;padding-top: 0px;padding-bottom: 0px;padding-left: 0px;padding-right: 0px;&quot; class=&quot;js_darkmode__76&quot;&gt;&lt;code style=&quot;overflow-x: auto;padding: 16px;color: #abb2bf;padding-top: 15px;background: #282c34;border-radius: 5px;display: -webkit-box;font-family: Consolas, Monaco, Menlo, monospace;font-size: 12px;&quot; class=&quot;js_darkmode__77&quot;&gt;读取文件信息&lt;br/&gt;&amp;nbsp; &amp;nbsp; ↓&lt;br/&gt;识别扩展名和 MIME&lt;br/&gt;&amp;nbsp; &amp;nbsp; ↓&lt;br/&gt;匹配对应插件&lt;br/&gt;&amp;nbsp; &amp;nbsp; ↓&lt;br/&gt;创建 Renderer&lt;br/&gt;&amp;nbsp; &amp;nbsp; ↓&lt;br/&gt;渲染到统一容器&lt;br/&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(0, 0, 0);font-size: 16px;line-height: 1.8em;letter-spacing: 0em;text-align: left;text-indent: 0em;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 8px;padding-bottom: 8px;padding-left: 0px;padding-right: 0px;&quot; class=&quot;js_darkmode__78&quot;&gt;每个插件只处理自己负责的内容。&lt;/p&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(0, 0, 0);font-size: 16px;line-height: 1.8em;letter-spacing: 0em;text-align: left;text-indent: 0em;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 8px;padding-bottom: 8px;padding-left: 0px;padding-right: 0px;&quot; class=&quot;js_darkmode__79&quot;&gt;&lt;code style=&quot;color: rgb(30, 107, 184);font-size: 14px;line-height: 1.8em;letter-spacing: 0em;background-attachment: scroll;background-clip: border-box;background-color: rgba(27, 31, 35, 0.05);background-image: none;background-origin: padding-box;background-position-x: left;background-position-y: top;background-repeat: no-repeat;background-size: auto;width: auto;height: auto;margin-top: 0px;margin-bottom: 0px;margin-left: 2px;margin-right: 2px;padding-top: 2px;padding-bottom: 2px;padding-left: 4px;padding-right: 4px;border-top-style: none;border-bottom-style: none;border-left-style: none;border-right-style: none;border-top-width: 3px;border-bottom-width: 3px;border-left-width: 3px;border-right-width: 3px;border-top-color: rgb(0, 0, 0);border-bottom-color: rgba(0, 0, 0, 0.4);border-left-color: rgba(0, 0, 0, 0.4);border-right-color: rgba(0, 0, 0, 0.4);border-top-left-radius: 4px;border-top-right-radius: 4px;border-bottom-right-radius: 4px;border-bottom-left-radius: 4px;overflow-wrap: break-word;font-family: Consolas, Monaco, Menlo, monospace;word-break: break-all;&quot; class=&quot;js_darkmode__80&quot;&gt;officePlugin()&lt;/code&gt;&amp;nbsp;关注 Office，&lt;code style=&quot;color: rgb(30, 107, 184);font-size: 14px;line-height: 1.8em;letter-spacing: 0em;background-attachment: scroll;background-clip: border-box;background-color: rgba(27, 31, 35, 0.05);background-image: none;background-origin: padding-box;background-position-x: left;background-position-y: top;background-repeat: no-repeat;background-size: auto;width: auto;height: auto;margin-top: 0px;margin-bottom: 0px;margin-left: 2px;margin-right: 2px;padding-top: 2px;padding-bottom: 2px;padding-left: 4px;padding-right: 4px;border-top-style: none;border-bottom-style: none;border-left-style: none;border-right-style: none;border-top-width: 3px;border-bottom-width: 3px;border-left-width: 3px;border-right-width: 3px;border-top-color: rgb(0, 0, 0);border-bottom-color: rgba(0, 0, 0, 0.4);border-left-color: rgba(0, 0, 0, 0.4);border-right-color: rgba(0, 0, 0, 0.4);border-top-left-radius: 4px;border-top-right-radius: 4px;border-bottom-right-radius: 4px;border-bottom-left-radius: 4px;overflow-wrap: break-word;font-family: Consolas, Monaco, Menlo, monospace;word-break: break-all;&quot; class=&quot;js_darkmode__81&quot;&gt;pdfPlugin()&lt;/code&gt;&amp;nbsp;处理 PDF，&lt;code style=&quot;color: rgb(30, 107, 184);font-size: 14px;line-height: 1.8em;letter-spacing: 0em;background-attachment: scroll;background-clip: border-box;background-color: rgba(27, 31, 35, 0.05);background-image: none;background-origin: padding-box;background-position-x: left;background-position-y: top;background-repeat: no-repeat;background-size: auto;width: auto;height: auto;margin-top: 0px;margin-bottom: 0px;margin-left: 2px;margin-right: 2px;padding-top: 2px;padding-bottom: 2px;padding-left: 4px;padding-right: 4px;border-top-style: none;border-bottom-style: none;border-left-style: none;border-right-style: none;border-top-width: 3px;border-bottom-width: 3px;border-left-width: 3px;border-right-width: 3px;border-top-color: rgb(0, 0, 0);border-bottom-color: rgba(0, 0, 0, 0.4);border-left-color: rgba(0, 0, 0, 0.4);border-right-color: rgba(0, 0, 0, 0.4);border-top-left-radius: 4px;border-top-right-radius: 4px;border-bottom-right-radius: 4px;border-bottom-left-radius: 4px;overflow-wrap: break-word;font-family: Consolas, Monaco, Menlo, monospace;word-break: break-all;&quot; class=&quot;js_darkmode__82&quot;&gt;imagePlugin()&lt;/code&gt;&amp;nbsp;负责图片，后面也可以继续扩展音视频、压缩包、CAD、GIS、3D 等能力。&lt;/p&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(0, 0, 0);font-size: 16px;line-height: 1.8em;letter-spacing: 0em;text-align: left;text-indent: 0em;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 8px;padding-bottom: 8px;padding-left: 0px;padding-right: 0px;&quot; class=&quot;js_darkmode__83&quot;&gt;这种结构有两个好处。&lt;/p&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(0, 0, 0);font-size: 16px;line-height: 1.8em;letter-spacing: 0em;text-align: left;text-indent: 0em;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 8px;padding-bottom: 8px;padding-left: 0px;padding-right: 0px;&quot; class=&quot;js_darkmode__84&quot;&gt;第一，格式之间互不干扰。Office 插件出问题，不会影响图片和 PDF。&lt;/p&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(0, 0, 0);font-size: 16px;line-height: 1.8em;letter-spacing: 0em;text-align: left;text-indent: 0em;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 8px;padding-bottom: 8px;padding-left: 0px;padding-right: 0px;&quot; class=&quot;js_darkmode__85&quot;&gt;第二，业务可以按需加载。项目只需要 PDF 和 Office，就只注册这两个插件，不必把所有能力全部打进包里。&lt;/p&gt;&lt;h2 data-tool=&quot;mdnice编辑器&quot; style=&quot;margin-top: 30px;margin-bottom: 15px;margin-left: 0px;margin-right: 0px;padding-top: 0px;padding-bottom: 0px;padding-left: 0px;padding-right: 0px;display: block;&quot;&gt;&lt;span style=&quot;font-size: 22px;color: #000000;line-height: 1.5em;letter-spacing: 0em;text-align: left;font-weight: bold;display: block;&quot; class=&quot;js_darkmode__86&quot;&gt;doc / xls 支持，才是真正进入业务系统&lt;/span&gt;&lt;/h2&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(0, 0, 0);font-size: 16px;line-height: 1.8em;letter-spacing: 0em;text-align: left;text-indent: 0em;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 8px;padding-bottom: 8px;padding-left: 0px;padding-right: 0px;&quot; class=&quot;js_darkmode__87&quot;&gt;很多 Office 预览方案都会写一句：&lt;/p&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(0, 0, 0);font-size: 16px;line-height: 1.8em;letter-spacing: 0em;text-align: left;text-indent: 0em;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 8px;padding-bottom: 8px;padding-left: 0px;padding-right: 0px;&quot; class=&quot;js_darkmode__88&quot;&gt;&lt;strong style=&quot;color: rgb(0, 0, 0);font-weight: bold;background-attachment: scroll;background-clip: border-box;background-color: rgba(0, 0, 0, 0);background-image: none;background-origin: padding-box;background-position-x: left;background-position-y: top;background-repeat: no-repeat;background-size: auto;width: auto;height: auto;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 0px;padding-bottom: 0px;padding-left: 0px;padding-right: 0px;border-top-style: none;border-bottom-style: none;border-left-style: none;border-right-style: none;border-top-width: 3px;border-bottom-width: 3px;border-left-width: 3px;border-right-width: 3px;border-top-color: rgba(0, 0, 0, 0.4);border-bottom-color: rgba(0, 0, 0, 0.4);border-left-color: rgba(0, 0, 0, 0.4);border-right-color: rgba(0, 0, 0, 0.4);border-top-left-radius: 0px;border-top-right-radius: 0px;border-bottom-right-radius: 0px;border-bottom-left-radius: 0px;&quot; class=&quot;js_darkmode__89&quot;&gt;支持 Word、Excel、PPT。&lt;/strong&gt;&lt;/p&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(0, 0, 0);font-size: 16px;line-height: 1.8em;letter-spacing: 0em;text-align: left;text-indent: 0em;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 8px;padding-bottom: 8px;padding-left: 0px;padding-right: 0px;&quot; class=&quot;js_darkmode__90&quot;&gt;真正点进去一看，支持的是：&lt;/p&gt;&lt;pre data-tool=&quot;mdnice编辑器&quot; style=&quot;border-radius: 5px;box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;text-align: left;margin-top: 10px;margin-bottom: 10px;margin-left: 0px;margin-right: 0px;padding-top: 0px;padding-bottom: 0px;padding-left: 0px;padding-right: 0px;&quot; class=&quot;js_darkmode__91&quot;&gt;&lt;code style=&quot;overflow-x: auto;padding: 16px;color: #abb2bf;padding-top: 15px;background: #282c34;border-radius: 5px;display: -webkit-box;font-family: Consolas, Monaco, Menlo, monospace;font-size: 12px;&quot; class=&quot;js_darkmode__92&quot;&gt;docx&lt;br/&gt;xlsx&lt;br/&gt;pptx&lt;br/&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(0, 0, 0);font-size: 16px;line-height: 1.8em;letter-spacing: 0em;text-align: left;text-indent: 0em;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 8px;padding-bottom: 8px;padding-left: 0px;padding-right: 0px;&quot; class=&quot;js_darkmode__93&quot;&gt;碰到&amp;nbsp;&lt;code style=&quot;color: rgb(30, 107, 184);font-size: 14px;line-height: 1.8em;letter-spacing: 0em;background-attachment: scroll;background-clip: border-box;background-color: rgba(27, 31, 35, 0.05);background-image: none;background-origin: padding-box;background-position-x: left;background-position-y: top;background-repeat: no-repeat;background-size: auto;width: auto;height: auto;margin-top: 0px;margin-bottom: 0px;margin-left: 2px;margin-right: 2px;padding-top: 2px;padding-bottom: 2px;padding-left: 4px;padding-right: 4px;border-top-style: none;border-bottom-style: none;border-left-style: none;border-right-style: none;border-top-width: 3px;border-bottom-width: 3px;border-left-width: 3px;border-right-width: 3px;border-top-color: rgb(0, 0, 0);border-bottom-color: rgba(0, 0, 0, 0.4);border-left-color: rgba(0, 0, 0, 0.4);border-right-color: rgba(0, 0, 0, 0.4);border-top-left-radius: 4px;border-top-right-radius: 4px;border-bottom-right-radius: 4px;border-bottom-left-radius: 4px;overflow-wrap: break-word;font-family: Consolas, Monaco, Menlo, monospace;word-break: break-all;&quot; class=&quot;js_darkmode__94&quot;&gt;doc&lt;/code&gt;、&lt;code style=&quot;color: rgb(30, 107, 184);font-size: 14px;line-height: 1.8em;letter-spacing: 0em;background-attachment: scroll;background-clip: border-box;background-color: rgba(27, 31, 35, 0.05);background-image: none;background-origin: padding-box;background-position-x: left;background-position-y: top;background-repeat: no-repeat;background-size: auto;width: auto;height: auto;margin-top: 0px;margin-bottom: 0px;margin-left: 2px;margin-right: 2px;padding-top: 2px;padding-bottom: 2px;padding-left: 4px;padding-right: 4px;border-top-style: none;border-bottom-style: none;border-left-style: none;border-right-style: none;border-top-width: 3px;border-bottom-width: 3px;border-left-width: 3px;border-right-width: 3px;border-top-color: rgb(0, 0, 0);border-bottom-color: rgba(0, 0, 0, 0.4);border-left-color: rgba(0, 0, 0, 0.4);border-right-color: rgba(0, 0, 0, 0.4);border-top-left-radius: 4px;border-top-right-radius: 4px;border-bottom-right-radius: 4px;border-bottom-left-radius: 4px;overflow-wrap: break-word;font-family: Consolas, Monaco, Menlo, monospace;word-break: break-all;&quot; class=&quot;js_darkmode__95&quot;&gt;xls&lt;/code&gt;&amp;nbsp;就没了。&lt;/p&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(0, 0, 0);font-size: 16px;line-height: 1.8em;letter-spacing: 0em;text-align: left;text-indent: 0em;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 8px;padding-bottom: 8px;padding-left: 0px;padding-right: 0px;&quot; class=&quot;js_darkmode__96&quot;&gt;但在真实项目里，老版 Office 文件根本绕不开。&lt;/p&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(0, 0, 0);font-size: 16px;line-height: 1.8em;letter-spacing: 0em;text-align: left;text-indent: 0em;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 8px;padding-bottom: 8px;padding-left: 0px;padding-right: 0px;&quot; class=&quot;js_darkmode__97&quot;&gt;特别是这些系统：&lt;/p&gt;&lt;pre data-tool=&quot;mdnice编辑器&quot; style=&quot;border-radius: 5px;box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;text-align: left;margin-top: 10px;margin-bottom: 10px;margin-left: 0px;margin-right: 0px;padding-top: 0px;padding-bottom: 0px;padding-left: 0px;padding-right: 0px;&quot; class=&quot;js_darkmode__98&quot;&gt;&lt;code style=&quot;overflow-x: auto;padding: 16px;color: #abb2bf;padding-top: 15px;background: #282c34;border-radius: 5px;display: -webkit-box;font-family: Consolas, Monaco, Menlo, monospace;font-size: 12px;&quot; class=&quot;js_darkmode__99&quot;&gt;OA&lt;br/&gt;档案管理&lt;br/&gt;合同系统&lt;br/&gt;财务系统&lt;br/&gt;政企项目&lt;br/&gt;内部知识库&lt;br/&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(0, 0, 0);font-size: 16px;line-height: 1.8em;letter-spacing: 0em;text-align: left;text-indent: 0em;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 8px;padding-bottom: 8px;padding-left: 0px;padding-right: 0px;&quot; class=&quot;js_darkmode__100&quot;&gt;历史数据里往往有大量&amp;nbsp;&lt;code style=&quot;color: rgb(30, 107, 184);font-size: 14px;line-height: 1.8em;letter-spacing: 0em;background-attachment: scroll;background-clip: border-box;background-color: rgba(27, 31, 35, 0.05);background-image: none;background-origin: padding-box;background-position-x: left;background-position-y: top;background-repeat: no-repeat;background-size: auto;width: auto;height: auto;margin-top: 0px;margin-bottom: 0px;margin-left: 2px;margin-right: 2px;padding-top: 2px;padding-bottom: 2px;padding-left: 4px;padding-right: 4px;border-top-style: none;border-bottom-style: none;border-left-style: none;border-right-style: none;border-top-width: 3px;border-bottom-width: 3px;border-left-width: 3px;border-right-width: 3px;border-top-color: rgb(0, 0, 0);border-bottom-color: rgba(0, 0, 0, 0.4);border-left-color: rgba(0, 0, 0, 0.4);border-right-color: rgba(0, 0, 0, 0.4);border-top-left-radius: 4px;border-top-right-radius: 4px;border-bottom-right-radius: 4px;border-bottom-left-radius: 4px;overflow-wrap: break-word;font-family: Consolas, Monaco, Menlo, monospace;word-break: break-all;&quot; class=&quot;js_darkmode__101&quot;&gt;doc&lt;/code&gt;&amp;nbsp;和&amp;nbsp;&lt;code style=&quot;color: rgb(30, 107, 184);font-size: 14px;line-height: 1.8em;letter-spacing: 0em;background-attachment: scroll;background-clip: border-box;background-color: rgba(27, 31, 35, 0.05);background-image: none;background-origin: padding-box;background-position-x: left;background-position-y: top;background-repeat: no-repeat;background-size: auto;width: auto;height: auto;margin-top: 0px;margin-bottom: 0px;margin-left: 2px;margin-right: 2px;padding-top: 2px;padding-bottom: 2px;padding-left: 4px;padding-right: 4px;border-top-style: none;border-bottom-style: none;border-left-style: none;border-right-style: none;border-top-width: 3px;border-bottom-width: 3px;border-left-width: 3px;border-right-width: 3px;border-top-color: rgb(0, 0, 0);border-bottom-color: rgba(0, 0, 0, 0.4);border-left-color: rgba(0, 0, 0, 0.4);border-right-color: rgba(0, 0, 0, 0.4);border-top-left-radius: 4px;border-top-right-radius: 4px;border-bottom-right-radius: 4px;border-bottom-left-radius: 4px;overflow-wrap: break-word;font-family: Consolas, Monaco, Menlo, monospace;word-break: break-all;&quot; class=&quot;js_darkmode__102&quot;&gt;xls&lt;/code&gt;。&lt;/p&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(0, 0, 0);font-size: 16px;line-height: 1.8em;letter-spacing: 0em;text-align: left;text-indent: 0em;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 8px;padding-bottom: 8px;padding-left: 0px;padding-right: 0px;&quot; class=&quot;js_darkmode__103&quot;&gt;用户不会区分&amp;nbsp;&lt;code style=&quot;color: rgb(30, 107, 184);font-size: 14px;line-height: 1.8em;letter-spacing: 0em;background-attachment: scroll;background-clip: border-box;background-color: rgba(27, 31, 35, 0.05);background-image: none;background-origin: padding-box;background-position-x: left;background-position-y: top;background-repeat: no-repeat;background-size: auto;width: auto;height: auto;margin-top: 0px;margin-bottom: 0px;margin-left: 2px;margin-right: 2px;padding-top: 2px;padding-bottom: 2px;padding-left: 4px;padding-right: 4px;border-top-style: none;border-bottom-style: none;border-left-style: none;border-right-style: none;border-top-width: 3px;border-bottom-width: 3px;border-left-width: 3px;border-right-width: 3px;border-top-color: rgb(0, 0, 0);border-bottom-color: rgba(0, 0, 0, 0.4);border-left-color: rgba(0, 0, 0, 0.4);border-right-color: rgba(0, 0, 0, 0.4);border-top-left-radius: 4px;border-top-right-radius: 4px;border-bottom-right-radius: 4px;border-bottom-left-radius: 4px;overflow-wrap: break-word;font-family: Consolas, Monaco, Menlo, monospace;word-break: break-all;&quot; class=&quot;js_darkmode__104&quot;&gt;doc&lt;/code&gt;&amp;nbsp;和&amp;nbsp;&lt;code style=&quot;color: rgb(30, 107, 184);font-size: 14px;line-height: 1.8em;letter-spacing: 0em;background-attachment: scroll;background-clip: border-box;background-color: rgba(27, 31, 35, 0.05);background-image: none;background-origin: padding-box;background-position-x: left;background-position-y: top;background-repeat: no-repeat;background-size: auto;width: auto;height: auto;margin-top: 0px;margin-bottom: 0px;margin-left: 2px;margin-right: 2px;padding-top: 2px;padding-bottom: 2px;padding-left: 4px;padding-right: 4px;border-top-style: none;border-bottom-style: none;border-left-style: none;border-right-style: none;border-top-width: 3px;border-bottom-width: 3px;border-left-width: 3px;border-right-width: 3px;border-top-color: rgb(0, 0, 0);border-bottom-color: rgba(0, 0, 0, 0.4);border-left-color: rgba(0, 0, 0, 0.4);border-right-color: rgba(0, 0, 0, 0.4);border-top-left-radius: 4px;border-top-right-radius: 4px;border-bottom-right-radius: 4px;border-bottom-left-radius: 4px;overflow-wrap: break-word;font-family: Consolas, Monaco, Menlo, monospace;word-break: break-all;&quot; class=&quot;js_darkmode__105&quot;&gt;docx&lt;/code&gt;，也不会关心二进制格式和 XML 格式的区别。他只知道这个文件明明是 Word，为什么点不开。&lt;/p&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(0, 0, 0);font-size: 16px;line-height: 1.8em;letter-spacing: 0em;text-align: left;text-indent: 0em;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 8px;padding-bottom: 8px;padding-left: 0px;padding-right: 0px;&quot; class=&quot;js_darkmode__106&quot;&gt;所以这次我把&amp;nbsp;&lt;code style=&quot;color: rgb(30, 107, 184);font-size: 14px;line-height: 1.8em;letter-spacing: 0em;background-attachment: scroll;background-clip: border-box;background-color: rgba(27, 31, 35, 0.05);background-image: none;background-origin: padding-box;background-position-x: left;background-position-y: top;background-repeat: no-repeat;background-size: auto;width: auto;height: auto;margin-top: 0px;margin-bottom: 0px;margin-left: 2px;margin-right: 2px;padding-top: 2px;padding-bottom: 2px;padding-left: 4px;padding-right: 4px;border-top-style: none;border-bottom-style: none;border-left-style: none;border-right-style: none;border-top-width: 3px;border-bottom-width: 3px;border-left-width: 3px;border-right-width: 3px;border-top-color: rgb(0, 0, 0);border-bottom-color: rgba(0, 0, 0, 0.4);border-left-color: rgba(0, 0, 0, 0.4);border-right-color: rgba(0, 0, 0, 0.4);border-top-left-radius: 4px;border-top-right-radius: 4px;border-bottom-right-radius: 4px;border-bottom-left-radius: 4px;overflow-wrap: break-word;font-family: Consolas, Monaco, Menlo, monospace;word-break: break-all;&quot; class=&quot;js_darkmode__107&quot;&gt;doc&lt;/code&gt;、&lt;code style=&quot;color: rgb(30, 107, 184);font-size: 14px;line-height: 1.8em;letter-spacing: 0em;background-attachment: scroll;background-clip: border-box;background-color: rgba(27, 31, 35, 0.05);background-image: none;background-origin: padding-box;background-position-x: left;background-position-y: top;background-repeat: no-repeat;background-size: auto;width: auto;height: auto;margin-top: 0px;margin-bottom: 0px;margin-left: 2px;margin-right: 2px;padding-top: 2px;padding-bottom: 2px;padding-left: 4px;padding-right: 4px;border-top-style: none;border-bottom-style: none;border-left-style: none;border-right-style: none;border-top-width: 3px;border-bottom-width: 3px;border-left-width: 3px;border-right-width: 3px;border-top-color: rgb(0, 0, 0);border-bottom-color: rgba(0, 0, 0, 0.4);border-left-color: rgba(0, 0, 0, 0.4);border-right-color: rgba(0, 0, 0, 0.4);border-top-left-radius: 4px;border-top-right-radius: 4px;border-bottom-right-radius: 4px;border-bottom-left-radius: 4px;overflow-wrap: break-word;font-family: Consolas, Monaco, Menlo, monospace;word-break: break-all;&quot; class=&quot;js_darkmode__108&quot;&gt;xls&lt;/code&gt;&amp;nbsp;也补了进来。&lt;/p&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(0, 0, 0);font-size: 16px;line-height: 1.8em;letter-spacing: 0em;text-align: left;text-indent: 0em;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 8px;padding-bottom: 8px;padding-left: 0px;padding-right: 0px;&quot; class=&quot;js_darkmode__109&quot;&gt;目前 Office 方向覆盖：&lt;/p&gt;&lt;pre data-tool=&quot;mdnice编辑器&quot; style=&quot;border-radius: 5px;box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;text-align: left;margin-top: 10px;margin-bottom: 10px;margin-left: 0px;margin-right: 0px;padding-top: 0px;padding-bottom: 0px;padding-left: 0px;padding-right: 0px;&quot; class=&quot;js_darkmode__110&quot;&gt;&lt;code style=&quot;overflow-x: auto;padding: 16px;color: #abb2bf;padding-top: 15px;background: #282c34;border-radius: 5px;display: -webkit-box;font-family: Consolas, Monaco, Menlo, monospace;font-size: 12px;&quot; class=&quot;js_darkmode__111&quot;&gt;doc&lt;br/&gt;docx&lt;br/&gt;xls&lt;br/&gt;xlsx&lt;br/&gt;pptx&lt;br/&gt;rtf&lt;br/&gt;odt&lt;br/&gt;csv&lt;br/&gt;wps&lt;br/&gt;et&lt;br/&gt;dps&lt;br/&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(0, 0, 0);font-size: 16px;line-height: 1.8em;letter-spacing: 0em;text-align: left;text-indent: 0em;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 8px;padding-bottom: 8px;padding-left: 0px;padding-right: 0px;&quot; class=&quot;js_darkmode__112&quot;&gt;对国内业务来说，&lt;code style=&quot;color: rgb(30, 107, 184);font-size: 14px;line-height: 1.8em;letter-spacing: 0em;background-attachment: scroll;background-clip: border-box;background-color: rgba(27, 31, 35, 0.05);background-image: none;background-origin: padding-box;background-position-x: left;background-position-y: top;background-repeat: no-repeat;background-size: auto;width: auto;height: auto;margin-top: 0px;margin-bottom: 0px;margin-left: 2px;margin-right: 2px;padding-top: 2px;padding-bottom: 2px;padding-left: 4px;padding-right: 4px;border-top-style: none;border-bottom-style: none;border-left-style: none;border-right-style: none;border-top-width: 3px;border-bottom-width: 3px;border-left-width: 3px;border-right-width: 3px;border-top-color: rgb(0, 0, 0);border-bottom-color: rgba(0, 0, 0, 0.4);border-left-color: rgba(0, 0, 0, 0.4);border-right-color: rgba(0, 0, 0, 0.4);border-top-left-radius: 4px;border-top-right-radius: 4px;border-bottom-right-radius: 4px;border-bottom-left-radius: 4px;overflow-wrap: break-word;font-family: Consolas, Monaco, Menlo, monospace;word-break: break-all;&quot; class=&quot;js_darkmode__113&quot;&gt;wps&lt;/code&gt;、&lt;code style=&quot;color: rgb(30, 107, 184);font-size: 14px;line-height: 1.8em;letter-spacing: 0em;background-attachment: scroll;background-clip: border-box;background-color: rgba(27, 31, 35, 0.05);background-image: none;background-origin: padding-box;background-position-x: left;background-position-y: top;background-repeat: no-repeat;background-size: auto;width: auto;height: auto;margin-top: 0px;margin-bottom: 0px;margin-left: 2px;margin-right: 2px;padding-top: 2px;padding-bottom: 2px;padding-left: 4px;padding-right: 4px;border-top-style: none;border-bottom-style: none;border-left-style: none;border-right-style: none;border-top-width: 3px;border-bottom-width: 3px;border-left-width: 3px;border-right-width: 3px;border-top-color: rgb(0, 0, 0);border-bottom-color: rgba(0, 0, 0, 0.4);border-left-color: rgba(0, 0, 0, 0.4);border-right-color: rgba(0, 0, 0, 0.4);border-top-left-radius: 4px;border-top-right-radius: 4px;border-bottom-right-radius: 4px;border-bottom-left-radius: 4px;overflow-wrap: break-word;font-family: Consolas, Monaco, Menlo, monospace;word-break: break-all;&quot; class=&quot;js_darkmode__114&quot;&gt;et&lt;/code&gt;、&lt;code style=&quot;color: rgb(30, 107, 184);font-size: 14px;line-height: 1.8em;letter-spacing: 0em;background-attachment: scroll;background-clip: border-box;background-color: rgba(27, 31, 35, 0.05);background-image: none;background-origin: padding-box;background-position-x: left;background-position-y: top;background-repeat: no-repeat;background-size: auto;width: auto;height: auto;margin-top: 0px;margin-bottom: 0px;margin-left: 2px;margin-right: 2px;padding-top: 2px;padding-bottom: 2px;padding-left: 4px;padding-right: 4px;border-top-style: none;border-bottom-style: none;border-left-style: none;border-right-style: none;border-top-width: 3px;border-bottom-width: 3px;border-left-width: 3px;border-right-width: 3px;border-top-color: rgb(0, 0, 0);border-bottom-color: rgba(0, 0, 0, 0.4);border-left-color: rgba(0, 0, 0, 0.4);border-right-color: rgba(0, 0, 0, 0.4);border-top-left-radius: 4px;border-top-right-radius: 4px;border-bottom-right-radius: 4px;border-bottom-left-radius: 4px;overflow-wrap: break-word;font-family: Consolas, Monaco, Menlo, monospace;word-break: break-all;&quot; class=&quot;js_darkmode__115&quot;&gt;dps&lt;/code&gt;&amp;nbsp;同样很重要。&lt;/p&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(0, 0, 0);font-size: 16px;line-height: 1.8em;letter-spacing: 0em;text-align: left;text-indent: 0em;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 8px;padding-bottom: 8px;padding-left: 0px;padding-right: 0px;&quot; class=&quot;js_darkmode__116&quot;&gt;文件格式从来不会按照开发者最舒服的方式出现，预览组件能不能处理这些“脏数据”，直接决定了它能不能落地。&lt;/p&gt;&lt;h2 data-tool=&quot;mdnice编辑器&quot; style=&quot;margin-top: 30px;margin-bottom: 15px;margin-left: 0px;margin-right: 0px;padding-top: 0px;padding-bottom: 0px;padding-left: 0px;padding-right: 0px;display: block;&quot;&gt;&lt;span style=&quot;font-size: 22px;color: #000000;line-height: 1.5em;letter-spacing: 0em;text-align: left;font-weight: bold;display: block;&quot; class=&quot;js_darkmode__117&quot;&gt;四种技术栈，接入方式保持一致&lt;/span&gt;&lt;/h2&gt;&lt;h3 data-tool=&quot;mdnice编辑器&quot; style=&quot;margin-top: 30px;margin-bottom: 15px;margin-left: 0px;margin-right: 0px;padding-top: 0px;padding-bottom: 0px;padding-left: 0px;padding-right: 0px;display: block;&quot;&gt;&lt;span style=&quot;font-size: 20px;color: #000000;line-height: 1.5em;letter-spacing: 0em;text-align: left;font-weight: bold;display: block;&quot; class=&quot;js_darkmode__118&quot;&gt;原生 JavaScript&lt;/span&gt;&lt;/h3&gt;&lt;pre data-tool=&quot;mdnice编辑器&quot; style=&quot;border-radius: 5px;box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;text-align: left;margin-top: 10px;margin-bottom: 10px;margin-left: 0px;margin-right: 0px;padding-top: 0px;padding-bottom: 0px;padding-left: 0px;padding-right: 0px;&quot; class=&quot;js_darkmode__119&quot;&gt;&lt;code style=&quot;overflow-x: auto;padding: 16px;color: #abb2bf;padding-top: 15px;background: #282c34;border-radius: 5px;display: -webkit-box;font-family: Consolas, Monaco, Menlo, monospace;font-size: 12px;&quot; class=&quot;js_darkmode__120&quot;&gt;&lt;span style=&quot;color: #c678dd;line-height: 26px;&quot;&gt;import&lt;/span&gt;&amp;nbsp;{&lt;br/&gt;&amp;nbsp; OpenFileViewer,&lt;br/&gt;&amp;nbsp; officePlugin,&lt;br/&gt;&amp;nbsp; pdfPlugin,&lt;br/&gt;&amp;nbsp; imagePlugin&lt;br/&gt;}&amp;nbsp;&lt;span style=&quot;color: #c678dd;line-height: 26px;&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color: #98c379;line-height: 26px;&quot;&gt;&amp;quot;@open-file-viewer/core&amp;quot;&lt;/span&gt;;&lt;br/&gt;&lt;br/&gt;&lt;span style=&quot;color: #c678dd;line-height: 26px;&quot;&gt;const&lt;/span&gt;&amp;nbsp;viewer =&amp;nbsp;&lt;span style=&quot;color: #c678dd;line-height: 26px;&quot;&gt;new&lt;/span&gt;&amp;nbsp;OpenFileViewer({&lt;br/&gt;&amp;nbsp; container:&amp;nbsp;&lt;span style=&quot;color: #e6c07b;line-height: 26px;&quot;&gt;document&lt;/span&gt;.querySelector(&lt;span style=&quot;color: #98c379;line-height: 26px;&quot;&gt;&amp;quot;&lt;a class=&quot;wx_topic_link js_darkmode__121&quot; style=&quot;color: rgb(87, 107, 149);&quot; data-topic=&quot;1&quot; data-recommend=&quot;&quot;&gt;#viewer&lt;/a&gt;&amp;quot;&lt;/span&gt;),&lt;br/&gt;&amp;nbsp; plugins: [&lt;br/&gt;&amp;nbsp; &amp;nbsp; officePlugin(),&lt;br/&gt;&amp;nbsp; &amp;nbsp; pdfPlugin(),&lt;br/&gt;&amp;nbsp; &amp;nbsp; imagePlugin()&lt;br/&gt;&amp;nbsp; ]&lt;br/&gt;});&lt;br/&gt;&lt;br/&gt;viewer.open(file);&lt;br/&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(0, 0, 0);font-size: 16px;line-height: 1.8em;letter-spacing: 0em;text-align: left;text-indent: 0em;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 8px;padding-bottom: 8px;padding-left: 0px;padding-right: 0px;&quot; class=&quot;js_darkmode__122&quot;&gt;原生项目、老后台、WebView、低代码平台都可以直接使用，不需要额外引入框架。&lt;/p&gt;&lt;h3 data-tool=&quot;mdnice编辑器&quot; style=&quot;margin-top: 30px;margin-bottom: 15px;margin-left: 0px;margin-right: 0px;padding-top: 0px;padding-bottom: 0px;padding-left: 0px;padding-right: 0px;display: block;&quot;&gt;&lt;span style=&quot;font-size: 20px;color: #000000;line-height: 1.5em;letter-spacing: 0em;text-align: left;font-weight: bold;display: block;&quot; class=&quot;js_darkmode__123&quot;&gt;Vue&lt;/span&gt;&lt;/h3&gt;&lt;pre data-tool=&quot;mdnice编辑器&quot; style=&quot;border-radius: 5px;box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;text-align: left;margin-top: 10px;margin-bottom: 10px;margin-left: 0px;margin-right: 0px;padding-top: 0px;padding-bottom: 0px;padding-left: 0px;padding-right: 0px;&quot; class=&quot;js_darkmode__124&quot;&gt;&lt;code style=&quot;overflow-x: auto;padding: 16px;color: #abb2bf;padding-top: 15px;background: #282c34;border-radius: 5px;display: -webkit-box;font-family: Consolas, Monaco, Menlo, monospace;font-size: 12px;&quot; class=&quot;js_darkmode__125&quot;&gt;&lt;span style=&quot;line-height: 26px;&quot;&gt;&amp;lt;&lt;span style=&quot;color: #e06c75;line-height: 26px;&quot;&gt;OpenFileViewer&lt;/span&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #d19a66;line-height: 26px;&quot;&gt;:file&lt;/span&gt;=&lt;span style=&quot;color: #98c379;line-height: 26px;&quot;&gt;&amp;quot;file&amp;quot;&lt;/span&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #d19a66;line-height: 26px;&quot;&gt;:file-name&lt;/span&gt;=&lt;span style=&quot;color: #98c379;line-height: 26px;&quot;&gt;&amp;quot;file.name&amp;quot;&lt;/span&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #d19a66;line-height: 26px;&quot;&gt;:plugins&lt;/span&gt;=&lt;span style=&quot;color: #98c379;line-height: 26px;&quot;&gt;&amp;quot;plugins&amp;quot;&lt;/span&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #d19a66;line-height: 26px;&quot;&gt;width&lt;/span&gt;=&lt;span style=&quot;color: #98c379;line-height: 26px;&quot;&gt;&amp;quot;100%&amp;quot;&lt;/span&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #d19a66;line-height: 26px;&quot;&gt;height&lt;/span&gt;=&lt;span style=&quot;color: #98c379;line-height: 26px;&quot;&gt;&amp;quot;640px&amp;quot;&lt;/span&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #d19a66;line-height: 26px;&quot;&gt;toolbar&lt;/span&gt;&lt;br/&gt;/&amp;gt;&lt;/span&gt;&lt;br/&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 data-tool=&quot;mdnice编辑器&quot; style=&quot;margin-top: 30px;margin-bottom: 15px;margin-left: 0px;margin-right: 0px;padding-top: 0px;padding-bottom: 0px;padding-left: 0px;padding-right: 0px;display: block;&quot;&gt;&lt;span style=&quot;font-size: 20px;color: #000000;line-height: 1.5em;letter-spacing: 0em;text-align: left;font-weight: bold;display: block;&quot; class=&quot;js_darkmode__126&quot;&gt;React&lt;/span&gt;&lt;/h3&gt;&lt;pre data-tool=&quot;mdnice编辑器&quot; style=&quot;border-radius: 5px;box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;text-align: left;margin-top: 10px;margin-bottom: 10px;margin-left: 0px;margin-right: 0px;padding-top: 0px;padding-bottom: 0px;padding-left: 0px;padding-right: 0px;&quot; class=&quot;js_darkmode__127&quot;&gt;&lt;code style=&quot;overflow-x: auto;padding: 16px;color: #abb2bf;padding-top: 15px;background: #282c34;border-radius: 5px;display: -webkit-box;font-family: Consolas, Monaco, Menlo, monospace;font-size: 12px;&quot; class=&quot;js_darkmode__128&quot;&gt;&lt;span style=&quot;line-height: 26px;&quot;&gt;&amp;lt;&lt;span style=&quot;color: #e06c75;line-height: 26px;&quot;&gt;OpenFileViewer&lt;/span&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #d19a66;line-height: 26px;&quot;&gt;file&lt;/span&gt;=&lt;span style=&quot;color: #98c379;line-height: 26px;&quot;&gt;{file}&lt;/span&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #d19a66;line-height: 26px;&quot;&gt;fileName&lt;/span&gt;=&lt;span style=&quot;color: #98c379;line-height: 26px;&quot;&gt;{file.name}&lt;/span&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #d19a66;line-height: 26px;&quot;&gt;plugins&lt;/span&gt;=&lt;span style=&quot;color: #98c379;line-height: 26px;&quot;&gt;{plugins}&lt;/span&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #d19a66;line-height: 26px;&quot;&gt;width&lt;/span&gt;=&lt;span style=&quot;color: #98c379;line-height: 26px;&quot;&gt;&amp;quot;100%&amp;quot;&lt;/span&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #d19a66;line-height: 26px;&quot;&gt;height&lt;/span&gt;=&lt;span style=&quot;color: #98c379;line-height: 26px;&quot;&gt;&amp;quot;640px&amp;quot;&lt;/span&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #d19a66;line-height: 26px;&quot;&gt;toolbar&lt;/span&gt;&lt;br/&gt;/&amp;gt;&lt;/span&gt;&lt;br/&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 data-tool=&quot;mdnice编辑器&quot; style=&quot;margin-top: 30px;margin-bottom: 15px;margin-left: 0px;margin-right: 0px;padding-top: 0px;padding-bottom: 0px;padding-left: 0px;padding-right: 0px;display: block;&quot;&gt;&lt;span style=&quot;font-size: 20px;color: #000000;line-height: 1.5em;letter-spacing: 0em;text-align: left;font-weight: bold;display: block;&quot; class=&quot;js_darkmode__129&quot;&gt;Svelte&lt;/span&gt;&lt;/h3&gt;&lt;pre data-tool=&quot;mdnice编辑器&quot; style=&quot;border-radius: 5px;box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;text-align: left;margin-top: 10px;margin-bottom: 10px;margin-left: 0px;margin-right: 0px;padding-top: 0px;padding-bottom: 0px;padding-left: 0px;padding-right: 0px;&quot; class=&quot;js_darkmode__130&quot;&gt;&lt;code style=&quot;overflow-x: auto;padding: 16px;color: #abb2bf;padding-top: 15px;background: #282c34;border-radius: 5px;display: -webkit-box;font-family: Consolas, Monaco, Menlo, monospace;font-size: 12px;&quot; class=&quot;js_darkmode__131&quot;&gt;&lt;span style=&quot;line-height: 26px;&quot;&gt;&amp;lt;&lt;span style=&quot;color: #e06c75;line-height: 26px;&quot;&gt;OpenFileViewer&lt;/span&gt;&lt;br/&gt;&amp;nbsp; {&lt;span style=&quot;color: #d19a66;line-height: 26px;&quot;&gt;file&lt;/span&gt;}&lt;br/&gt;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #d19a66;line-height: 26px;&quot;&gt;fileName&lt;/span&gt;=&lt;span style=&quot;color: #98c379;line-height: 26px;&quot;&gt;{file.name}&lt;/span&gt;&lt;br/&gt;&amp;nbsp; {&lt;span style=&quot;color: #d19a66;line-height: 26px;&quot;&gt;plugins&lt;/span&gt;}&lt;br/&gt;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #d19a66;line-height: 26px;&quot;&gt;width&lt;/span&gt;=&lt;span style=&quot;color: #98c379;line-height: 26px;&quot;&gt;&amp;quot;100%&amp;quot;&lt;/span&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #d19a66;line-height: 26px;&quot;&gt;height&lt;/span&gt;=&lt;span style=&quot;color: #98c379;line-height: 26px;&quot;&gt;&amp;quot;640px&amp;quot;&lt;/span&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #d19a66;line-height: 26px;&quot;&gt;toolbar&lt;/span&gt;&lt;br/&gt;/&amp;gt;&lt;/span&gt;&lt;br/&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(0, 0, 0);font-size: 16px;line-height: 1.8em;letter-spacing: 0em;text-align: left;text-indent: 0em;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 8px;padding-bottom: 8px;padding-left: 0px;padding-right: 0px;&quot; class=&quot;js_darkmode__132&quot;&gt;四套写法看起来不同，底层调用的是同一个&amp;nbsp;&lt;code style=&quot;color: rgb(30, 107, 184);font-size: 14px;line-height: 1.8em;letter-spacing: 0em;background-attachment: scroll;background-clip: border-box;background-color: rgba(27, 31, 35, 0.05);background-image: none;background-origin: padding-box;background-position-x: left;background-position-y: top;background-repeat: no-repeat;background-size: auto;width: auto;height: auto;margin-top: 0px;margin-bottom: 0px;margin-left: 2px;margin-right: 2px;padding-top: 2px;padding-bottom: 2px;padding-left: 4px;padding-right: 4px;border-top-style: none;border-bottom-style: none;border-left-style: none;border-right-style: none;border-top-width: 3px;border-bottom-width: 3px;border-left-width: 3px;border-right-width: 3px;border-top-color: rgb(0, 0, 0);border-bottom-color: rgba(0, 0, 0, 0.4);border-left-color: rgba(0, 0, 0, 0.4);border-right-color: rgba(0, 0, 0, 0.4);border-top-left-radius: 4px;border-top-right-radius: 4px;border-bottom-right-radius: 4px;border-bottom-left-radius: 4px;overflow-wrap: break-word;font-family: Consolas, Monaco, Menlo, monospace;word-break: break-all;&quot; class=&quot;js_darkmode__133&quot;&gt;Core&lt;/code&gt;。&lt;/p&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(0, 0, 0);font-size: 16px;line-height: 1.8em;letter-spacing: 0em;text-align: left;text-indent: 0em;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 8px;padding-bottom: 8px;padding-left: 0px;padding-right: 0px;&quot; class=&quot;js_darkmode__134&quot;&gt;这意味着格式支持、工具栏、异常状态、插件能力都不会因为框架不同而割裂。&lt;/p&gt;&lt;h2 data-tool=&quot;mdnice编辑器&quot; style=&quot;margin-top: 30px;margin-bottom: 15px;margin-left: 0px;margin-right: 0px;padding-top: 0px;padding-bottom: 0px;padding-left: 0px;padding-right: 0px;display: block;&quot;&gt;&lt;span style=&quot;font-size: 22px;color: #000000;line-height: 1.5em;letter-spacing: 0em;text-align: left;font-weight: bold;display: block;&quot; class=&quot;js_darkmode__135&quot;&gt;真正难做的，还有失败状态&lt;/span&gt;&lt;/h2&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(0, 0, 0);font-size: 16px;line-height: 1.8em;letter-spacing: 0em;text-align: left;text-indent: 0em;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 8px;padding-bottom: 8px;padding-left: 0px;padding-right: 0px;&quot; class=&quot;js_darkmode__136&quot;&gt;文件预览不可能永远成功。&lt;/p&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(0, 0, 0);font-size: 16px;line-height: 1.8em;letter-spacing: 0em;text-align: left;text-indent: 0em;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 8px;padding-bottom: 8px;padding-left: 0px;padding-right: 0px;&quot; class=&quot;js_darkmode__137&quot;&gt;真实项目里经常会碰到：&lt;/p&gt;&lt;pre data-tool=&quot;mdnice编辑器&quot; style=&quot;border-radius: 5px;box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;text-align: left;margin-top: 10px;margin-bottom: 10px;margin-left: 0px;margin-right: 0px;padding-top: 0px;padding-bottom: 0px;padding-left: 0px;padding-right: 0px;&quot; class=&quot;js_darkmode__138&quot;&gt;&lt;code style=&quot;overflow-x: auto;padding: 16px;color: #abb2bf;padding-top: 15px;background: #282c34;border-radius: 5px;display: -webkit-box;font-family: Consolas, Monaco, Menlo, monospace;font-size: 12px;&quot; class=&quot;js_darkmode__139&quot;&gt;文件链接过期&lt;br/&gt;对象存储跨域&lt;br/&gt;文件体积过大&lt;br/&gt;格式伪装&lt;br/&gt;文件损坏&lt;br/&gt;浏览器能力不足&lt;br/&gt;插件加载失败&lt;br/&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(0, 0, 0);font-size: 16px;line-height: 1.8em;letter-spacing: 0em;text-align: left;text-indent: 0em;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 8px;padding-bottom: 8px;padding-left: 0px;padding-right: 0px;&quot; class=&quot;js_darkmode__140&quot;&gt;所以一套能落地的预览 SDK，必须把完整状态链路处理掉：&lt;/p&gt;&lt;pre data-tool=&quot;mdnice编辑器&quot; style=&quot;border-radius: 5px;box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;text-align: left;margin-top: 10px;margin-bottom: 10px;margin-left: 0px;margin-right: 0px;padding-top: 0px;padding-bottom: 0px;padding-left: 0px;padding-right: 0px;&quot; class=&quot;js_darkmode__141&quot;&gt;&lt;code style=&quot;overflow-x: auto;padding: 16px;color: #abb2bf;padding-top: 15px;background: #282c34;border-radius: 5px;display: -webkit-box;font-family: Consolas, Monaco, Menlo, monospace;font-size: 12px;&quot; class=&quot;js_darkmode__142&quot;&gt;loading&lt;br/&gt;preview&lt;br/&gt;error&lt;br/&gt;unsupported&lt;br/&gt;download fallback&lt;br/&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(0, 0, 0);font-size: 16px;line-height: 1.8em;letter-spacing: 0em;text-align: left;text-indent: 0em;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 8px;padding-bottom: 8px;padding-left: 0px;padding-right: 0px;&quot; class=&quot;js_darkmode__143&quot;&gt;&lt;code style=&quot;color: rgb(30, 107, 184);font-size: 14px;line-height: 1.8em;letter-spacing: 0em;background-attachment: scroll;background-clip: border-box;background-color: rgba(27, 31, 35, 0.05);background-image: none;background-origin: padding-box;background-position-x: left;background-position-y: top;background-repeat: no-repeat;background-size: auto;width: auto;height: auto;margin-top: 0px;margin-bottom: 0px;margin-left: 2px;margin-right: 2px;padding-top: 2px;padding-bottom: 2px;padding-left: 4px;padding-right: 4px;border-top-style: none;border-bottom-style: none;border-left-style: none;border-right-style: none;border-top-width: 3px;border-bottom-width: 3px;border-left-width: 3px;border-right-width: 3px;border-top-color: rgb(0, 0, 0);border-bottom-color: rgba(0, 0, 0, 0.4);border-left-color: rgba(0, 0, 0, 0.4);border-right-color: rgba(0, 0, 0, 0.4);border-top-left-radius: 4px;border-top-right-radius: 4px;border-bottom-right-radius: 4px;border-bottom-left-radius: 4px;overflow-wrap: break-word;font-family: Consolas, Monaco, Menlo, monospace;word-break: break-all;&quot; class=&quot;js_darkmode__144&quot;&gt;Open File Viewer&lt;/code&gt;&amp;nbsp;把这些状态统一放进容器里。&lt;/p&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(0, 0, 0);font-size: 16px;line-height: 1.8em;letter-spacing: 0em;text-align: left;text-indent: 0em;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 8px;padding-bottom: 8px;padding-left: 0px;padding-right: 0px;&quot; class=&quot;js_darkmode__145&quot;&gt;业务层不用给每一种格式重复写加载动画、错误提示和下载按钮。&lt;/p&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(0, 0, 0);font-size: 16px;line-height: 1.8em;letter-spacing: 0em;text-align: left;text-indent: 0em;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 8px;padding-bottom: 8px;padding-left: 0px;padding-right: 0px;&quot; class=&quot;js_darkmode__146&quot;&gt;预览成功，就进入 Renderer。&lt;/p&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(0, 0, 0);font-size: 16px;line-height: 1.8em;letter-spacing: 0em;text-align: left;text-indent: 0em;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 8px;padding-bottom: 8px;padding-left: 0px;padding-right: 0px;&quot; class=&quot;js_darkmode__147&quot;&gt;预览失败，就进入 Fallback。&lt;/p&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(0, 0, 0);font-size: 16px;line-height: 1.8em;letter-spacing: 0em;text-align: left;text-indent: 0em;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 8px;padding-bottom: 8px;padding-left: 0px;padding-right: 0px;&quot; class=&quot;js_darkmode__148&quot;&gt;格式不支持，也可以直接提示下载，或者接入服务端转换。&lt;/p&gt;&lt;h2 data-tool=&quot;mdnice编辑器&quot; style=&quot;margin-top: 30px;margin-bottom: 15px;margin-left: 0px;margin-right: 0px;padding-top: 0px;padding-bottom: 0px;padding-left: 0px;padding-right: 0px;display: block;&quot;&gt;&lt;span style=&quot;font-size: 22px;color: #000000;line-height: 1.5em;letter-spacing: 0em;text-align: left;font-weight: bold;display: block;&quot; class=&quot;js_darkmode__149&quot;&gt;Office 高保真预览，必须保留服务端路线&lt;/span&gt;&lt;/h2&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(0, 0, 0);font-size: 16px;line-height: 1.8em;letter-spacing: 0em;text-align: left;text-indent: 0em;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 8px;padding-bottom: 8px;padding-left: 0px;padding-right: 0px;&quot; class=&quot;js_darkmode__150&quot;&gt;浏览器端预览 Office 有天然边界。&lt;/p&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(0, 0, 0);font-size: 16px;line-height: 1.8em;letter-spacing: 0em;text-align: left;text-indent: 0em;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 8px;padding-bottom: 8px;padding-left: 0px;padding-right: 0px;&quot; class=&quot;js_darkmode__151&quot;&gt;复杂 Word 里可能有：&lt;/p&gt;&lt;pre data-tool=&quot;mdnice编辑器&quot; style=&quot;border-radius: 5px;box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;text-align: left;margin-top: 10px;margin-bottom: 10px;margin-left: 0px;margin-right: 0px;padding-top: 0px;padding-bottom: 0px;padding-left: 0px;padding-right: 0px;&quot; class=&quot;js_darkmode__152&quot;&gt;&lt;code style=&quot;overflow-x: auto;padding: 16px;color: #abb2bf;padding-top: 15px;background: #282c34;border-radius: 5px;display: -webkit-box;font-family: Consolas, Monaco, Menlo, monospace;font-size: 12px;&quot; class=&quot;js_darkmode__153&quot;&gt;特殊字体&lt;br/&gt;页眉页脚&lt;br/&gt;浮动图片&lt;br/&gt;文本框&lt;br/&gt;修订记录&lt;br/&gt;嵌套表格&lt;br/&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(0, 0, 0);font-size: 16px;line-height: 1.8em;letter-spacing: 0em;text-align: left;text-indent: 0em;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 8px;padding-bottom: 8px;padding-left: 0px;padding-right: 0px;&quot; class=&quot;js_darkmode__154&quot;&gt;Excel 里也会出现复杂公式、图表、冻结窗格和大数据量。&lt;/p&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(0, 0, 0);font-size: 16px;line-height: 1.8em;letter-spacing: 0em;text-align: left;text-indent: 0em;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 8px;padding-bottom: 8px;padding-left: 0px;padding-right: 0px;&quot; class=&quot;js_darkmode__155&quot;&gt;前端可以完成基础预览，但很难百分之百复刻 Microsoft Office 或 WPS 的排版结果。&lt;/p&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(0, 0, 0);font-size: 16px;line-height: 1.8em;letter-spacing: 0em;text-align: left;text-indent: 0em;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 8px;padding-bottom: 8px;padding-left: 0px;padding-right: 0px;&quot; class=&quot;js_darkmode__156&quot;&gt;所以更稳的工程方案通常是：&lt;/p&gt;&lt;pre data-tool=&quot;mdnice编辑器&quot; style=&quot;border-radius: 5px;box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;text-align: left;margin-top: 10px;margin-bottom: 10px;margin-left: 0px;margin-right: 0px;padding-top: 0px;padding-bottom: 0px;padding-left: 0px;padding-right: 0px;&quot; class=&quot;js_darkmode__157&quot;&gt;&lt;code style=&quot;overflow-x: auto;padding: 16px;color: #abb2bf;padding-top: 15px;background: #282c34;border-radius: 5px;display: -webkit-box;font-family: Consolas, Monaco, Menlo, monospace;font-size: 12px;&quot; class=&quot;js_darkmode__158&quot;&gt;普通文件&lt;br/&gt;前端直接预览&lt;br/&gt;&lt;br/&gt;复杂文件&lt;br/&gt;服务端转换为 PDF&lt;br/&gt;前端继续预览&lt;br/&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(0, 0, 0);font-size: 16px;line-height: 1.8em;letter-spacing: 0em;text-align: left;text-indent: 0em;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 8px;padding-bottom: 8px;padding-left: 0px;padding-right: 0px;&quot; class=&quot;js_darkmode__159&quot;&gt;&lt;code style=&quot;color: rgb(30, 107, 184);font-size: 14px;line-height: 1.8em;letter-spacing: 0em;background-attachment: scroll;background-clip: border-box;background-color: rgba(27, 31, 35, 0.05);background-image: none;background-origin: padding-box;background-position-x: left;background-position-y: top;background-repeat: no-repeat;background-size: auto;width: auto;height: auto;margin-top: 0px;margin-bottom: 0px;margin-left: 2px;margin-right: 2px;padding-top: 2px;padding-bottom: 2px;padding-left: 4px;padding-right: 4px;border-top-style: none;border-bottom-style: none;border-left-style: none;border-right-style: none;border-top-width: 3px;border-bottom-width: 3px;border-left-width: 3px;border-right-width: 3px;border-top-color: rgb(0, 0, 0);border-bottom-color: rgba(0, 0, 0, 0.4);border-left-color: rgba(0, 0, 0, 0.4);border-right-color: rgba(0, 0, 0, 0.4);border-top-left-radius: 4px;border-top-right-radius: 4px;border-bottom-right-radius: 4px;border-bottom-left-radius: 4px;overflow-wrap: break-word;font-family: Consolas, Monaco, Menlo, monospace;word-break: break-all;&quot; class=&quot;js_darkmode__160&quot;&gt;Open File Viewer&lt;/code&gt;&amp;nbsp;可以把两条路线统一起来。&lt;/p&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(0, 0, 0);font-size: 16px;line-height: 1.8em;letter-spacing: 0em;text-align: left;text-indent: 0em;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 8px;padding-bottom: 8px;padding-left: 0px;padding-right: 0px;&quot; class=&quot;js_darkmode__161&quot;&gt;前端能直接处理的，交给 Office 插件；需要高保真的，服务端转成 PDF，再交给 PDF 插件。&lt;/p&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(0, 0, 0);font-size: 16px;line-height: 1.8em;letter-spacing: 0em;text-align: left;text-indent: 0em;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 8px;padding-bottom: 8px;padding-left: 0px;padding-right: 0px;&quot; class=&quot;js_darkmode__162&quot;&gt;用户看到的仍然是同一个预览容器，业务页面也不用维护两套 UI。&lt;/p&gt;&lt;h2 data-tool=&quot;mdnice编辑器&quot; style=&quot;margin-top: 30px;margin-bottom: 15px;margin-left: 0px;margin-right: 0px;padding-top: 0px;padding-bottom: 0px;padding-left: 0px;padding-right: 0px;display: block;&quot;&gt;&lt;span style=&quot;font-size: 22px;color: #000000;line-height: 1.5em;letter-spacing: 0em;text-align: left;font-weight: bold;display: block;&quot; class=&quot;js_darkmode__163&quot;&gt;官网已经可以在线体验&lt;/span&gt;&lt;/h2&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(0, 0, 0);font-size: 16px;line-height: 1.8em;letter-spacing: 0em;text-align: left;text-indent: 0em;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 8px;padding-bottom: 8px;padding-left: 0px;padding-right: 0px;&quot; class=&quot;js_darkmode__164&quot;&gt;我做了一个在线官网，可以直接体验：&lt;code style=&quot;color: rgb(30, 107, 184);font-size: 14px;line-height: 1.8em;letter-spacing: 0em;background-attachment: scroll;background-clip: border-box;background-color: rgba(27, 31, 35, 0.05);background-image: none;background-origin: padding-box;background-position-x: left;background-position-y: top;background-repeat: no-repeat;background-size: auto;width: auto;height: auto;margin-top: 0px;margin-bottom: 0px;margin-left: 2px;margin-right: 2px;padding-top: 2px;padding-bottom: 2px;padding-left: 4px;padding-right: 4px;border-top-style: none;border-bottom-style: none;border-left-style: none;border-right-style: none;border-top-width: 3px;border-bottom-width: 3px;border-left-width: 3px;border-right-width: 3px;border-top-color: rgb(0, 0, 0);border-bottom-color: rgba(0, 0, 0, 0.4);border-left-color: rgba(0, 0, 0, 0.4);border-right-color: rgba(0, 0, 0, 0.4);border-top-left-radius: 4px;border-top-right-radius: 4px;border-bottom-right-radius: 4px;border-bottom-left-radius: 4px;overflow-wrap: break-word;font-family: Consolas, Monaco, Menlo, monospace;word-break: break-all;&quot; class=&quot;js_darkmode__165&quot;&gt;https://open-file-viewer-workspace.void.app/&lt;/code&gt;&lt;/p&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(0, 0, 0);font-size: 16px;line-height: 1.8em;letter-spacing: 0em;text-align: left;text-indent: 0em;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 8px;padding-bottom: 8px;padding-left: 0px;padding-right: 0px;&quot; class=&quot;js_darkmode__166&quot;&gt;里面可以查看不同格式的预览效果，也可以了解插件体系和接入方式。&lt;/p&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(0, 0, 0);font-size: 16px;line-height: 1.8em;letter-spacing: 0em;text-align: left;text-indent: 0em;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 8px;padding-bottom: 8px;padding-left: 0px;padding-right: 0px;&quot; class=&quot;js_darkmode__167&quot;&gt;正在做这些项目的朋友，可以重点试一下：&lt;/p&gt;&lt;pre data-tool=&quot;mdnice编辑器&quot; style=&quot;border-radius: 5px;box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;text-align: left;margin-top: 10px;margin-bottom: 10px;margin-left: 0px;margin-right: 0px;padding-top: 0px;padding-bottom: 0px;padding-left: 0px;padding-right: 0px;&quot; class=&quot;js_darkmode__168&quot;&gt;&lt;code style=&quot;overflow-x: auto;padding: 16px;color: #abb2bf;padding-top: 15px;background: #282c34;border-radius: 5px;display: -webkit-box;font-family: Consolas, Monaco, Menlo, monospace;font-size: 12px;&quot; class=&quot;js_darkmode__169&quot;&gt;附件中心&lt;br/&gt;OA 审批&lt;br/&gt;ERP 单据&lt;br/&gt;CRM 合同&lt;br/&gt;知识库&lt;br/&gt;网盘&lt;br/&gt;低代码平台&lt;br/&gt;档案系统&lt;br/&gt;企业文档平台&lt;br/&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(0, 0, 0);font-size: 16px;line-height: 1.8em;letter-spacing: 0em;text-align: left;text-indent: 0em;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 8px;padding-bottom: 8px;padding-left: 0px;padding-right: 0px;&quot; class=&quot;js_darkmode__170&quot;&gt;这些系统看起来完全不同，底层碰到的问题却高度一致：&lt;/p&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(0, 0, 0);font-size: 16px;line-height: 1.8em;letter-spacing: 0em;text-align: left;text-indent: 0em;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 8px;padding-bottom: 8px;padding-left: 0px;padding-right: 0px;&quot; class=&quot;js_darkmode__171&quot;&gt;&lt;strong style=&quot;color: rgb(0, 0, 0);font-weight: bold;background-attachment: scroll;background-clip: border-box;background-color: rgba(0, 0, 0, 0);background-image: none;background-origin: padding-box;background-position-x: left;background-position-y: top;background-repeat: no-repeat;background-size: auto;width: auto;height: auto;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 0px;padding-bottom: 0px;padding-left: 0px;padding-right: 0px;border-top-style: none;border-bottom-style: none;border-left-style: none;border-right-style: none;border-top-width: 3px;border-bottom-width: 3px;border-left-width: 3px;border-right-width: 3px;border-top-color: rgba(0, 0, 0, 0.4);border-bottom-color: rgba(0, 0, 0, 0.4);border-left-color: rgba(0, 0, 0, 0.4);border-right-color: rgba(0, 0, 0, 0.4);border-top-left-radius: 0px;border-top-right-radius: 0px;border-bottom-right-radius: 0px;border-bottom-left-radius: 0px;&quot; class=&quot;js_darkmode__172&quot;&gt;文件类型杂，预览逻辑乱，后期维护成本高。&lt;/strong&gt;&lt;/p&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(0, 0, 0);font-size: 16px;line-height: 1.8em;letter-spacing: 0em;text-align: left;text-indent: 0em;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 8px;padding-bottom: 8px;padding-left: 0px;padding-right: 0px;&quot; class=&quot;js_darkmode__173&quot;&gt;&lt;code style=&quot;color: rgb(30, 107, 184);font-size: 14px;line-height: 1.8em;letter-spacing: 0em;background-attachment: scroll;background-clip: border-box;background-color: rgba(27, 31, 35, 0.05);background-image: none;background-origin: padding-box;background-position-x: left;background-position-y: top;background-repeat: no-repeat;background-size: auto;width: auto;height: auto;margin-top: 0px;margin-bottom: 0px;margin-left: 2px;margin-right: 2px;padding-top: 2px;padding-bottom: 2px;padding-left: 4px;padding-right: 4px;border-top-style: none;border-bottom-style: none;border-left-style: none;border-right-style: none;border-top-width: 3px;border-bottom-width: 3px;border-left-width: 3px;border-right-width: 3px;border-top-color: rgb(0, 0, 0);border-bottom-color: rgba(0, 0, 0, 0.4);border-left-color: rgba(0, 0, 0, 0.4);border-right-color: rgba(0, 0, 0, 0.4);border-top-left-radius: 4px;border-top-right-radius: 4px;border-bottom-right-radius: 4px;border-bottom-left-radius: 4px;overflow-wrap: break-word;font-family: Consolas, Monaco, Menlo, monospace;word-break: break-all;&quot; class=&quot;js_darkmode__174&quot;&gt;Open File Viewer&lt;/code&gt;&amp;nbsp;想做的，就是把这部分能力统一沉淀下来。&lt;/p&gt;&lt;h2 data-tool=&quot;mdnice编辑器&quot; style=&quot;margin-top: 30px;margin-bottom: 15px;margin-left: 0px;margin-right: 0px;padding-top: 0px;padding-bottom: 0px;padding-left: 0px;padding-right: 0px;display: block;&quot;&gt;&lt;span style=&quot;font-size: 22px;color: #000000;line-height: 1.5em;letter-spacing: 0em;text-align: left;font-weight: bold;display: block;&quot; class=&quot;js_darkmode__175&quot;&gt;完全免费开源，求个&amp;nbsp;&lt;strong style=&quot;color: rgb(0, 0, 0);font-weight: bold;background-attachment: scroll;background-clip: border-box;background-color: rgba(0, 0, 0, 0);background-image: none;background-origin: padding-box;background-position-x: left;background-position-y: top;background-repeat: no-repeat;background-size: auto;width: auto;height: auto;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 0px;padding-bottom: 0px;padding-left: 0px;padding-right: 0px;border-top-style: none;border-bottom-style: none;border-left-style: none;border-right-style: none;border-top-width: 3px;border-bottom-width: 3px;border-left-width: 3px;border-right-width: 3px;border-top-color: rgba(0, 0, 0, 0.4);border-bottom-color: rgba(0, 0, 0, 0.4);border-left-color: rgba(0, 0, 0, 0.4);border-right-color: rgba(0, 0, 0, 0.4);border-top-left-radius: 0px;border-top-right-radius: 0px;border-bottom-right-radius: 0px;border-bottom-left-radius: 0px;&quot; class=&quot;js_darkmode__176&quot;&gt;Star&lt;/strong&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(0, 0, 0);font-size: 16px;line-height: 1.8em;letter-spacing: 0em;text-align: left;text-indent: 0em;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 8px;padding-bottom: 8px;padding-left: 0px;padding-right: 0px;&quot; class=&quot;js_darkmode__177&quot;&gt;项目目前完全免费开源。&lt;/p&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(0, 0, 0);font-size: 16px;line-height: 1.8em;letter-spacing: 0em;text-align: left;text-indent: 0em;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 8px;padding-bottom: 8px;padding-left: 0px;padding-right: 0px;&quot; class=&quot;js_darkmode__178&quot;&gt;&lt;strong style=&quot;color: rgb(0, 0, 0);font-weight: bold;background-attachment: scroll;background-clip: border-box;background-color: rgba(0, 0, 0, 0);background-image: none;background-origin: padding-box;background-position-x: left;background-position-y: top;background-repeat: no-repeat;background-size: auto;width: auto;height: auto;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 0px;padding-bottom: 0px;padding-left: 0px;padding-right: 0px;border-top-style: none;border-bottom-style: none;border-left-style: none;border-right-style: none;border-top-width: 3px;border-bottom-width: 3px;border-left-width: 3px;border-right-width: 3px;border-top-color: rgba(0, 0, 0, 0.4);border-bottom-color: rgba(0, 0, 0, 0.4);border-left-color: rgba(0, 0, 0, 0.4);border-right-color: rgba(0, 0, 0, 0.4);border-top-left-radius: 0px;border-top-right-radius: 0px;border-bottom-right-radius: 0px;border-bottom-left-radius: 0px;&quot; class=&quot;js_darkmode__179&quot;&gt;GitHub&lt;/strong&gt;&amp;nbsp;地址：&lt;/p&gt;&lt;pre data-tool=&quot;mdnice编辑器&quot; style=&quot;border-radius: 5px;box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;text-align: left;margin-top: 10px;margin-bottom: 10px;margin-left: 0px;margin-right: 0px;padding-top: 0px;padding-bottom: 0px;padding-left: 0px;padding-right: 0px;&quot; class=&quot;js_darkmode__180&quot;&gt;&lt;code style=&quot;overflow-x: auto;padding: 16px;color: #abb2bf;padding-top: 15px;background: #282c34;border-radius: 5px;display: -webkit-box;font-family: Consolas, Monaco, Menlo, monospace;font-size: 12px;&quot; class=&quot;js_darkmode__181&quot;&gt;https://github.com/xushanpei/open-file-viewer&lt;br/&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(0, 0, 0);font-size: 16px;line-height: 1.8em;letter-spacing: 0em;text-align: left;text-indent: 0em;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 8px;padding-bottom: 8px;padding-left: 0px;padding-right: 0px;&quot; class=&quot;js_darkmode__182&quot;&gt;我开发这个项目的原因很简单：&lt;/p&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(0, 0, 0);font-size: 16px;line-height: 1.8em;letter-spacing: 0em;text-align: left;text-indent: 0em;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 8px;padding-bottom: 8px;padding-left: 0px;padding-right: 0px;&quot; class=&quot;js_darkmode__183&quot;&gt;&lt;strong style=&quot;color: rgb(0, 0, 0);font-weight: bold;background-attachment: scroll;background-clip: border-box;background-color: rgba(0, 0, 0, 0);background-image: none;background-origin: padding-box;background-position-x: left;background-position-y: top;background-repeat: no-repeat;background-size: auto;width: auto;height: auto;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 0px;padding-bottom: 0px;padding-left: 0px;padding-right: 0px;border-top-style: none;border-bottom-style: none;border-left-style: none;border-right-style: none;border-top-width: 3px;border-bottom-width: 3px;border-left-width: 3px;border-right-width: 3px;border-top-color: rgba(0, 0, 0, 0.4);border-bottom-color: rgba(0, 0, 0, 0.4);border-left-color: rgba(0, 0, 0, 0.4);border-right-color: rgba(0, 0, 0, 0.4);border-top-left-radius: 0px;border-top-right-radius: 0px;border-bottom-right-radius: 0px;border-bottom-left-radius: 0px;&quot; class=&quot;js_darkmode__184&quot;&gt;希望把自己踩过的坑做成一套通用能力，帮助更多开发者少重复造轮子。&lt;/strong&gt;&lt;/p&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(0, 0, 0);font-size: 16px;line-height: 1.8em;letter-spacing: 0em;text-align: left;text-indent: 0em;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 8px;padding-bottom: 8px;padding-left: 0px;padding-right: 0px;&quot; class=&quot;js_darkmode__185&quot;&gt;文件预览这种项目，表面上没有多复杂，真正做起来全是细节。&lt;/p&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(0, 0, 0);font-size: 16px;line-height: 1.8em;letter-spacing: 0em;text-align: left;text-indent: 0em;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 8px;padding-bottom: 8px;padding-left: 0px;padding-right: 0px;&quot; class=&quot;js_darkmode__186&quot;&gt;每一种格式、每一种异常状态、每一个浏览器差异、每一条 Fallback 路径，都需要一点点补齐。&lt;/p&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(0, 0, 0);font-size: 16px;line-height: 1.8em;letter-spacing: 0em;text-align: left;text-indent: 0em;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 8px;padding-bottom: 8px;padding-left: 0px;padding-right: 0px;&quot; class=&quot;js_darkmode__187&quot;&gt;如果你正在做文件预览，欢迎直接拿去试。&lt;/p&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(0, 0, 0);font-size: 16px;line-height: 1.8em;letter-spacing: 0em;text-align: left;text-indent: 0em;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 8px;padding-bottom: 8px;padding-left: 0px;padding-right: 0px;&quot; class=&quot;js_darkmode__188&quot;&gt;觉得项目有用，也希望能顺手给个&amp;nbsp;&lt;code style=&quot;color: rgb(30, 107, 184);font-size: 14px;line-height: 1.8em;letter-spacing: 0em;background-attachment: scroll;background-clip: border-box;background-color: rgba(27, 31, 35, 0.05);background-image: none;background-origin: padding-box;background-position-x: left;background-position-y: top;background-repeat: no-repeat;background-size: auto;width: auto;height: auto;margin-top: 0px;margin-bottom: 0px;margin-left: 2px;margin-right: 2px;padding-top: 2px;padding-bottom: 2px;padding-left: 4px;padding-right: 4px;border-top-style: none;border-bottom-style: none;border-left-style: none;border-right-style: none;border-top-width: 3px;border-bottom-width: 3px;border-left-width: 3px;border-right-width: 3px;border-top-color: rgb(0, 0, 0);border-bottom-color: rgba(0, 0, 0, 0.4);border-left-color: rgba(0, 0, 0, 0.4);border-right-color: rgba(0, 0, 0, 0.4);border-top-left-radius: 4px;border-top-right-radius: 4px;border-bottom-right-radius: 4px;border-bottom-left-radius: 4px;overflow-wrap: break-word;font-family: Consolas, Monaco, Menlo, monospace;word-break: break-all;&quot; class=&quot;js_darkmode__189&quot;&gt;Star&lt;/code&gt;。&lt;/p&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(0, 0, 0);font-size: 16px;line-height: 1.8em;letter-spacing: 0em;text-align: left;text-indent: 0em;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 8px;padding-bottom: 8px;padding-left: 0px;padding-right: 0px;&quot; class=&quot;js_darkmode__190&quot;&gt;&lt;strong style=&quot;color: rgb(0, 0, 0);font-weight: bold;background-attachment: scroll;background-clip: border-box;background-color: rgba(0, 0, 0, 0);background-image: none;background-origin: padding-box;background-position-x: left;background-position-y: top;background-repeat: no-repeat;background-size: auto;width: auto;height: auto;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 0px;padding-bottom: 0px;padding-left: 0px;padding-right: 0px;border-top-style: none;border-bottom-style: none;border-left-style: none;border-right-style: none;border-top-width: 3px;border-bottom-width: 3px;border-left-width: 3px;border-right-width: 3px;border-top-color: rgba(0, 0, 0, 0.4);border-bottom-color: rgba(0, 0, 0, 0.4);border-left-color: rgba(0, 0, 0, 0.4);border-right-color: rgba(0, 0, 0, 0.4);border-top-left-radius: 0px;border-top-right-radius: 0px;border-bottom-right-radius: 0px;border-bottom-left-radius: 0px;&quot; class=&quot;js_darkmode__191&quot;&gt;开源不易，一个 Star，真的会成为我继续维护下去的动力。&lt;/strong&gt;&lt;/p&gt;&lt;ul style=&quot;list-style-type: disc;&quot; class=&quot;js_darkmode__192 list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;section style=&quot;margin-top: 5px;margin-bottom: 5px;color: rgb(1, 1, 1);font-size: 16px;line-height: 1.8em;letter-spacing: 0em;text-align: left;font-weight: normal;&quot; class=&quot;js_darkmode__193&quot;&gt;&lt;p style=&quot;color: rgb(0, 0, 0);font-size: 16px;line-height: 1.8em;letter-spacing: 0em;text-align: left;text-indent: 0em;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 8px;padding-bottom: 8px;padding-left: 0px;padding-right: 0px;&quot; class=&quot;js_darkmode__194&quot;&gt;&lt;strong style=&quot;color: rgb(0, 0, 0);font-weight: bold;background-attachment: scroll;background-clip: border-box;background-color: rgba(0, 0, 0, 0);background-image: none;background-origin: padding-box;background-position-x: left;background-position-y: top;background-repeat: no-repeat;background-size: auto;width: auto;height: auto;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 0px;padding-bottom: 0px;padding-left: 0px;padding-right: 0px;border-top-style: none;border-bottom-style: none;border-left-style: none;border-right-style: none;border-top-width: 3px;border-bottom-width: 3px;border-left-width: 3px;border-right-width: 3px;border-top-color: rgba(0, 0, 0, 0.4);border-bottom-color: rgba(0, 0, 0, 0.4);border-left-color: rgba(0, 0, 0, 0.4);border-right-color: rgba(0, 0, 0, 0.4);border-top-left-radius: 0px;border-top-right-radius: 0px;border-bottom-right-radius: 0px;border-bottom-left-radius: 0px;&quot; class=&quot;js_darkmode__195&quot;&gt;官网地址&lt;/strong&gt;：&lt;code style=&quot;height: auto;color: rgb(30, 107, 184);font-size: 14px;line-height: 1.8em;letter-spacing: 0em;background-attachment: scroll;background-clip: border-box;background-color: rgba(27, 31, 35, 0.05);background-image: none;background-origin: padding-box;background-position-x: left;background-position-y: top;background-repeat: no-repeat;background-size: auto;width: auto;margin-top: 0px;margin-bottom: 0px;margin-left: 2px;margin-right: 2px;padding-top: 2px;padding-bottom: 2px;padding-left: 4px;padding-right: 4px;border-top-style: none;border-bottom-style: none;border-left-style: none;border-right-style: none;border-top-width: 3px;border-bottom-width: 3px;border-left-width: 3px;border-right-width: 3px;border-top-color: rgb(0, 0, 0);border-bottom-color: rgba(0, 0, 0, 0.4);border-left-color: rgba(0, 0, 0, 0.4);border-right-color: rgba(0, 0, 0, 0.4);border-top-left-radius: 4px;border-top-right-radius: 4px;border-bottom-right-radius: 4px;border-bottom-left-radius: 4px;overflow-wrap: break-word;font-family: Consolas, Monaco, Menlo, monospace;word-break: break-all;&quot; class=&quot;js_darkmode__196&quot;&gt;&lt;span class=&quot;wx_text_underline&quot;&gt;https://open-file-viewer-workspace.void.app/&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section style=&quot;margin-top: 5px;margin-bottom: 5px;color: rgb(1, 1, 1);font-size: 16px;line-height: 1.8em;letter-spacing: 0em;text-align: left;font-weight: normal;&quot; class=&quot;js_darkmode__197&quot;&gt;&lt;p style=&quot;color: rgb(0, 0, 0);font-size: 16px;line-height: 1.8em;letter-spacing: 0em;text-align: left;text-indent: 0em;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 8px;padding-bottom: 8px;padding-left: 0px;padding-right: 0px;&quot; class=&quot;js_darkmode__198&quot;&gt;&lt;strong style=&quot;color: rgb(0, 0, 0);font-weight: bold;background-attachment: scroll;background-clip: border-box;background-color: rgba(0, 0, 0, 0);background-image: none;background-origin: padding-box;background-position-x: left;background-position-y: top;background-repeat: no-repeat;background-size: auto;width: auto;height: auto;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 0px;padding-bottom: 0px;padding-left: 0px;padding-right: 0px;border-top-style: none;border-bottom-style: none;border-left-style: none;border-right-style: none;border-top-width: 3px;border-bottom-width: 3px;border-left-width: 3px;border-right-width: 3px;border-top-color: rgba(0, 0, 0, 0.4);border-bottom-color: rgba(0, 0, 0, 0.4);border-left-color: rgba(0, 0, 0, 0.4);border-right-color: rgba(0, 0, 0, 0.4);border-top-left-radius: 0px;border-top-right-radius: 0px;border-bottom-right-radius: 0px;border-bottom-left-radius: 0px;&quot; class=&quot;js_darkmode__199&quot;&gt;GitHub 地址&lt;/strong&gt;：&lt;code style=&quot;height: auto;color: rgb(30, 107, 184);font-size: 14px;line-height: 1.8em;letter-spacing: 0em;background-attachment: scroll;background-clip: border-box;background-color: rgba(27, 31, 35, 0.05);background-image: none;background-origin: padding-box;background-position-x: left;background-position-y: top;background-repeat: no-repeat;background-size: auto;width: auto;margin-top: 0px;margin-bottom: 0px;margin-left: 2px;margin-right: 2px;padding-top: 2px;padding-bottom: 2px;padding-left: 4px;padding-right: 4px;border-top-style: none;border-bottom-style: none;border-left-style: none;border-right-style: none;border-top-width: 3px;border-bottom-width: 3px;border-left-width: 3px;border-right-width: 3px;border-top-color: rgb(0, 0, 0);border-bottom-color: rgba(0, 0, 0, 0.4);border-left-color: rgba(0, 0, 0, 0.4);border-right-color: rgba(0, 0, 0, 0.4);border-top-left-radius: 4px;border-top-right-radius: 4px;border-bottom-right-radius: 4px;border-bottom-left-radius: 4px;overflow-wrap: break-word;font-family: Consolas, Monaco, Menlo, monospace;word-break: break-all;&quot; class=&quot;js_darkmode__200&quot;&gt;https://github.com/xushanpei/open-file-viewer&lt;/code&gt;&lt;/p&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section style=&quot;margin-top: 5px;margin-bottom: 5px;color: rgb(1, 1, 1);font-size: 16px;line-height: 1.8em;letter-spacing: 0em;text-align: left;font-weight: normal;&quot; class=&quot;js_darkmode__201&quot;&gt;&lt;p style=&quot;color: rgb(0, 0, 0);font-size: 16px;line-height: 1.8em;letter-spacing: 0em;text-align: left;text-indent: 0em;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 8px;padding-bottom: 8px;padding-left: 0px;padding-right: 0px;&quot; class=&quot;js_darkmode__202&quot;&gt;&lt;strong style=&quot;color: rgb(0, 0, 0);font-weight: bold;background-attachment: scroll;background-clip: border-box;background-color: rgba(0, 0, 0, 0);background-image: none;background-origin: padding-box;background-position-x: left;background-position-y: top;background-repeat: no-repeat;background-size: auto;width: auto;height: auto;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 0px;padding-bottom: 0px;padding-left: 0px;padding-right: 0px;border-top-style: none;border-bottom-style: none;border-left-style: none;border-right-style: none;border-top-width: 3px;border-bottom-width: 3px;border-left-width: 3px;border-right-width: 3px;border-top-color: rgba(0, 0, 0, 0.4);border-bottom-color: rgba(0, 0, 0, 0.4);border-left-color: rgba(0, 0, 0, 0.4);border-right-color: rgba(0, 0, 0, 0.4);border-top-left-radius: 0px;border-top-right-radius: 0px;border-bottom-right-radius: 0px;border-bottom-left-radius: 0px;&quot; class=&quot;js_darkmode__203&quot;&gt;npm 地址&lt;/strong&gt;：&lt;code style=&quot;height: auto;color: rgb(30, 107, 184);font-size: 14px;line-height: 1.8em;letter-spacing: 0em;background-attachment: scroll;background-clip: border-box;background-color: rgba(27, 31, 35, 0.05);background-image: none;background-origin: padding-box;background-position-x: left;background-position-y: top;background-repeat: no-repeat;background-size: auto;width: auto;margin-top: 0px;margin-bottom: 0px;margin-left: 2px;margin-right: 2px;padding-top: 2px;padding-bottom: 2px;padding-left: 4px;padding-right: 4px;border-top-style: none;border-bottom-style: none;border-left-style: none;border-right-style: none;border-top-width: 3px;border-bottom-width: 3px;border-left-width: 3px;border-right-width: 3px;border-top-color: rgb(0, 0, 0);border-bottom-color: rgba(0, 0, 0, 0.4);border-left-color: rgba(0, 0, 0, 0.4);border-right-color: rgba(0, 0, 0, 0.4);border-top-left-radius: 4px;border-top-right-radius: 4px;border-bottom-right-radius: 4px;border-bottom-left-radius: 4px;overflow-wrap: break-word;font-family: Consolas, Monaco, Menlo, monospace;word-break: break-all;&quot; class=&quot;js_darkmode__204&quot;&gt;https://www.npmjs.com/package/@open-file-viewer/core&lt;/code&gt;&lt;/p&gt;&lt;/section&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Mon, 13 Jul 2026 14:36:59 +0800</pubDate></item><item><title>一套覆盖8大业务场景的 .NET 企业级快速开发框架</title><link>https://www.codepub.top/post/624.html</link><description>&lt;p style=&quot;margin: 8px 0px; color: rgb(51, 51, 51); line-height: 1.9; font-size: 14px; visibility: visible;&quot; class=&quot;js_darkmode__0&quot;&gt;&lt;span style=&quot;visibility: visible;&quot;&gt;做过企业信息化的人都知道：每个新项目都要重新搭权限、写登录、搞审批流、接消息队列……重复造轮子，乏味且耗时。&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 8px 0px; color: rgb(51, 51, 51); line-height: 1.9; font-size: 14px; visibility: visible;&quot; class=&quot;js_darkmode__1&quot;&gt;&lt;span style=&quot;visibility: visible;&quot;&gt;有没有一套开箱即用的框架，把这些基础设施全部封装好，让你专注业务逻辑？&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 8px 0px; color: rgb(51, 51, 51); line-height: 1.9; font-size: 14px; visibility: visible;&quot; class=&quot;js_darkmode__2&quot;&gt;&lt;strong style=&quot;visibility: visible;&quot;&gt;&lt;span style=&quot;visibility: visible;&quot;&gt;Scm.Net 就是为此而生。&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p style=&quot;margin: 16px 0px; color: rgb(51, 51, 51); line-height: 1.9; font-size: 15px; font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Roboto, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, sans-serif; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; white-space: normal; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial; visibility: visible;&quot; class=&quot;js_darkmode__3&quot;&gt;&lt;span style=&quot;visibility: visible;&quot;&gt;笔者多年从事供应链系统及企业信息化系统的产品与研发，在梳理多种项目经验的过程中，开发了这套企业级中后台管理系统的快速开发框架。它采用前后端分离架构，内置权限管理、代码生成、工作流引擎、实时消息、数据可视化等企业级核心能力，目前已支撑&amp;nbsp;&lt;/span&gt;&lt;strong style=&quot;visibility: visible;&quot;&gt;&lt;span style=&quot;visibility: visible;&quot;&gt;8 款产品&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;visibility: visible;&quot;&gt;落地运行。&lt;/span&gt;&lt;/p&gt;&lt;h2 style=&quot;font-size: 20px; font-weight: bold; color: rgb(255, 255, 255); background: linear-gradient(135deg, rgb(102, 126, 234) 0%, rgb(118, 75, 162) 100%) rgb(255, 255, 255); padding: 12px 20px; margin: 40px 0px 20px; border-radius: 6px; line-height: 1.4; font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Roboto, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, sans-serif; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; white-space: normal; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial; visibility: visible;&quot; class=&quot;js_darkmode__bg__0&quot;&gt;&lt;span style=&quot;visibility: visible;&quot;&gt;01 项目背景与定位&lt;/span&gt;&lt;/h2&gt;&lt;p style=&quot;margin: 16px 0px; color: rgb(51, 51, 51); line-height: 1.9; font-size: 15px; font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Roboto, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, sans-serif; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; white-space: normal; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial; visibility: visible;&quot; class=&quot;js_darkmode__4&quot;&gt;&lt;span style=&quot;visibility: visible;&quot;&gt;在企业信息化领域，供应链管理系统（SCM）是覆盖面最广、复杂度最高的场景之一。一个完整的供应链体系涉及订单、仓储、运输、配送、计费、园区管理、资产管理和物联网等多个子系统。每个子系统都需要认证授权、权限管控、工作流审批、消息推送、定时任务、数据可视化等基础能力。&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 16px 0px; color: rgb(51, 51, 51); line-height: 1.9; font-size: 15px; font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Roboto, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, sans-serif; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; white-space: normal; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial; visibility: visible;&quot; class=&quot;js_darkmode__5&quot;&gt;&lt;span style=&quot;visibility: visible;&quot;&gt;Scm.Net 的作者将这些年在多个项目中反复使用的基础设施提炼为一套通用框架，目标只有一个：&lt;/span&gt;&lt;strong style=&quot;visibility: visible;&quot;&gt;&lt;span style=&quot;visibility: visible;&quot;&gt;让开发者不再重复搭建基础设施，专注于业务实现。&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p style=&quot;visibility: visible;&quot;&gt;&lt;span style=&quot;visibility: visible;&quot;&gt;🎯 核心定位&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;visibility: visible;&quot;&gt;&lt;span style=&quot;visibility: visible;&quot;&gt;企业级中后台管理系统快速开发框架 | 前后端分离架构 | 开箱即用 | 可扩展插件机制&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;visibility: visible;&quot;&gt;&lt;span style=&quot;visibility: visible;&quot;&gt;Scm.Net 框架全景&lt;/span&gt;&lt;/p&gt;&lt;h2 style=&quot;font-size: 20px; font-weight: bold; color: rgb(255, 255, 255); background: linear-gradient(135deg, rgb(102, 126, 234) 0%, rgb(118, 75, 162) 100%) rgb(255, 255, 255); padding: 12px 20px; margin: 40px 0px 20px; border-radius: 6px; line-height: 1.4; font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Roboto, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, sans-serif; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; white-space: normal; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial; visibility: visible;&quot; class=&quot;js_darkmode__bg__1&quot;&gt;&lt;span style=&quot;visibility: visible;&quot;&gt;02 已落地产品矩阵&lt;/span&gt;&lt;/h2&gt;&lt;p style=&quot;margin: 16px 0px; color: rgb(51, 51, 51); line-height: 1.9; font-size: 15px; font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Roboto, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, sans-serif; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; white-space: normal; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial; visibility: visible;&quot; class=&quot;js_darkmode__6&quot;&gt;&lt;span style=&quot;visibility: visible;&quot;&gt;框架的价值不在 PPT 里，而在实际产品中。目前基于 Scm.Net 已开发并运行的产品包括：&lt;/span&gt;&lt;/p&gt;&lt;table class=&quot;js_darkmode__7&quot; width=&quot;400&quot;&gt;&lt;tbody style=&quot;visibility: visible;&quot;&gt;&lt;tr style=&quot;visibility: visible;&quot; class=&quot;firstRow&quot;&gt;&lt;th style=&quot;background: rgb(102, 126, 234); color: rgb(255, 255, 255); padding: 10px 12px; text-align: left; font-weight: bold; font-size: 13px; visibility: visible;&quot;&gt;&lt;section style=&quot;visibility: visible;&quot;&gt;&lt;span style=&quot;visibility: visible;&quot;&gt;简称&lt;/span&gt;&lt;/section&gt;&lt;/th&gt;&lt;th style=&quot;background: rgb(102, 126, 234); color: rgb(255, 255, 255); padding: 10px 12px; text-align: left; font-weight: bold; font-size: 13px; visibility: visible;&quot;&gt;&lt;section style=&quot;visibility: visible;&quot;&gt;&lt;span style=&quot;visibility: visible;&quot;&gt;产品全称&lt;/span&gt;&lt;/section&gt;&lt;/th&gt;&lt;th style=&quot;background: rgb(102, 126, 234); color: rgb(255, 255, 255); padding: 10px 12px; text-align: left; font-weight: bold; font-size: 13px; visibility: visible;&quot;&gt;&lt;section style=&quot;visibility: visible;&quot;&gt;&lt;span style=&quot;visibility: visible;&quot;&gt;业务领域&lt;/span&gt;&lt;/section&gt;&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;background: rgb(249, 249, 249);&quot; class=&quot;js_darkmode__8&quot;&gt;&lt;strong&gt;OMS&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;background: rgb(249, 249, 249);&quot; class=&quot;js_darkmode__9&quot;&gt;&lt;section&gt;订单管理系统&lt;/section&gt;&lt;/td&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;background: rgb(249, 249, 249);&quot; class=&quot;js_darkmode__10&quot;&gt;&lt;section&gt;订单全生命周期管理&lt;/section&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;&quot; class=&quot;js_darkmode__11&quot;&gt;&lt;strong&gt;WMS&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;&quot; class=&quot;js_darkmode__12&quot;&gt;&lt;section&gt;仓储管理系统&lt;/section&gt;&lt;/td&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;&quot; class=&quot;js_darkmode__13&quot;&gt;&lt;section&gt;入库/出库/盘点/库存&lt;/section&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;background: rgb(249, 249, 249);&quot; class=&quot;js_darkmode__14&quot;&gt;&lt;strong&gt;TMS&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;background: rgb(249, 249, 249);&quot; class=&quot;js_darkmode__15&quot;&gt;&lt;section&gt;运输管理系统&lt;/section&gt;&lt;/td&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;background: rgb(249, 249, 249);&quot; class=&quot;js_darkmode__16&quot;&gt;&lt;section&gt;运单调度/路线优化&lt;/section&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;&quot; class=&quot;js_darkmode__17&quot;&gt;&lt;strong&gt;DMS&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;&quot; class=&quot;js_darkmode__18&quot;&gt;&lt;section&gt;配送管理系统&lt;/section&gt;&lt;/td&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;&quot; class=&quot;js_darkmode__19&quot;&gt;&lt;section&gt;最后一公里配送&lt;/section&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;background: rgb(249, 249, 249);&quot; class=&quot;js_darkmode__20&quot;&gt;&lt;strong&gt;BMS&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;background: rgb(249, 249, 249);&quot; class=&quot;js_darkmode__21&quot;&gt;&lt;section&gt;计费管理系统&lt;/section&gt;&lt;/td&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;background: rgb(249, 249, 249);&quot; class=&quot;js_darkmode__22&quot;&gt;&lt;section&gt;费用计算/账单生成&lt;/section&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;&quot; class=&quot;js_darkmode__23&quot;&gt;&lt;strong&gt;YMS&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;&quot; class=&quot;js_darkmode__24&quot;&gt;&lt;section&gt;园区管理系统&lt;/section&gt;&lt;/td&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;&quot; class=&quot;js_darkmode__25&quot;&gt;&lt;section&gt;园区资源/出入管控&lt;/section&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;background: rgb(249, 249, 249);&quot; class=&quot;js_darkmode__26&quot;&gt;&lt;strong&gt;EAM&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;background: rgb(249, 249, 249);&quot; class=&quot;js_darkmode__27&quot;&gt;&lt;section&gt;资产管理系统&lt;/section&gt;&lt;/td&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;background: rgb(249, 249, 249);&quot; class=&quot;js_darkmode__28&quot;&gt;&lt;section&gt;资产全生命周期&lt;/section&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;&quot; class=&quot;js_darkmode__29&quot;&gt;&lt;strong&gt;IOT&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;&quot; class=&quot;js_darkmode__30&quot;&gt;&lt;section&gt;物联网管理系统&lt;/section&gt;&lt;/td&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;&quot; class=&quot;js_darkmode__31&quot;&gt;&lt;section&gt;设备接入/数据采集&lt;/section&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p style=&quot;margin: 16px 0px;color: rgb(51, 51, 51);line-height: 1.9;font-size: 15px;font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Roboto, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, sans-serif;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;&quot; class=&quot;js_darkmode__32&quot;&gt;从订单到仓储，从运输到计费，从园区到物联网——&lt;strong&gt;一套框架，8 个产品，覆盖供应链全链路。&lt;/strong&gt;这足以证明框架的通用性和可扩展性。&lt;/p&gt;&lt;h2 style=&quot;font-size: 20px;font-weight: bold;color: rgb(255, 255, 255);background: linear-gradient(135deg, rgb(102, 126, 234) 0%, rgb(118, 75, 162) 100%) rgb(255, 255, 255);padding: 12px 20px;margin: 40px 0px 20px;border-radius: 6px;line-height: 1.4;font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Roboto, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, sans-serif;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;&quot; class=&quot;js_darkmode__bg__2&quot;&gt;03 核心特性全景&lt;/h2&gt;&lt;p style=&quot;margin: 16px 0px;color: rgb(51, 51, 51);line-height: 1.9;font-size: 15px;font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Roboto, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, sans-serif;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;&quot; class=&quot;js_darkmode__33&quot;&gt;Scm.Net 的特性覆盖面非常广，我们按四个维度逐一拆解。&lt;/p&gt;&lt;h3 style=&quot;font-size: 17px;font-weight: bold;color: rgb(51, 51, 51);margin: 28px 0px 12px;padding-left: 12px;border-left: 4px solid rgb(102, 126, 234);line-height: 1.5;font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Roboto, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, sans-serif;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;&quot; class=&quot;js_darkmode__34&quot;&gt;🔐 认证与安全&lt;/h3&gt;&lt;p&gt;多维度安全体系&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;display: inline-block;padding: 2px 10px;border-radius: 12px;font-size: 12px;margin: 2px 4px 2px 0px;font-weight: normal;background: #E3F2FD;color: #1565C0;&quot; class=&quot;js_darkmode__35&quot;&gt;账号登录&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;display: inline-block;padding: 2px 10px;border-radius: 12px;font-size: 12px;margin: 2px 4px 2px 0px;font-weight: normal;background: #E3F2FD;color: #1565C0;&quot; class=&quot;js_darkmode__36&quot;&gt;手机号登录&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;display: inline-block;padding: 2px 10px;border-radius: 12px;font-size: 12px;margin: 2px 4px 2px 0px;font-weight: normal;background: #E3F2FD;color: #1565C0;&quot; class=&quot;js_darkmode__37&quot;&gt;邮箱登录&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;display: inline-block;padding: 2px 10px;border-radius: 12px;font-size: 12px;margin: 2px 4px 2px 0px;font-weight: normal;background: #F3E5F5;color: #7B1FA2;&quot; class=&quot;js_darkmode__38&quot;&gt;OAuth&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;display: inline-block;padding: 2px 10px;border-radius: 12px;font-size: 12px;margin: 2px 4px 2px 0px;font-weight: normal;background: #F3E5F5;color: #7B1FA2;&quot; class=&quot;js_darkmode__39&quot;&gt;OIDC&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;display: inline-block;padding: 2px 10px;border-radius: 12px;font-size: 12px;margin: 2px 4px 2px 0px;font-weight: normal;background: #F3E5F5;color: #7B1FA2;&quot; class=&quot;js_darkmode__40&quot;&gt;SAML&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;display: inline-block;padding: 2px 10px;border-radius: 12px;font-size: 12px;margin: 2px 4px 2px 0px;font-weight: normal;background: #E8F5E9;color: #2E7D32;&quot; class=&quot;js_darkmode__41&quot;&gt;面部识别&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;display: inline-block;padding: 2px 10px;border-radius: 12px;font-size: 12px;margin: 2px 4px 2px 0px;font-weight: normal;background: #E8F5E9;color: #2E7D32;&quot; class=&quot;js_darkmode__42&quot;&gt;指纹识别&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;display: inline-block;padding: 2px 10px;border-radius: 12px;font-size: 12px;margin: 2px 4px 2px 0px;font-weight: normal;background: #E8F5E9;color: #2E7D32;&quot; class=&quot;js_darkmode__43&quot;&gt;声纹识别&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;display: inline-block;padding: 2px 10px;border-radius: 12px;font-size: 12px;margin: 2px 4px 2px 0px;font-weight: normal;background: #FFF3E0;color: #E65100;&quot; class=&quot;js_darkmode__44&quot;&gt;TOTP 双因素&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;display: inline-block;padding: 2px 10px;border-radius: 12px;font-size: 12px;margin: 2px 4px 2px 0px;font-weight: normal;background: #FFEBEE;color: #C62828;&quot; class=&quot;js_darkmode__45&quot;&gt;AES/DES 加密&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;display: inline-block;padding: 2px 10px;border-radius: 12px;font-size: 12px;margin: 2px 4px 2px 0px;font-weight: normal;background: #FFEBEE;color: #C62828;&quot; class=&quot;js_darkmode__46&quot;&gt;JWT Bearer&lt;/span&gt;&lt;/p&gt;&lt;ul style=&quot;margin: 12px 0px;padding-left: 28px;color: rgb(51, 51, 51);font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Roboto, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, sans-serif;font-size: 16px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;&quot; class=&quot;js_darkmode__47 list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;多种登录方式&lt;/strong&gt;&lt;/p&gt;&lt;section&gt;&amp;nbsp;— 支持账号、手机号、邮箱，以及 OAuth、OIDC、SAML 等第三方联合登录，满足企业内外部多种接入场景&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;生物识别&lt;/strong&gt;&lt;/p&gt;&lt;section&gt;&amp;nbsp;— 面部识别、指纹识别、声纹识别接口预留，未来可无缝接入&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;双因素认证&lt;/strong&gt;&lt;/p&gt;&lt;section&gt;&amp;nbsp;— 基于 TOTP 的 OTP 动态口令，为高安全场景提供第二道防线&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;数据加密&lt;/strong&gt;&lt;/p&gt;&lt;section&gt;&amp;nbsp;— 前后端传输参数支持 AES/DES 加密签名，防止中间人攻击&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;JWT 鉴权&lt;/strong&gt;&lt;/p&gt;&lt;section&gt;&amp;nbsp;— Bearer Token 认证，支持自动刷新，无需频繁登录&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;六级权限体系&lt;/strong&gt;&lt;/p&gt;&lt;section&gt;&amp;nbsp;— 公司 / 部门 / 岗位 / 分组 / 用户 / 角色，精细到按钮级别&lt;/section&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3 style=&quot;font-size: 17px;font-weight: bold;color: rgb(51, 51, 51);margin: 28px 0px 12px;padding-left: 12px;border-left: 4px solid rgb(102, 126, 234);line-height: 1.5;font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Roboto, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, sans-serif;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;&quot; class=&quot;js_darkmode__48&quot;&gt;⚙️ 系统与框架&lt;/h3&gt;&lt;p&gt;基础设施全覆盖&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;display: inline-block;padding: 2px 10px;border-radius: 12px;font-size: 12px;margin: 2px 4px 2px 0px;font-weight: normal;background: #E3F2FD;color: #1565C0;&quot; class=&quot;js_darkmode__49&quot;&gt;多数据库&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;display: inline-block;padding: 2px 10px;border-radius: 12px;font-size: 12px;margin: 2px 4px 2px 0px;font-weight: normal;background: #E3F2FD;color: #1565C0;&quot; class=&quot;js_darkmode__50&quot;&gt;多缓存&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;display: inline-block;padding: 2px 10px;border-radius: 12px;font-size: 12px;margin: 2px 4px 2px 0px;font-weight: normal;background: #E8F5E9;color: #2E7D32;&quot; class=&quot;js_darkmode__51&quot;&gt;代码生成器&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;display: inline-block;padding: 2px 10px;border-radius: 12px;font-size: 12px;margin: 2px 4px 2px 0px;font-weight: normal;background: #E8F5E9;color: #2E7D32;&quot; class=&quot;js_darkmode__52&quot;&gt;工作流引擎&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;display: inline-block;padding: 2px 10px;border-radius: 12px;font-size: 12px;margin: 2px 4px 2px 0px;font-weight: normal;background: #F3E5F5;color: #7B1FA2;&quot; class=&quot;js_darkmode__53&quot;&gt;动态API&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;display: inline-block;padding: 2px 10px;border-radius: 12px;font-size: 12px;margin: 2px 4px 2px 0px;font-weight: normal;background: #FFF3E0;color: #E65100;&quot; class=&quot;js_darkmode__54&quot;&gt;定时任务&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;display: inline-block;padding: 2px 10px;border-radius: 12px;font-size: 12px;margin: 2px 4px 2px 0px;font-weight: normal;background: #FFF3E0;color: #E65100;&quot; class=&quot;js_darkmode__55&quot;&gt;实时通信&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;display: inline-block;padding: 2px 10px;border-radius: 12px;font-size: 12px;margin: 2px 4px 2px 0px;font-weight: normal;background: #FFEBEE;color: #C62828;&quot; class=&quot;js_darkmode__56&quot;&gt;MQTT物联&lt;/span&gt;&lt;/p&gt;&lt;ul style=&quot;margin: 12px 0px;padding-left: 28px;color: rgb(51, 51, 51);font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Roboto, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, sans-serif;font-size: 16px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;&quot; class=&quot;js_darkmode__57 list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;多数据库支持&lt;/strong&gt;&lt;/p&gt;&lt;section&gt;&amp;nbsp;— SQLite、MySQL、MariaDB、PostgreSQL、SQL Server、Oracle、Firebird、MongoDB，&lt;strong&gt;8 种数据库&lt;/strong&gt;一个框架全覆盖&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;多种缓存机制&lt;/strong&gt;&lt;/p&gt;&lt;section&gt;&amp;nbsp;— MemoryCache、Dictionary、Redis 三种方案灵活切换&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;代码生成器&lt;/strong&gt;&lt;/p&gt;&lt;section&gt;&amp;nbsp;— 自动生成实体、DAO、DTO/VO，支持自定义模板，彻底告别手写 CRUD&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;工作流引擎&lt;/strong&gt;&lt;/p&gt;&lt;section&gt;&amp;nbsp;— 可视化流程设计、节点配置、表单绑定、在线审批，开箱即用&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;动态 API&lt;/strong&gt;&lt;/p&gt;&lt;section&gt;&amp;nbsp;— 自动注册服务为 Web API，&lt;strong&gt;无需手动编写 Controller&lt;/strong&gt;，大幅减少样板代码&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;API 文档&lt;/strong&gt;&lt;/p&gt;&lt;section&gt;&amp;nbsp;— Scalar + Swagger UI 双引擎生成，支持自定义注释&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;定时任务&lt;/strong&gt;&lt;/p&gt;&lt;section&gt;&amp;nbsp;— Quartz.NET 集成，支持动态任务增删改查&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;实时通信&lt;/strong&gt;&lt;/p&gt;&lt;section&gt;&amp;nbsp;— SignalR WebSocket 实时推送与在线聊天&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;设备物联&lt;/strong&gt;&lt;/p&gt;&lt;section&gt;&amp;nbsp;— MQTT 协议支持，内置 Broker，直连物联网设备&lt;/section&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3 style=&quot;font-size: 17px;font-weight: bold;color: rgb(51, 51, 51);margin: 28px 0px 12px;padding-left: 12px;border-left: 4px solid rgb(102, 126, 234);line-height: 1.5;font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Roboto, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, sans-serif;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;&quot; class=&quot;js_darkmode__58&quot;&gt;💼 业务能力&lt;/h3&gt;&lt;table class=&quot;js_darkmode__59&quot; width=&quot;400&quot;&gt;&lt;tbody&gt;&lt;tr class=&quot;firstRow&quot;&gt;&lt;th style=&quot;background: rgb(102, 126, 234);color: rgb(255, 255, 255);padding: 10px 12px;text-align: left;font-weight: bold;font-size: 13px;&quot;&gt;&lt;section&gt;能力&lt;/section&gt;&lt;/th&gt;&lt;th style=&quot;background: rgb(102, 126, 234);color: rgb(255, 255, 255);padding: 10px 12px;text-align: left;font-weight: bold;font-size: 13px;&quot;&gt;&lt;section&gt;说明&lt;/section&gt;&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;background: rgb(249, 249, 249);&quot; class=&quot;js_darkmode__60&quot;&gt;&lt;strong&gt;MQTT 通信&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;background: rgb(249, 249, 249);&quot; class=&quot;js_darkmode__61&quot;&gt;&lt;section&gt;轻量级物联网通信协议，支持内置 Broker&lt;/section&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;&quot; class=&quot;js_darkmode__62&quot;&gt;&lt;strong&gt;RabbitMQ&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;&quot; class=&quot;js_darkmode__63&quot;&gt;&lt;section&gt;消息队列，发布者/消费者模式集成&lt;/section&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;background: rgb(249, 249, 249);&quot; class=&quot;js_darkmode__64&quot;&gt;&lt;strong&gt;AI 大模型&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;background: rgb(249, 249, 249);&quot; class=&quot;js_darkmode__65&quot;&gt;&lt;section&gt;集成 7+ 主流大语言模型&lt;/section&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;&quot; class=&quot;js_darkmode__66&quot;&gt;&lt;strong&gt;图像处理&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;&quot; class=&quot;js_darkmode__67&quot;&gt;&lt;section&gt;条码生成识别、图片水印、图形验证码、头像裁剪&lt;/section&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;background: rgb(249, 249, 249);&quot; class=&quot;js_darkmode__68&quot;&gt;&lt;strong&gt;数据可视化&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;background: rgb(249, 249, 249);&quot; class=&quot;js_darkmode__69&quot;&gt;&lt;section&gt;ECharts 图表集成，Dashboard 看板布局&lt;/section&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;&quot; class=&quot;js_darkmode__70&quot;&gt;&lt;strong&gt;文件管理&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;&quot; class=&quot;js_darkmode__71&quot;&gt;&lt;section&gt;文件上传、导入导出、在线预览&lt;/section&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;background: rgb(249, 249, 249);&quot; class=&quot;js_darkmode__72&quot;&gt;&lt;strong&gt;ID 生成器&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;background: rgb(249, 249, 249);&quot; class=&quot;js_darkmode__73&quot;&gt;&lt;section&gt;雪花 ID、序列 ID、格式 ID 等多种方式&lt;/section&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;&quot; class=&quot;js_darkmode__74&quot;&gt;&lt;strong&gt;插件扩展&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;&quot; class=&quot;js_darkmode__75&quot;&gt;&lt;section&gt;Plugin/Addon 动态加载机制&lt;/section&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h3 style=&quot;font-size: 17px;font-weight: bold;color: rgb(51, 51, 51);margin: 28px 0px 12px;padding-left: 12px;border-left: 4px solid rgb(102, 126, 234);line-height: 1.5;font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Roboto, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, sans-serif;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;&quot; class=&quot;js_darkmode__76&quot;&gt;🌐 平台兼容&lt;/h3&gt;&lt;ul style=&quot;margin: 12px 0px;padding-left: 28px;color: rgb(51, 51, 51);font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Roboto, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, sans-serif;font-size: 16px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;&quot; class=&quot;js_darkmode__77 list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;跨平台运行&lt;/strong&gt;&lt;/p&gt;&lt;section&gt;&amp;nbsp;— Windows、macOS、Linux、&lt;span class=&quot;&quot;&gt;HarmonyOS&lt;/span&gt; 全覆盖&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;响应式布局&lt;/strong&gt;&lt;/p&gt;&lt;section&gt;&amp;nbsp;— 电脑、平板、手机多种终端自适应&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;span class=&quot;&quot;&gt;多租户架构&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;section&gt;&amp;nbsp;— 可扩展为多租户、多组织架构应用&lt;/section&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2 style=&quot;font-size: 20px;font-weight: bold;color: rgb(255, 255, 255);background: linear-gradient(135deg, rgb(102, 126, 234) 0%, rgb(118, 75, 162) 100%) rgb(255, 255, 255);padding: 12px 20px;margin: 40px 0px 20px;border-radius: 6px;line-height: 1.4;font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Roboto, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, sans-serif;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;&quot; class=&quot;js_darkmode__bg__3&quot;&gt;04 技术栈深度解析&lt;/h2&gt;&lt;h3 style=&quot;font-size: 17px;font-weight: bold;color: rgb(51, 51, 51);margin: 28px 0px 12px;padding-left: 12px;border-left: 4px solid rgb(102, 126, 234);line-height: 1.5;font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Roboto, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, sans-serif;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;&quot; class=&quot;js_darkmode__78&quot;&gt;后端核心依赖&lt;/h3&gt;&lt;p style=&quot;margin: 16px 0px;color: rgb(51, 51, 51);line-height: 1.9;font-size: 15px;font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Roboto, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, sans-serif;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;&quot; class=&quot;js_darkmode__79&quot;&gt;Scm.Net 后端基于&amp;nbsp;&lt;strong&gt;.NET 10.0&lt;/strong&gt;，兼容 .NET 6/7/8/9/10 多个版本。以下是核心依赖一览：&lt;/p&gt;&lt;table class=&quot;js_darkmode__80&quot; width=&quot;400&quot;&gt;&lt;tbody&gt;&lt;tr class=&quot;firstRow&quot;&gt;&lt;th style=&quot;background: rgb(102, 126, 234);color: rgb(255, 255, 255);padding: 10px 12px;text-align: left;font-weight: bold;font-size: 13px;&quot;&gt;&lt;section&gt;技术&lt;/section&gt;&lt;/th&gt;&lt;th style=&quot;background: rgb(102, 126, 234);color: rgb(255, 255, 255);padding: 10px 12px;text-align: left;font-weight: bold;font-size: 13px;&quot;&gt;&lt;section&gt;版本&lt;/section&gt;&lt;/th&gt;&lt;th style=&quot;background: rgb(102, 126, 234);color: rgb(255, 255, 255);padding: 10px 12px;text-align: left;font-weight: bold;font-size: 13px;&quot;&gt;&lt;section&gt;用途&lt;/section&gt;&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;background: rgb(249, 249, 249);&quot; class=&quot;js_darkmode__81&quot;&gt;&lt;strong&gt;.NET&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;background: rgb(249, 249, 249);&quot; class=&quot;js_darkmode__82&quot;&gt;&lt;section&gt;10.0&lt;/section&gt;&lt;/td&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;background: rgb(249, 249, 249);&quot; class=&quot;js_darkmode__83&quot;&gt;&lt;section&gt;跨平台运行时&lt;/section&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;&quot; class=&quot;js_darkmode__84&quot;&gt;&lt;strong&gt;SqlSugarCore&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;&quot; class=&quot;js_darkmode__85&quot;&gt;&lt;section&gt;-&lt;/section&gt;&lt;/td&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;&quot; class=&quot;js_darkmode__86&quot;&gt;&lt;section&gt;ORM 数据访问框架&lt;/section&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;background: rgb(249, 249, 249);&quot; class=&quot;js_darkmode__87&quot;&gt;&lt;strong&gt;ImageSharp&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;background: rgb(249, 249, 249);&quot; class=&quot;js_darkmode__88&quot;&gt;&lt;section&gt;^3.1.12&lt;/section&gt;&lt;/td&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;background: rgb(249, 249, 249);&quot; class=&quot;js_darkmode__89&quot;&gt;&lt;section&gt;跨平台图像处理&lt;/section&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;&quot; class=&quot;js_darkmode__90&quot;&gt;&lt;strong&gt;MQTTnet&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;&quot; class=&quot;js_darkmode__91&quot;&gt;&lt;section&gt;-&lt;/section&gt;&lt;/td&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;&quot; class=&quot;js_darkmode__92&quot;&gt;&lt;section&gt;MQTT 通讯（客户端 + Broker）&lt;/section&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;background: rgb(249, 249, 249);&quot; class=&quot;js_darkmode__93&quot;&gt;&lt;strong&gt;RabbitMQ.Client&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;background: rgb(249, 249, 249);&quot; class=&quot;js_darkmode__94&quot;&gt;&lt;section&gt;-&lt;/section&gt;&lt;/td&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;background: rgb(249, 249, 249);&quot; class=&quot;js_darkmode__95&quot;&gt;&lt;section&gt;消息队列&lt;/section&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;&quot; class=&quot;js_darkmode__96&quot;&gt;&lt;strong&gt;Quartz.NET&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;&quot; class=&quot;js_darkmode__97&quot;&gt;&lt;section&gt;-&lt;/section&gt;&lt;/td&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;&quot; class=&quot;js_darkmode__98&quot;&gt;&lt;section&gt;定时任务调度&lt;/section&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;background: rgb(249, 249, 249);&quot; class=&quot;js_darkmode__99&quot;&gt;&lt;strong&gt;SignalR&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;background: rgb(249, 249, 249);&quot; class=&quot;js_darkmode__100&quot;&gt;&lt;section&gt;-&lt;/section&gt;&lt;/td&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;background: rgb(249, 249, 249);&quot; class=&quot;js_darkmode__101&quot;&gt;&lt;section&gt;实时 Web 通信&lt;/section&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;&quot; class=&quot;js_darkmode__102&quot;&gt;&lt;strong&gt;Mapster&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;&quot; class=&quot;js_darkmode__103&quot;&gt;&lt;section&gt;10.0.7&lt;/section&gt;&lt;/td&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;&quot; class=&quot;js_darkmode__104&quot;&gt;&lt;section&gt;对象映射（比 AutoMapper 更快）&lt;/section&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;background: rgb(249, 249, 249);&quot; class=&quot;js_darkmode__105&quot;&gt;&lt;strong&gt;Serilog&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;background: rgb(249, 249, 249);&quot; class=&quot;js_darkmode__106&quot;&gt;&lt;section&gt;4.3.1&lt;/section&gt;&lt;/td&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;background: rgb(249, 249, 249);&quot; class=&quot;js_darkmode__107&quot;&gt;&lt;section&gt;结构化日志&lt;/section&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;&quot; class=&quot;js_darkmode__108&quot;&gt;&lt;strong&gt;Newtonsoft.Json&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;&quot; class=&quot;js_darkmode__109&quot;&gt;&lt;section&gt;-&lt;/section&gt;&lt;/td&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;&quot; class=&quot;js_darkmode__110&quot;&gt;&lt;section&gt;JSON 序列化&lt;/section&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;background: rgb(249, 249, 249);&quot; class=&quot;js_darkmode__111&quot;&gt;&lt;strong&gt;JWT Bearer&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;background: rgb(249, 249, 249);&quot; class=&quot;js_darkmode__112&quot;&gt;&lt;section&gt;10.0.8&lt;/section&gt;&lt;/td&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;background: rgb(249, 249, 249);&quot; class=&quot;js_darkmode__113&quot;&gt;&lt;section&gt;认证授权&lt;/section&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;&quot; class=&quot;js_darkmode__114&quot;&gt;&lt;strong&gt;Scalar&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;&quot; class=&quot;js_darkmode__115&quot;&gt;&lt;section&gt;2.16.6&lt;/section&gt;&lt;/td&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;&quot; class=&quot;js_darkmode__116&quot;&gt;&lt;section&gt;API 文档可视化（新）&lt;/section&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;background: rgb(249, 249, 249);&quot; class=&quot;js_darkmode__117&quot;&gt;&lt;strong&gt;Swagger UI&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;background: rgb(249, 249, 249);&quot; class=&quot;js_darkmode__118&quot;&gt;&lt;section&gt;10.2.3&lt;/section&gt;&lt;/td&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;background: rgb(249, 249, 249);&quot; class=&quot;js_darkmode__119&quot;&gt;&lt;section&gt;API 文档可视化&lt;/section&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;💡 技术选型亮点&lt;/p&gt;&lt;p style=&quot;margin: 16px 0px;color: rgb(51, 51, 51);line-height: 1.9;font-size: 15px;&quot; class=&quot;js_darkmode__120&quot;&gt;ORM 选用&amp;nbsp;&lt;strong&gt;&lt;span class=&quot;&quot;&gt;SqlSugar&lt;/span&gt;&lt;/strong&gt;&amp;nbsp;而非 Entity Framework Core，是因为 SqlSugar 对多数据库支持更友好，且 API 更简洁。对象映射选用&amp;nbsp;&lt;strong&gt;Mapster&lt;/strong&gt;&amp;nbsp;而非 AutoMapper，性能高出数倍。API 文档同时集成&amp;nbsp;&lt;strong&gt;Scalar&lt;/strong&gt;&amp;nbsp;和&amp;nbsp;&lt;strong&gt;Swagger&lt;/strong&gt;，给开发者更多选择。&lt;/p&gt;&lt;h3 style=&quot;font-size: 17px;font-weight: bold;color: rgb(51, 51, 51);margin: 28px 0px 12px;padding-left: 12px;border-left: 4px solid rgb(102, 126, 234);line-height: 1.5;font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Roboto, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, sans-serif;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;&quot; class=&quot;js_darkmode__121&quot;&gt;前端技术栈（Scm.Vue）&lt;/h3&gt;&lt;p style=&quot;margin: 16px 0px;color: rgb(51, 51, 51);line-height: 1.9;font-size: 15px;font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Roboto, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, sans-serif;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;&quot; class=&quot;js_darkmode__122&quot;&gt;前端独立仓库&amp;nbsp;&lt;code style=&quot;font-family: &amp;quot;Fira Code&amp;quot;, Consolas, Monaco, monospace;background: rgb(240, 240, 240);color: rgb(198, 40, 40);padding: 2px 6px;border-radius: 3px;font-size: 13px;&quot; class=&quot;js_darkmode__123&quot;&gt;Scm.Vue&lt;/code&gt;，基于&amp;nbsp;&lt;strong&gt;Vue 3 + Vite 8 + Element Plus&lt;/strong&gt;&amp;nbsp;构建：&lt;/p&gt;&lt;table class=&quot;js_darkmode__124&quot; width=&quot;400&quot;&gt;&lt;tbody&gt;&lt;tr class=&quot;firstRow&quot;&gt;&lt;th style=&quot;background: rgb(102, 126, 234);color: rgb(255, 255, 255);padding: 10px 12px;text-align: left;font-weight: bold;font-size: 13px;&quot;&gt;&lt;section&gt;技术&lt;/section&gt;&lt;/th&gt;&lt;th style=&quot;background: rgb(102, 126, 234);color: rgb(255, 255, 255);padding: 10px 12px;text-align: left;font-weight: bold;font-size: 13px;&quot;&gt;&lt;section&gt;版本&lt;/section&gt;&lt;/th&gt;&lt;th style=&quot;background: rgb(102, 126, 234);color: rgb(255, 255, 255);padding: 10px 12px;text-align: left;font-weight: bold;font-size: 13px;&quot;&gt;&lt;section&gt;用途&lt;/section&gt;&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;background: rgb(249, 249, 249);&quot; class=&quot;js_darkmode__125&quot;&gt;&lt;strong&gt;Vue&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;background: rgb(249, 249, 249);&quot; class=&quot;js_darkmode__126&quot;&gt;&lt;section&gt;^3.5.32&lt;/section&gt;&lt;/td&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;background: rgb(249, 249, 249);&quot; class=&quot;js_darkmode__127&quot;&gt;&lt;section&gt;渐进式 JS 框架&lt;/section&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;&quot; class=&quot;js_darkmode__128&quot;&gt;&lt;strong&gt;Vite&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;&quot; class=&quot;js_darkmode__129&quot;&gt;&lt;section&gt;^8.0.3&lt;/section&gt;&lt;/td&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;&quot; class=&quot;js_darkmode__130&quot;&gt;&lt;section&gt;构建工具（Rolldown 打包）&lt;/section&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;background: rgb(249, 249, 249);&quot; class=&quot;js_darkmode__131&quot;&gt;&lt;strong&gt;Element Plus&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;background: rgb(249, 249, 249);&quot; class=&quot;js_darkmode__132&quot;&gt;&lt;section&gt;^2.13.6&lt;/section&gt;&lt;/td&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;background: rgb(249, 249, 249);&quot; class=&quot;js_darkmode__133&quot;&gt;&lt;section&gt;Vue 3 桌面端组件库&lt;/section&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;&quot; class=&quot;js_darkmode__134&quot;&gt;&lt;strong&gt;Pinia&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;&quot; class=&quot;js_darkmode__135&quot;&gt;&lt;section&gt;^3.0.0&lt;/section&gt;&lt;/td&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;&quot; class=&quot;js_darkmode__136&quot;&gt;&lt;section&gt;状态管理&lt;/section&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;background: rgb(249, 249, 249);&quot; class=&quot;js_darkmode__137&quot;&gt;&lt;strong&gt;ECharts&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;background: rgb(249, 249, 249);&quot; class=&quot;js_darkmode__138&quot;&gt;&lt;section&gt;^6.0.0&lt;/section&gt;&lt;/td&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;background: rgb(249, 249, 249);&quot; class=&quot;js_darkmode__139&quot;&gt;&lt;section&gt;数据可视化&lt;/section&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;&quot; class=&quot;js_darkmode__140&quot;&gt;&lt;strong&gt;Axios&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;&quot; class=&quot;js_darkmode__141&quot;&gt;&lt;section&gt;^1.7.0&lt;/section&gt;&lt;/td&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;&quot; class=&quot;js_darkmode__142&quot;&gt;&lt;section&gt;HTTP 客户端&lt;/section&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;background: rgb(249, 249, 249);&quot; class=&quot;js_darkmode__143&quot;&gt;&lt;strong&gt;SignalR&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;background: rgb(249, 249, 249);&quot; class=&quot;js_darkmode__144&quot;&gt;&lt;section&gt;^10.0.0&lt;/section&gt;&lt;/td&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;background: rgb(249, 249, 249);&quot; class=&quot;js_darkmode__145&quot;&gt;&lt;section&gt;实时通信客户端&lt;/section&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;&quot; class=&quot;js_darkmode__146&quot;&gt;&lt;strong&gt;Vue I18n&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;&quot; class=&quot;js_darkmode__147&quot;&gt;&lt;section&gt;^11.0.0&lt;/section&gt;&lt;/td&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;&quot; class=&quot;js_darkmode__148&quot;&gt;&lt;section&gt;国际化&lt;/section&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p style=&quot;margin: 16px 0px;color: rgb(51, 51, 51);line-height: 1.9;font-size: 15px;font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Roboto, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, sans-serif;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;&quot; class=&quot;js_darkmode__149&quot;&gt;前端还内置了&amp;nbsp;&lt;strong&gt;40+ 业务组件&lt;/strong&gt;（scTable、scSearch、scUpload、scDynamicForm 等），支持&amp;nbsp;&lt;strong&gt;三种界面模式&lt;/strong&gt;：&lt;/p&gt;&lt;ul style=&quot;margin: 12px 0px;padding-left: 28px;color: rgb(51, 51, 51);font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Roboto, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, sans-serif;font-size: 16px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;&quot; class=&quot;js_darkmode__150 list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;工作台模式&lt;/strong&gt;&lt;/p&gt;&lt;section&gt;（Console）— 支持default/header/menu/dock四种风格&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;云桌面模式&lt;/strong&gt;&lt;/p&gt;&lt;section&gt;（Desktop）— 类 Windows 桌面体验&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;大屏模式&lt;/strong&gt;&lt;/p&gt;&lt;section&gt;（Monitor）— 数据可视化大屏展示&lt;/section&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2 style=&quot;font-size: 20px;font-weight: bold;color: rgb(255, 255, 255);background: linear-gradient(135deg, rgb(102, 126, 234) 0%, rgb(118, 75, 162) 100%) rgb(255, 255, 255);padding: 12px 20px;margin: 40px 0px 20px;border-radius: 6px;line-height: 1.4;font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Roboto, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, sans-serif;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;&quot; class=&quot;js_darkmode__bg__4&quot;&gt;05 架构设计与项目结构&lt;/h2&gt;&lt;p style=&quot;margin: 16px 0px;color: rgb(51, 51, 51);line-height: 1.9;font-size: 15px;font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Roboto, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, sans-serif;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;&quot; class=&quot;js_darkmode__151&quot;&gt;Scm.Net 采用了清晰的分层架构，各模块职责明确：&lt;/p&gt;&lt;pre style=&quot;background: rgb(30, 30, 30);color: rgb(212, 212, 212);padding: 20px;border-radius: 8px;overflow-x: auto;margin: 16px 0px;font-size: 13px;line-height: 1.6;font-family: &amp;quot;Fira Code&amp;quot;, Consolas, Monaco, monospace;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;&quot; class=&quot;js_darkmode__152&quot;&gt;&lt;code style=&quot;font-family: &amp;quot;Fira Code&amp;quot;, Consolas, Monaco, monospace;&quot;&gt;Scm.Net/&lt;br/&gt;├── Scm.Net/ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; # Web API 主入口&lt;br/&gt;│ &amp;nbsp; ├── Controllers/ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; # &amp;nbsp; API 控制器&lt;br/&gt;│ &amp;nbsp; ├── Resources/ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; # &amp;nbsp; 资源文件&lt;br/&gt;│ &amp;nbsp; ├── data/ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;# &amp;nbsp; 数据文件（SQLite、上传文件）&lt;br/&gt;│ &amp;nbsp; ├── Program.cs &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; # &amp;nbsp; 应用入口与启动配置&lt;br/&gt;│ &amp;nbsp; └── appsettings.json &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; # &amp;nbsp; 应用配置&lt;br/&gt;├── Scm.Core/ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;# 核心业务逻辑层&lt;br/&gt;├── Scm.Dao/ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; # 数据访问层（DAO）&lt;br/&gt;├── Scm.Dto/ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; # 数据传输对象层（DTO）&lt;br/&gt;├── Scm.Common/ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;# 公共枚举、工具类&lt;br/&gt;├── Scm.Common.Dto/ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;# 公共 DTO 定义&lt;br/&gt;├── Scm.Common.Excel/ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;# Excel 导入导出&lt;br/&gt;├── Scm.Common.Log/ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;# 日志记录&lt;br/&gt;├── Scm.Common.Os/ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; # 操作系统工具&lt;br/&gt;├── Scm.Dsa.Dba.Sugar/ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; # SqlSugar 仓储基类&lt;br/&gt;├── Scm.Dsa.Dfa.Json/ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;# JSON 数据格式转换&lt;br/&gt;├── Scm.Server/ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;# 服务端核心（接口+基础服务）&lt;br/&gt;├── Scm.Server.Api/ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;# 动态 API 注册&lt;br/&gt;├── Scm.Server.Bearer/ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; # JWT Bearer 认证&lt;br/&gt;├── Scm.Server.Cache/ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;# 缓存扩展&lt;br/&gt;├── Scm.Server.Dao/ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;# 服务端 DAO 扩展&lt;br/&gt;├── Scm.Server.Dvo/ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;# DTO/VO 映射&lt;br/&gt;├── Scm.Server.MQTT/ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; # MQTT 通讯&lt;br/&gt;├── Scm.Server.RabbitMQ/ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; # RabbitMQ 集成&lt;br/&gt;├── Scm.Server.SignalR/ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;# SignalR 实时通讯&lt;br/&gt;├── Scm.Server.Quartz/ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; # Quartz 定时任务&lt;br/&gt;├── Scm.Server.Swagger/ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;# Swagger 文档&lt;br/&gt;├── Scm.Server.Scalar/ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; # Scalar 文档&lt;br/&gt;├── Scm.Server.Aiml/ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; # AI 大模型集成&lt;br/&gt;├── Scm.Server.Service/ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;# 业务服务扩展&lt;br/&gt;├── Scm.Email/ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; # 邮件服务&lt;br/&gt;├── Scm.Phone/ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; # 短信服务&lt;br/&gt;├── Scm.Generator/ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; # 代码生成器&lt;br/&gt;├── Samples.*/ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; # 示例项目&lt;br/&gt;├── Libs/ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;# 预编译库&lt;br/&gt;├── Test/ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;# 测试项目&lt;br/&gt;└── Scm.Net.sln &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;# 解决方案文件&lt;/code&gt;&lt;/pre&gt;&lt;p style=&quot;margin: 16px 0px;color: rgb(51, 51, 51);line-height: 1.9;font-size: 15px;font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Roboto, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, sans-serif;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;&quot; class=&quot;js_darkmode__153&quot;&gt;架构设计上有几个值得关注的点：&lt;/p&gt;&lt;h3 style=&quot;font-size: 17px;font-weight: bold;color: rgb(51, 51, 51);margin: 28px 0px 12px;padding-left: 12px;border-left: 4px solid rgb(102, 126, 234);line-height: 1.5;font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Roboto, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, sans-serif;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;&quot; class=&quot;js_darkmode__154&quot;&gt;模块化拆分策略&lt;/h3&gt;&lt;p style=&quot;margin: 16px 0px;color: rgb(51, 51, 51);line-height: 1.9;font-size: 15px;font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Roboto, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, sans-serif;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;&quot; class=&quot;js_darkmode__155&quot;&gt;注意看项目命名规律：&lt;code style=&quot;font-family: &amp;quot;Fira Code&amp;quot;, Consolas, Monaco, monospace;background: rgb(240, 240, 240);color: rgb(198, 40, 40);padding: 2px 6px;border-radius: 3px;font-size: 13px;&quot; class=&quot;js_darkmode__156&quot;&gt;Scm.Server.*&lt;/code&gt;&amp;nbsp;是服务端扩展模块，每个模块负责一个独立能力（MQTT、RabbitMQ、SignalR、Quartz、Swagger、Scalar、AI等）。这种设计让你可以&lt;strong&gt;按需引用&lt;/strong&gt;——如果你的项目不需要 MQTT，就不引用&amp;nbsp;&lt;code style=&quot;font-family: &amp;quot;Fira Code&amp;quot;, Consolas, Monaco, monospace;background: rgb(240, 240, 240);color: rgb(198, 40, 40);padding: 2px 6px;border-radius: 3px;font-size: 13px;&quot; class=&quot;js_darkmode__157&quot;&gt;Scm.Server.MQTT&lt;/code&gt;，保持项目轻量。&lt;/p&gt;&lt;h3 style=&quot;font-size: 17px;font-weight: bold;color: rgb(51, 51, 51);margin: 28px 0px 12px;padding-left: 12px;border-left: 4px solid rgb(102, 126, 234);line-height: 1.5;font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Roboto, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, sans-serif;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;&quot; class=&quot;js_darkmode__158&quot;&gt;动态 API 机制&lt;/h3&gt;&lt;p style=&quot;margin: 16px 0px;color: rgb(51, 51, 51);line-height: 1.9;font-size: 15px;font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Roboto, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, sans-serif;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;&quot; class=&quot;js_darkmode__159&quot;&gt;&lt;code style=&quot;font-family: &amp;quot;Fira Code&amp;quot;, Consolas, Monaco, monospace;background: rgb(240, 240, 240);color: rgb(198, 40, 40);padding: 2px 6px;border-radius: 3px;font-size: 13px;&quot; class=&quot;js_darkmode__160&quot;&gt;Scm.Server.Api&lt;/code&gt;&amp;nbsp;实现了动态 Web API 注册——你只需要写 Service，框架自动将其注册为 Web API，&lt;strong&gt;无需手写 Controller&lt;/strong&gt;。这借鉴了&amp;nbsp;&lt;code style=&quot;font-family: &amp;quot;Fira Code&amp;quot;, Consolas, Monaco, monospace;background: rgb(240, 240, 240);color: rgb(198, 40, 40);padding: 2px 6px;border-radius: 3px;font-size: 13px;&quot; class=&quot;js_darkmode__161&quot;&gt;Panda.DynamicWebApi&lt;/code&gt;&amp;nbsp;的思路，大幅减少样板代码。&lt;/p&gt;&lt;h3 style=&quot;font-size: 17px;font-weight: bold;color: rgb(51, 51, 51);margin: 28px 0px 12px;padding-left: 12px;border-left: 4px solid rgb(102, 126, 234);line-height: 1.5;font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Roboto, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, sans-serif;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;&quot; class=&quot;js_darkmode__162&quot;&gt;三层分离&lt;/h3&gt;&lt;ul style=&quot;margin: 12px 0px;padding-left: 28px;color: rgb(51, 51, 51);font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Roboto, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, sans-serif;font-size: 16px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;&quot; class=&quot;js_darkmode__163 list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Scm.Dao&lt;/strong&gt;&lt;/p&gt;&lt;section&gt;&amp;nbsp;— 数据访问层，封装数据库操作&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Scm.Dto&lt;/strong&gt;&lt;/p&gt;&lt;section&gt;&amp;nbsp;— 数据传输对象，接口&lt;span class=&quot;&quot;&gt;数据契约&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Scm.Core&lt;/strong&gt;&lt;/p&gt;&lt;section&gt;&amp;nbsp;— 核心业务逻辑，真正的业务代码&lt;/section&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2 style=&quot;font-size: 20px;font-weight: bold;color: rgb(255, 255, 255);background: linear-gradient(135deg, rgb(102, 126, 234) 0%, rgb(118, 75, 162) 100%) rgb(255, 255, 255);padding: 12px 20px;margin: 40px 0px 20px;border-radius: 6px;line-height: 1.4;font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Roboto, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, sans-serif;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;&quot; class=&quot;js_darkmode__bg__5&quot;&gt;06 四大设计原则&lt;/h2&gt;&lt;p style=&quot;margin: 16px 0px;color: rgb(51, 51, 51);line-height: 1.9;font-size: 15px;font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Roboto, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, sans-serif;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;&quot; class=&quot;js_darkmode__164&quot;&gt;好的框架背后一定有清晰的设计哲学。Scm.Net 有四条核心设计原则，值得每个使用者理解：&lt;/p&gt;&lt;p&gt;原则一：数据库仅用于存储数据&lt;/p&gt;&lt;p&gt;除 CRUD 外不使用任何依赖特定数据库的特性（如存储过程、触发器、视图等），可平滑迁移到任何支持标准 SQL 的数据引擎。这意味着你今天用 SQLite 开发，明天切到 Oracle，几乎零成本。&lt;/p&gt;&lt;p&gt;原则二：单表操作为主&lt;/p&gt;&lt;p&gt;原则上仅允许单表操作（最多不超过两张表），通过数据冗余设计提升查询效率。这看似&amp;quot;反范式&amp;quot;，实则是&lt;strong&gt;用空间换时间&lt;/strong&gt;——在高并发场景下，避免 JOIN 带来的性能问题。&lt;/p&gt;&lt;p&gt;原则三：JSON 数据交互&lt;/p&gt;&lt;p&gt;多端数据交互基于 JSON 格式，保证低噪音的同时提升可扩展性。新字段加上去不需要改接口签名，前后端解耦更彻底。&lt;/p&gt;&lt;p&gt;原则四：蛇形命名 DTO&lt;/p&gt;&lt;p&gt;DTO 统一使用 snake_case 命名，适配多场景异构应用需求。Python、Java、Go 等语言默认蛇形命名，这样可以&lt;strong&gt;无缝对接&lt;/strong&gt;多语言生态。&lt;/p&gt;&lt;h2 style=&quot;font-size: 20px;font-weight: bold;color: rgb(255, 255, 255);background: linear-gradient(135deg, rgb(102, 126, 234) 0%, rgb(118, 75, 162) 100%) rgb(255, 255, 255);padding: 12px 20px;margin: 40px 0px 20px;border-radius: 6px;line-height: 1.4;font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Roboto, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, sans-serif;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;&quot; class=&quot;js_darkmode__bg__6&quot;&gt;07 五分钟快速启动&lt;/h2&gt;&lt;h3 style=&quot;font-size: 17px;font-weight: bold;color: rgb(51, 51, 51);margin: 28px 0px 12px;padding-left: 12px;border-left: 4px solid rgb(102, 126, 234);line-height: 1.5;font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Roboto, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, sans-serif;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;&quot; class=&quot;js_darkmode__165&quot;&gt;Step 1：获取代码&lt;/h3&gt;&lt;pre style=&quot;background: rgb(30, 30, 30);color: rgb(212, 212, 212);padding: 20px;border-radius: 8px;overflow-x: auto;margin: 16px 0px;font-size: 13px;line-height: 1.6;font-family: &amp;quot;Fira Code&amp;quot;, Consolas, Monaco, monospace;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;&quot; class=&quot;js_darkmode__166&quot;&gt;&lt;code style=&quot;font-family: &amp;quot;Fira Code&amp;quot;, Consolas, Monaco, monospace;&quot;&gt;# 克隆后端&lt;br/&gt;git clone https://gitee.com/leadiot/scm.net.git&lt;br/&gt;&lt;br/&gt;# 克隆前端&lt;br/&gt;git clone https://gitee.com/leadiot/scm.vue.git&lt;/code&gt;&lt;/pre&gt;&lt;h3 style=&quot;font-size: 17px;font-weight: bold;color: rgb(51, 51, 51);margin: 28px 0px 12px;padding-left: 12px;border-left: 4px solid rgb(102, 126, 234);line-height: 1.5;font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Roboto, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, sans-serif;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;&quot; class=&quot;js_darkmode__167&quot;&gt;Step 2：配置数据库&lt;/h3&gt;&lt;p style=&quot;margin: 16px 0px;color: rgb(51, 51, 51);line-height: 1.9;font-size: 15px;font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Roboto, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, sans-serif;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;&quot; class=&quot;js_darkmode__168&quot;&gt;编辑&amp;nbsp;&lt;code style=&quot;font-family: &amp;quot;Fira Code&amp;quot;, Consolas, Monaco, monospace;background: rgb(240, 240, 240);color: rgb(198, 40, 40);padding: 2px 6px;border-radius: 3px;font-size: 13px;&quot; class=&quot;js_darkmode__169&quot;&gt;Scm.Net/appsettings.json&lt;/code&gt;，修改数据库连接串：&lt;/p&gt;&lt;pre style=&quot;background: rgb(30, 30, 30);color: rgb(212, 212, 212);padding: 20px;border-radius: 8px;overflow-x: auto;margin: 16px 0px;font-size: 13px;line-height: 1.6;font-family: &amp;quot;Fira Code&amp;quot;, Consolas, Monaco, monospace;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;&quot; class=&quot;js_darkmode__170&quot;&gt;&lt;code style=&quot;font-family: &amp;quot;Fira Code&amp;quot;, Consolas, Monaco, monospace;&quot;&gt;{&lt;br/&gt;&amp;nbsp; &amp;quot;Sql&amp;quot;: {&lt;br/&gt;&amp;nbsp; &amp;nbsp; &amp;quot;Type&amp;quot;: &amp;quot;Sqlite&amp;quot;,&lt;br/&gt;&amp;nbsp; &amp;nbsp; &amp;quot;Text&amp;quot;: &amp;quot;Data Source=data/scm.db;&amp;quot;&lt;br/&gt;&amp;nbsp; }&lt;br/&gt;}&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;💡 零配置启动&lt;/p&gt;&lt;p style=&quot;margin: 16px 0px;color: rgb(51, 51, 51);line-height: 1.9;font-size: 15px;&quot; class=&quot;js_darkmode__171&quot;&gt;默认使用 SQLite，系统启动时自动初始化数据库和种子数据，&lt;strong&gt;无需手动建表&lt;/strong&gt;。开箱即用，拉下来就能跑。&lt;/p&gt;&lt;h3 style=&quot;font-size: 17px;font-weight: bold;color: rgb(51, 51, 51);margin: 28px 0px 12px;padding-left: 12px;border-left: 4px solid rgb(102, 126, 234);line-height: 1.5;font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Roboto, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, sans-serif;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;&quot; class=&quot;js_darkmode__172&quot;&gt;Step 3：启动后端&lt;/h3&gt;&lt;pre style=&quot;background: rgb(30, 30, 30);color: rgb(212, 212, 212);padding: 20px;border-radius: 8px;overflow-x: auto;margin: 16px 0px;font-size: 13px;line-height: 1.6;font-family: &amp;quot;Fira Code&amp;quot;, Consolas, Monaco, monospace;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;&quot; class=&quot;js_darkmode__173&quot;&gt;&lt;code style=&quot;font-family: &amp;quot;Fira Code&amp;quot;, Consolas, Monaco, monospace;&quot;&gt;cd Scm.Net&lt;br/&gt;dotnet run&lt;/code&gt;&lt;/pre&gt;&lt;p style=&quot;margin: 16px 0px;color: rgb(51, 51, 51);line-height: 1.9;font-size: 15px;font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Roboto, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, sans-serif;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;&quot; class=&quot;js_darkmode__174&quot;&gt;访问&amp;nbsp;&lt;code style=&quot;font-family: &amp;quot;Fira Code&amp;quot;, Consolas, Monaco, monospace;background: rgb(240, 240, 240);color: rgb(198, 40, 40);padding: 2px 6px;border-radius: 3px;font-size: 13px;&quot; class=&quot;js_darkmode__175&quot;&gt;http://localhost:5000/scalar&lt;/code&gt;&amp;nbsp;确认后端接口正常。&lt;/p&gt;&lt;h3 style=&quot;font-size: 17px;font-weight: bold;color: rgb(51, 51, 51);margin: 28px 0px 12px;padding-left: 12px;border-left: 4px solid rgb(102, 126, 234);line-height: 1.5;font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Roboto, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, sans-serif;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;&quot; class=&quot;js_darkmode__176&quot;&gt;Step 4：启动前端&lt;/h3&gt;&lt;pre style=&quot;background: rgb(30, 30, 30);color: rgb(212, 212, 212);padding: 20px;border-radius: 8px;overflow-x: auto;margin: 16px 0px;font-size: 13px;line-height: 1.6;font-family: &amp;quot;Fira Code&amp;quot;, Consolas, Monaco, monospace;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;&quot; class=&quot;js_darkmode__177&quot;&gt;&lt;code style=&quot;font-family: &amp;quot;Fira Code&amp;quot;, Consolas, Monaco, monospace;&quot;&gt;cd Scm.Vue&lt;br/&gt;npm install&lt;br/&gt;npm run dev&lt;/code&gt;&lt;/pre&gt;&lt;p style=&quot;margin: 16px 0px;color: rgb(51, 51, 51);line-height: 1.9;font-size: 15px;font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Roboto, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, sans-serif;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;&quot; class=&quot;js_darkmode__178&quot;&gt;访问&amp;nbsp;&lt;code style=&quot;font-family: &amp;quot;Fira Code&amp;quot;, Consolas, Monaco, monospace;background: rgb(240, 240, 240);color: rgb(198, 40, 40);padding: 2px 6px;border-radius: 3px;font-size: 13px;&quot; class=&quot;js_darkmode__179&quot;&gt;http://localhost:2800&lt;/code&gt;&amp;nbsp;进入前端页面。&lt;/p&gt;&lt;h3 style=&quot;font-size: 17px;font-weight: bold;color: rgb(51, 51, 51);margin: 28px 0px 12px;padding-left: 12px;border-left: 4px solid rgb(102, 126, 234);line-height: 1.5;font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Roboto, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, sans-serif;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;&quot; class=&quot;js_darkmode__180&quot;&gt;演示账号&lt;/h3&gt;&lt;table class=&quot;js_darkmode__181&quot; width=&quot;400&quot;&gt;&lt;tbody&gt;&lt;tr class=&quot;firstRow&quot;&gt;&lt;th style=&quot;background: rgb(102, 126, 234);color: rgb(255, 255, 255);padding: 10px 12px;text-align: left;font-weight: bold;font-size: 13px;&quot;&gt;&lt;section&gt;角色&lt;/section&gt;&lt;/th&gt;&lt;th style=&quot;background: rgb(102, 126, 234);color: rgb(255, 255, 255);padding: 10px 12px;text-align: left;font-weight: bold;font-size: 13px;&quot;&gt;&lt;section&gt;用户名&lt;/section&gt;&lt;/th&gt;&lt;th style=&quot;background: rgb(102, 126, 234);color: rgb(255, 255, 255);padding: 10px 12px;text-align: left;font-weight: bold;font-size: 13px;&quot;&gt;&lt;section&gt;密码&lt;/section&gt;&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;background: rgb(249, 249, 249);&quot; class=&quot;js_darkmode__182&quot;&gt;&lt;section&gt;管理员&lt;/section&gt;&lt;/td&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;background: rgb(249, 249, 249);&quot; class=&quot;js_darkmode__183&quot;&gt;&lt;code style=&quot;font-family: &amp;quot;Fira Code&amp;quot;, Consolas, Monaco, monospace;&quot;&gt;admin&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;background: rgb(249, 249, 249);&quot; class=&quot;js_darkmode__184&quot;&gt;&lt;code style=&quot;font-family: &amp;quot;Fira Code&amp;quot;, Consolas, Monaco, monospace;&quot;&gt;123456&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p style=&quot;margin: 16px 0px;color: rgb(51, 51, 51);line-height: 1.9;font-size: 15px;font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Roboto, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, sans-serif;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;&quot; class=&quot;js_darkmode__185&quot;&gt;在线演示地址：&lt;code style=&quot;font-family: &amp;quot;Fira Code&amp;quot;, Consolas, Monaco, monospace;background: rgb(240, 240, 240);color: rgb(198, 40, 40);padding: 2px 6px;border-radius: 3px;font-size: 13px;&quot; class=&quot;js_darkmode__186&quot;&gt;http://www.c-scm.net&lt;/code&gt;&lt;/p&gt;&lt;h2 style=&quot;font-size: 20px;font-weight: bold;color: rgb(255, 255, 255);background: linear-gradient(135deg, rgb(102, 126, 234) 0%, rgb(118, 75, 162) 100%) rgb(255, 255, 255);padding: 12px 20px;margin: 40px 0px 20px;border-radius: 6px;line-height: 1.4;font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Roboto, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, sans-serif;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;&quot; class=&quot;js_darkmode__bg__7&quot;&gt;08 AI 大模型集成&lt;/h2&gt;&lt;p style=&quot;margin: 16px 0px;color: rgb(51, 51, 51);line-height: 1.9;font-size: 15px;font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Roboto, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, sans-serif;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;&quot; class=&quot;js_darkmode__187&quot;&gt;在 AI 蓬勃发展的当下，Scm.Net 也没有缺席。&lt;code style=&quot;font-family: &amp;quot;Fira Code&amp;quot;, Consolas, Monaco, monospace;background: rgb(240, 240, 240);color: rgb(198, 40, 40);padding: 2px 6px;border-radius: 3px;font-size: 13px;&quot; class=&quot;js_darkmode__188&quot;&gt;Scm.Server.Aiml&lt;/code&gt;&amp;nbsp;模块集成了&amp;nbsp;&lt;strong&gt;7+ 主流大语言模型&lt;/strong&gt;：&lt;/p&gt;&lt;p&gt;7+大模型接入，1统一接口&lt;/p&gt;&lt;table class=&quot;js_darkmode__189&quot; width=&quot;400&quot;&gt;&lt;tbody&gt;&lt;tr class=&quot;firstRow&quot;&gt;&lt;th style=&quot;background: rgb(102, 126, 234);color: rgb(255, 255, 255);padding: 10px 12px;text-align: left;font-weight: bold;font-size: 13px;&quot;&gt;&lt;section&gt;大模型&lt;/section&gt;&lt;/th&gt;&lt;th style=&quot;background: rgb(102, 126, 234);color: rgb(255, 255, 255);padding: 10px 12px;text-align: left;font-weight: bold;font-size: 13px;&quot;&gt;&lt;section&gt;厂商&lt;/section&gt;&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;background: rgb(249, 249, 249);&quot; class=&quot;js_darkmode__190&quot;&gt;&lt;section&gt;DeepSeek&lt;/section&gt;&lt;/td&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;background: rgb(249, 249, 249);&quot; class=&quot;js_darkmode__191&quot;&gt;&lt;section&gt;深度求索&lt;/section&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;&quot; class=&quot;js_darkmode__192&quot;&gt;&lt;section&gt;华为盘古&lt;/section&gt;&lt;/td&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;&quot; class=&quot;js_darkmode__193&quot;&gt;&lt;section&gt;华为&lt;/section&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;background: rgb(249, 249, 249);&quot; class=&quot;js_darkmode__194&quot;&gt;&lt;section&gt;通义千问&lt;/section&gt;&lt;/td&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;background: rgb(249, 249, 249);&quot; class=&quot;js_darkmode__195&quot;&gt;&lt;section&gt;阿里云&lt;/section&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;&quot; class=&quot;js_darkmode__196&quot;&gt;&lt;section&gt;腾讯元宝&lt;/section&gt;&lt;/td&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;&quot; class=&quot;js_darkmode__197&quot;&gt;&lt;section&gt;腾讯&lt;/section&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;background: rgb(249, 249, 249);&quot; class=&quot;js_darkmode__198&quot;&gt;&lt;section&gt;文心一言&lt;/section&gt;&lt;/td&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;background: rgb(249, 249, 249);&quot; class=&quot;js_darkmode__199&quot;&gt;&lt;section&gt;百度&lt;/section&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;&quot; class=&quot;js_darkmode__200&quot;&gt;&lt;section&gt;豆包&lt;/section&gt;&lt;/td&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;&quot; class=&quot;js_darkmode__201&quot;&gt;&lt;section&gt;字节跳动&lt;/section&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;background: rgb(249, 249, 249);&quot; class=&quot;js_darkmode__202&quot;&gt;&lt;section&gt;ChatGPT&lt;/section&gt;&lt;/td&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;background: rgb(249, 249, 249);&quot; class=&quot;js_darkmode__203&quot;&gt;&lt;section&gt;OpenAI&lt;/section&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p style=&quot;margin: 16px 0px;color: rgb(51, 51, 51);line-height: 1.9;font-size: 15px;font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Roboto, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, sans-serif;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;&quot; class=&quot;js_darkmode__204&quot;&gt;这意味着你可以在企业系统中直接集成 AI 能力——智能客服、文档摘要、数据分析、代码辅助等场景，&lt;strong&gt;一个接口切换不同模型&lt;/strong&gt;，无需为每个模型单独适配。&lt;/p&gt;&lt;h2 style=&quot;font-size: 20px;font-weight: bold;color: rgb(255, 255, 255);background: linear-gradient(135deg, rgb(102, 126, 234) 0%, rgb(118, 75, 162) 100%) rgb(255, 255, 255);padding: 12px 20px;margin: 40px 0px 20px;border-radius: 6px;line-height: 1.4;font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Roboto, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, sans-serif;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;&quot; class=&quot;js_darkmode__bg__8&quot;&gt;09 核心配置一览&lt;/h2&gt;&lt;p style=&quot;margin: 16px 0px;color: rgb(51, 51, 51);line-height: 1.9;font-size: 15px;font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Roboto, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, sans-serif;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;&quot; class=&quot;js_darkmode__205&quot;&gt;&lt;code style=&quot;font-family: &amp;quot;Fira Code&amp;quot;, Consolas, Monaco, monospace;background: rgb(240, 240, 240);color: rgb(198, 40, 40);padding: 2px 6px;border-radius: 3px;font-size: 13px;&quot; class=&quot;js_darkmode__206&quot;&gt;appsettings.json&lt;/code&gt;&amp;nbsp;是整个系统的配置中枢，以下是核心配置节点说明：&lt;/p&gt;&lt;table class=&quot;js_darkmode__207&quot; width=&quot;400&quot;&gt;&lt;tbody&gt;&lt;tr class=&quot;firstRow&quot;&gt;&lt;th style=&quot;background: rgb(102, 126, 234);color: rgb(255, 255, 255);padding: 10px 12px;text-align: left;font-weight: bold;font-size: 13px;&quot;&gt;&lt;section&gt;配置节点&lt;/section&gt;&lt;/th&gt;&lt;th style=&quot;background: rgb(102, 126, 234);color: rgb(255, 255, 255);padding: 10px 12px;text-align: left;font-weight: bold;font-size: 13px;&quot;&gt;&lt;section&gt;说明&lt;/section&gt;&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;background: rgb(249, 249, 249);&quot; class=&quot;js_darkmode__208&quot;&gt;&lt;code style=&quot;font-family: &amp;quot;Fira Code&amp;quot;, Consolas, Monaco, monospace;&quot;&gt;Kestrel&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;background: rgb(249, 249, 249);&quot; class=&quot;js_darkmode__209&quot;&gt;&lt;section&gt;HTTP 监听端点（默认 9999 端口）&lt;/section&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;&quot; class=&quot;js_darkmode__210&quot;&gt;&lt;code style=&quot;font-family: &amp;quot;Fira Code&amp;quot;, Consolas, Monaco, monospace;&quot;&gt;Cache&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;&quot; class=&quot;js_darkmode__211&quot;&gt;&lt;section&gt;缓存配置（MemoryCache / Dictionary / Redis）&lt;/section&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;background: rgb(249, 249, 249);&quot; class=&quot;js_darkmode__212&quot;&gt;&lt;code style=&quot;font-family: &amp;quot;Fira Code&amp;quot;, Consolas, Monaco, monospace;&quot;&gt;Uid&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;background: rgb(249, 249, 249);&quot; class=&quot;js_darkmode__213&quot;&gt;&lt;section&gt;ID 生成器配置&lt;/section&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;&quot; class=&quot;js_darkmode__214&quot;&gt;&lt;code style=&quot;font-family: &amp;quot;Fira Code&amp;quot;, Consolas, Monaco, monospace;&quot;&gt;Sql&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;&quot; class=&quot;js_darkmode__215&quot;&gt;&lt;section&gt;数据库连接（8种数据库可选）&lt;/section&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;background: rgb(249, 249, 249);&quot; class=&quot;js_darkmode__216&quot;&gt;&lt;code style=&quot;font-family: &amp;quot;Fira Code&amp;quot;, Consolas, Monaco, monospace;&quot;&gt;Jwt&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;background: rgb(249, 249, 249);&quot; class=&quot;js_darkmode__217&quot;&gt;&lt;section&gt;JWT 认证配置&lt;/section&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;&quot; class=&quot;js_darkmode__218&quot;&gt;&lt;code style=&quot;font-family: &amp;quot;Fira Code&amp;quot;, Consolas, Monaco, monospace;&quot;&gt;Cors&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;&quot; class=&quot;js_darkmode__219&quot;&gt;&lt;section&gt;跨域访问配置&lt;/section&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;background: rgb(249, 249, 249);&quot; class=&quot;js_darkmode__220&quot;&gt;&lt;code style=&quot;font-family: &amp;quot;Fira Code&amp;quot;, Consolas, Monaco, monospace;&quot;&gt;Quartz&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;background: rgb(249, 249, 249);&quot; class=&quot;js_darkmode__221&quot;&gt;&lt;section&gt;定时任务调度&lt;/section&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;&quot; class=&quot;js_darkmode__222&quot;&gt;&lt;code style=&quot;font-family: &amp;quot;Fira Code&amp;quot;, Consolas, Monaco, monospace;&quot;&gt;Email&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;&quot; class=&quot;js_darkmode__223&quot;&gt;&lt;section&gt;邮件服务（SMTP）&lt;/section&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;background: rgb(249, 249, 249);&quot; class=&quot;js_darkmode__224&quot;&gt;&lt;code style=&quot;font-family: &amp;quot;Fira Code&amp;quot;, Consolas, Monaco, monospace;&quot;&gt;Oidc&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;background: rgb(249, 249, 249);&quot; class=&quot;js_darkmode__225&quot;&gt;&lt;section&gt;第三方联合登录&lt;/section&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;&quot; class=&quot;js_darkmode__226&quot;&gt;&lt;code style=&quot;font-family: &amp;quot;Fira Code&amp;quot;, Consolas, Monaco, monospace;&quot;&gt;Otp&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;&quot; class=&quot;js_darkmode__227&quot;&gt;&lt;section&gt;动态口令（TOTP）&lt;/section&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;background: rgb(249, 249, 249);&quot; class=&quot;js_darkmode__228&quot;&gt;&lt;code style=&quot;font-family: &amp;quot;Fira Code&amp;quot;, Consolas, Monaco, monospace;&quot;&gt;Generator&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;background: rgb(249, 249, 249);&quot; class=&quot;js_darkmode__229&quot;&gt;&lt;section&gt;代码生成器&lt;/section&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;&quot; class=&quot;js_darkmode__230&quot;&gt;&lt;code style=&quot;font-family: &amp;quot;Fira Code&amp;quot;, Consolas, Monaco, monospace;&quot;&gt;Serilog&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;&quot; class=&quot;js_darkmode__231&quot;&gt;&lt;section&gt;结构化日志&lt;/section&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;background: rgb(249, 249, 249);&quot; class=&quot;js_darkmode__232&quot;&gt;&lt;code style=&quot;font-family: &amp;quot;Fira Code&amp;quot;, Consolas, Monaco, monospace;&quot;&gt;Scalar&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;background: rgb(249, 249, 249);&quot; class=&quot;js_darkmode__233&quot;&gt;&lt;section&gt;API 文档可视化&lt;/section&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;&quot; class=&quot;js_darkmode__234&quot;&gt;&lt;code style=&quot;font-family: &amp;quot;Fira Code&amp;quot;, Consolas, Monaco, monospace;&quot;&gt;Swagger&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;&quot; class=&quot;js_darkmode__235&quot;&gt;&lt;section&gt;API 文档可视化&lt;/section&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h2 style=&quot;font-size: 20px;font-weight: bold;color: rgb(255, 255, 255);background: linear-gradient(135deg, rgb(102, 126, 234) 0%, rgb(118, 75, 162) 100%) rgb(255, 255, 255);padding: 12px 20px;margin: 40px 0px 20px;border-radius: 6px;line-height: 1.4;font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Roboto, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, sans-serif;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;&quot; class=&quot;js_darkmode__bg__9&quot;&gt;10 内置 API 接口&lt;/h2&gt;&lt;p style=&quot;margin: 16px 0px;color: rgb(51, 51, 51);line-height: 1.9;font-size: 15px;font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Roboto, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, sans-serif;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;&quot; class=&quot;js_darkmode__236&quot;&gt;框架自带以&lt;span style=&quot;color: #333333;line-height: 1.9;font-size: 15px;font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Roboto, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, sans-serif;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;background-color: #FFFFFF;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;&quot; class=&quot;js_darkmode__237&quot;&gt;下基础控制&lt;/span&gt;器，无需额外开发：&lt;/p&gt;&lt;table class=&quot;js_darkmode__238&quot; width=&quot;400&quot;&gt;&lt;tbody&gt;&lt;tr class=&quot;firstRow&quot;&gt;&lt;th style=&quot;background: rgb(102, 126, 234);color: rgb(255, 255, 255);padding: 10px 12px;text-align: left;font-weight: bold;font-size: 13px;&quot;&gt;&lt;section&gt;控制器&lt;/section&gt;&lt;/th&gt;&lt;th style=&quot;background: rgb(102, 126, 234);color: rgb(255, 255, 255);padding: 10px 12px;text-align: left;font-weight: bold;font-size: 13px;&quot;&gt;&lt;section&gt;功能&lt;/section&gt;&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;background: rgb(249, 249, 249);&quot; class=&quot;js_darkmode__239&quot;&gt;&lt;code style=&quot;font-family: &amp;quot;Fira Code&amp;quot;, Consolas, Monaco, monospace;&quot;&gt;CaptchaController&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;background: rgb(249, 249, 249);&quot; class=&quot;js_darkmode__240&quot;&gt;&lt;section&gt;图形验证码生成&lt;/section&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;&quot; class=&quot;js_darkmode__241&quot;&gt;&lt;code style=&quot;font-family: &amp;quot;Fira Code&amp;quot;, Consolas, Monaco, monospace;&quot;&gt;UploadController&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;&quot; class=&quot;js_darkmode__242&quot;&gt;&lt;section&gt;文件上传&lt;/section&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;background: rgb(249, 249, 249);&quot; class=&quot;js_darkmode__243&quot;&gt;&lt;code style=&quot;font-family: &amp;quot;Fira Code&amp;quot;, Consolas, Monaco, monospace;&quot;&gt;DownloadController&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;background: rgb(249, 249, 249);&quot; class=&quot;js_darkmode__244&quot;&gt;&lt;section&gt;文件下载&lt;/section&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;&quot; class=&quot;js_darkmode__245&quot;&gt;&lt;code style=&quot;font-family: &amp;quot;Fira Code&amp;quot;, Consolas, Monaco, monospace;&quot;&gt;GeneratorController&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;&quot; class=&quot;js_darkmode__246&quot;&gt;&lt;section&gt;代码生成&lt;/section&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;background: rgb(249, 249, 249);&quot; class=&quot;js_darkmode__247&quot;&gt;&lt;code style=&quot;font-family: &amp;quot;Fira Code&amp;quot;, Consolas, Monaco, monospace;&quot;&gt;QuartzController&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;background: rgb(249, 249, 249);&quot; class=&quot;js_darkmode__248&quot;&gt;&lt;section&gt;定时任务管理&lt;/section&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;&quot; class=&quot;js_darkmode__249&quot;&gt;&lt;code style=&quot;font-family: &amp;quot;Fira Code&amp;quot;, Consolas, Monaco, monospace;&quot;&gt;HbController&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;&quot; class=&quot;js_darkmode__250&quot;&gt;&lt;section&gt;心跳检测&lt;/section&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;background: rgb(249, 249, 249);&quot; class=&quot;js_darkmode__251&quot;&gt;&lt;code style=&quot;font-family: &amp;quot;Fira Code&amp;quot;, Consolas, Monaco, monospace;&quot;&gt;OnLineController&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;padding: 10px 12px;border-bottom: 1px solid rgb(238, 238, 238);font-size: 13px;background: rgb(249, 249, 249);&quot; class=&quot;js_darkmode__252&quot;&gt;&lt;section&gt;在线用户管理&lt;/section&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p style=&quot;margin: 16px 0px;color: rgb(51, 51, 51);line-height: 1.9;font-size: 15px;font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Roboto, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, sans-serif;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;&quot; class=&quot;js_darkmode__253&quot;&gt;启动后访问&amp;nbsp;&lt;code style=&quot;font-family: &amp;quot;Fira Code&amp;quot;, Consolas, Monaco, monospace;background: rgb(240, 240, 240);color: rgb(198, 40, 40);padding: 2px 6px;border-radius: 3px;font-size: 13px;&quot; class=&quot;js_darkmode__254&quot;&gt;http://localhost:5000/scalar&lt;/code&gt;&amp;nbsp;查看完整 API 文档，所有接口均可在线调试。&lt;/p&gt;&lt;h2 style=&quot;font-size: 20px;font-weight: bold;color: rgb(255, 255, 255);background: linear-gradient(135deg, rgb(102, 126, 234) 0%, rgb(118, 75, 162) 100%) rgb(255, 255, 255);padding: 12px 20px;margin: 40px 0px 20px;border-radius: 6px;line-height: 1.4;font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Roboto, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, sans-serif;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;&quot; class=&quot;js_darkmode__bg__10&quot;&gt;11 界面预览&lt;/h2&gt;&lt;h3 style=&quot;font-size: 17px;font-weight: bold;color: rgb(51, 51, 51);margin: 28px 0px 12px;padding-left: 12px;border-left: 4px solid rgb(102, 126, 234);line-height: 1.5;font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Roboto, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, sans-serif;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;&quot; class=&quot;js_darkmode__255&quot;&gt;工作台模式&lt;/h3&gt;&lt;table class=&quot;js_darkmode__256&quot;&gt;&lt;thead&gt;&lt;tr style=&quot;box-sizing: border-box;background-color: rgb(255, 255, 255);border-top: 1px solid rgb(198, 203, 209);&quot; class=&quot;js_darkmode__257 firstRow&quot;&gt;&lt;th style=&quot;box-sizing: border-box;padding: 6px 13px;font-weight: 600;border: 1px solid rgb(223, 226, 229);&quot; class=&quot;js_darkmode__258&quot;&gt;&lt;section&gt;功能&lt;/section&gt;&lt;/th&gt;&lt;th style=&quot;box-sizing: border-box;padding: 6px 13px;font-weight: 600;border: 1px solid rgb(223, 226, 229);&quot; class=&quot;js_darkmode__259&quot;&gt;&lt;section&gt;截图&lt;/section&gt;&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr style=&quot;box-sizing: border-box;background-color: rgb(255, 255, 255);border-top: 1px solid rgb(198, 203, 209);&quot; class=&quot;js_darkmode__260&quot;&gt;&lt;td&gt;&lt;section style=&quot;margin: 16px 0px;color: rgb(51, 51, 51);line-height: 1.9;font-size: 15px;font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Roboto, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, sans-serif;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;&quot; class=&quot;js_darkmode__261&quot;&gt;&lt;span style=&quot;color: #333333;line-height: 1.9;font-size: 15px;font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Roboto, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, sans-serif;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;background-color: #FFFFFF;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;&quot; class=&quot;js_darkmode__262&quot;&gt;控制台首页&lt;/span&gt;&lt;/section&gt;&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box;padding: 6px 13px;border: 1px solid rgb(223, 226, 229);&quot; class=&quot;js_darkmode__263&quot;&gt;&lt;section&gt;&lt;img data-src=&quot;https://mmbiz.qpic.cn/sz_mmbiz_png/Qia51icmhYocLib0lK8GCXgCnLFibFo364A9cjn6dlRQCzTWicJbGfnichxxsG9ARz3dGOFgCcicibMdvPwaIOSHlnkfmAibNSlOvoO7T90hgCNrKeJg/640?wx_fmt=png&amp;amp;from=appmsg&amp;amp;watermark=1#imgIndex=0&quot; alt=&quot;后台首页&quot; class=&quot;rich_pages wxw-img js_darkmode__264&quot; data-ratio=&quot;0.549074074074074&quot; data-type=&quot;png&quot; data-w=&quot;1080&quot; style=&quot;box-sizing: content-box; border: 0px none; max-width: 100%; background-color: rgb(255, 255, 255); cursor: pointer; display: inline-block !important; height: auto !important; visibility: visible !important; width: 578.016px !important;&quot; data-imgfileid=&quot;100011304&quot; data-aistatus=&quot;1&quot; data-original-style=&quot;box-sizing: content-box;border: 0px none;max-width: 100%;background-color: rgb(255, 255, 255);cursor: pointer;display: inline-block !important;&quot; data-index=&quot;3&quot; src=&quot;https://mmbiz.qpic.cn/sz_mmbiz_png/Qia51icmhYocLib0lK8GCXgCnLFibFo364A9cjn6dlRQCzTWicJbGfnichxxsG9ARz3dGOFgCcicibMdvPwaIOSHlnkfmAibNSlOvoO7T90hgCNrKeJg/640?wx_fmt=png&amp;from=appmsg&amp;tp=wxpic&amp;wxfrom=5&amp;wx_lazy=1&amp;watermark=1#imgIndex=0&quot; _width=&quot;614px&quot; data-before-load-time=&quot;1783907972773&quot; data-report-img-idx=&quot;0&quot; data-fail=&quot;0&quot;/&gt;&lt;/section&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;box-sizing: border-box;background-color: rgb(246, 248, 250);border-top: 1px solid rgb(198, 203, 209);&quot; class=&quot;js_darkmode__265&quot;&gt;&lt;td style=&quot;box-sizing: border-box;padding: 6px 13px;border: 1px solid rgb(223, 226, 229);&quot; class=&quot;js_darkmode__266&quot;&gt;&lt;section&gt;用户管理&lt;/section&gt;&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box;padding: 6px 13px;border: 1px solid rgb(223, 226, 229);&quot; class=&quot;js_darkmode__267&quot;&gt;&lt;section&gt;&lt;img data-src=&quot;https://mmbiz.qpic.cn/mmbiz_png/Qia51icmhYocJGvHNxO1zJefErWbMlAicyHEb99FNOUmYEuickHgFvXlJLJic4ZlEa0f6WPgzOaGSOvBYwpibUB5ibN7OlHDtm6bbnWmqibmicDVnWxs/640?wx_fmt=png&amp;amp;from=appmsg&amp;amp;watermark=1#imgIndex=1&quot; alt=&quot;用户管理&quot; class=&quot;rich_pages wxw-img js_darkmode__268&quot; data-ratio=&quot;0.549074074074074&quot; data-type=&quot;png&quot; data-w=&quot;1080&quot; style=&quot;box-sizing: content-box; border: 0px none; max-width: 100%; background-color: rgb(255, 255, 255); cursor: pointer; display: inline-block !important; height: auto !important; visibility: visible !important; width: 578.016px !important;&quot; data-imgfileid=&quot;100011303&quot; data-aistatus=&quot;1&quot; data-original-style=&quot;box-sizing: content-box;border: 0px none;max-width: 100%;background-color: rgb(255, 255, 255);cursor: pointer;display: inline-block !important;&quot; data-index=&quot;4&quot; src=&quot;https://mmbiz.qpic.cn/mmbiz_png/Qia51icmhYocJGvHNxO1zJefErWbMlAicyHEb99FNOUmYEuickHgFvXlJLJic4ZlEa0f6WPgzOaGSOvBYwpibUB5ibN7OlHDtm6bbnWmqibmicDVnWxs/640?wx_fmt=png&amp;from=appmsg&amp;tp=wxpic&amp;wxfrom=5&amp;wx_lazy=1&amp;watermark=1#imgIndex=1&quot; _width=&quot;614px&quot; data-before-load-time=&quot;1783907973062&quot; data-report-img-idx=&quot;1&quot; data-fail=&quot;0&quot;/&gt;&lt;/section&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;box-sizing: border-box;background-color: rgb(255, 255, 255);border-top: 1px solid rgb(198, 203, 209);&quot; class=&quot;js_darkmode__269&quot;&gt;&lt;td style=&quot;box-sizing: border-box;padding: 6px 13px;border: 1px solid rgb(223, 226, 229);&quot; class=&quot;js_darkmode__270&quot;&gt;&lt;section&gt;文件管理&lt;/section&gt;&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box;padding: 6px 13px;border: 1px solid rgb(223, 226, 229);&quot; class=&quot;js_darkmode__271&quot;&gt;&lt;section&gt;&lt;img data-src=&quot;https://mmbiz.qpic.cn/sz_mmbiz_png/Qia51icmhYocIQWOEtRtJf5VbXxydsJ7XNk5JMd708BIxlhh7S2uh6yvWnibbTJESfwIhdy8oicKYNyZvbE16D00d0pcqaYKO1PZibRESA1LBAIQ/640?wx_fmt=png&amp;amp;from=appmsg&amp;amp;watermark=1#imgIndex=2&quot; alt=&quot;文件管理&quot; class=&quot;rich_pages wxw-img js_darkmode__272&quot; data-ratio=&quot;0.549074074074074&quot; data-type=&quot;png&quot; data-w=&quot;1080&quot; style=&quot;box-sizing: content-box; border: 0px none; max-width: 100%; background-color: rgb(255, 255, 255); cursor: pointer; display: inline-block !important; height: auto !important; visibility: visible !important; width: 578.016px !important;&quot; data-imgfileid=&quot;100011300&quot; data-aistatus=&quot;1&quot; data-original-style=&quot;box-sizing: content-box;border: 0px none;max-width: 100%;background-color: rgb(255, 255, 255);cursor: pointer;display: inline-block !important;&quot; data-index=&quot;5&quot; src=&quot;https://mmbiz.qpic.cn/sz_mmbiz_png/Qia51icmhYocIQWOEtRtJf5VbXxydsJ7XNk5JMd708BIxlhh7S2uh6yvWnibbTJESfwIhdy8oicKYNyZvbE16D00d0pcqaYKO1PZibRESA1LBAIQ/640?wx_fmt=png&amp;from=appmsg&amp;tp=wxpic&amp;wxfrom=5&amp;wx_lazy=1&amp;watermark=1#imgIndex=2&quot; _width=&quot;614px&quot; data-before-load-time=&quot;1783907973313&quot; data-report-img-idx=&quot;2&quot; data-fail=&quot;0&quot;/&gt;&lt;/section&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;box-sizing: border-box;background-color: rgb(246, 248, 250);border-top: 1px solid rgb(198, 203, 209);&quot; class=&quot;js_darkmode__273&quot;&gt;&lt;td style=&quot;box-sizing: border-box;padding: 6px 13px;border: 1px solid rgb(223, 226, 229);&quot; class=&quot;js_darkmode__274&quot;&gt;&lt;section&gt;日程管理&lt;/section&gt;&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box;padding: 6px 13px;border: 1px solid rgb(223, 226, 229);&quot; class=&quot;js_darkmode__275&quot;&gt;&lt;section&gt;&lt;img data-src=&quot;https://mmbiz.qpic.cn/mmbiz_png/Qia51icmhYocLLZug2xHjtOzrsLr5iatfZoKVgFapV2nCYlrbIlzbZHb9gOxkFZH7hRG3WDkGE5lXXJamPeUWkXqbc1od7GNlWEHPhlKDMKutA/640?wx_fmt=png&amp;amp;from=appmsg&amp;amp;watermark=1#imgIndex=3&quot; alt=&quot;日程管理&quot; class=&quot;rich_pages wxw-img js_darkmode__276&quot; data-ratio=&quot;0.549074074074074&quot; data-type=&quot;png&quot; data-w=&quot;1080&quot; style=&quot;box-sizing: content-box; border: 0px none; max-width: 100%; background-color: rgb(255, 255, 255); cursor: pointer; display: inline-block !important; height: auto !important; visibility: visible !important; width: 578.016px !important;&quot; data-imgfileid=&quot;100011301&quot; data-aistatus=&quot;1&quot; data-original-style=&quot;box-sizing: content-box;border: 0px none;max-width: 100%;background-color: rgb(255, 255, 255);cursor: pointer;display: inline-block !important;&quot; data-index=&quot;6&quot; src=&quot;https://mmbiz.qpic.cn/mmbiz_png/Qia51icmhYocLLZug2xHjtOzrsLr5iatfZoKVgFapV2nCYlrbIlzbZHb9gOxkFZH7hRG3WDkGE5lXXJamPeUWkXqbc1od7GNlWEHPhlKDMKutA/640?wx_fmt=png&amp;from=appmsg&amp;tp=wxpic&amp;wxfrom=5&amp;wx_lazy=1&amp;watermark=1#imgIndex=3&quot; _width=&quot;614px&quot; data-before-load-time=&quot;1783907973913&quot; data-report-img-idx=&quot;3&quot; data-fail=&quot;0&quot;/&gt;&lt;/section&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;box-sizing: border-box;background-color: rgb(255, 255, 255);border-top: 1px solid rgb(198, 203, 209);&quot; class=&quot;js_darkmode__277&quot;&gt;&lt;td style=&quot;box-sizing: border-box;padding: 6px 13px;border: 1px solid rgb(223, 226, 229);&quot; class=&quot;js_darkmode__278&quot;&gt;&lt;section&gt;电子邮件&lt;/section&gt;&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box;padding: 6px 13px;border: 1px solid rgb(223, 226, 229);&quot; class=&quot;js_darkmode__279&quot;&gt;&lt;section&gt;&lt;img data-src=&quot;https://mmbiz.qpic.cn/sz_mmbiz_png/Qia51icmhYocJPPwR80KB18ByEheX5E2IyaPJ6iaicSTzlr1ibSYCJiafAdHdlIWrZJA6j7mCkxNJkmks9uaODh04tMlxKuibKprrzblyyQfhO4Kz8/640?wx_fmt=png&amp;amp;from=appmsg&amp;amp;watermark=1#imgIndex=4&quot; alt=&quot;电子邮件&quot; class=&quot;rich_pages wxw-img js_darkmode__280&quot; data-ratio=&quot;0.549074074074074&quot; data-type=&quot;png&quot; data-w=&quot;1080&quot; style=&quot;box-sizing: content-box; border: 0px none; max-width: 100%; background-color: rgb(255, 255, 255); cursor: pointer; display: inline-block !important; height: auto !important; visibility: visible !important; width: 578.016px !important;&quot; data-imgfileid=&quot;100011302&quot; data-aistatus=&quot;1&quot; data-original-style=&quot;box-sizing: content-box;border: 0px none;max-width: 100%;background-color: rgb(255, 255, 255);cursor: pointer;display: inline-block !important;&quot; data-index=&quot;7&quot; src=&quot;https://mmbiz.qpic.cn/sz_mmbiz_png/Qia51icmhYocJPPwR80KB18ByEheX5E2IyaPJ6iaicSTzlr1ibSYCJiafAdHdlIWrZJA6j7mCkxNJkmks9uaODh04tMlxKuibKprrzblyyQfhO4Kz8/640?wx_fmt=png&amp;from=appmsg&amp;tp=wxpic&amp;wxfrom=5&amp;wx_lazy=1&amp;watermark=1#imgIndex=4&quot; _width=&quot;614px&quot; data-before-load-time=&quot;1783907974316&quot; data-report-img-idx=&quot;4&quot; data-fail=&quot;0&quot;/&gt;&lt;/section&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;box-sizing: border-box;background-color: rgb(246, 248, 250);border-top: 1px solid rgb(198, 203, 209);&quot; class=&quot;js_darkmode__281&quot;&gt;&lt;td style=&quot;box-sizing: border-box;padding: 6px 13px;border: 1px solid rgb(223, 226, 229);&quot; class=&quot;js_darkmode__282&quot;&gt;&lt;section&gt;系统监控&lt;/section&gt;&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box;padding: 6px 13px;border: 1px solid rgb(223, 226, 229);&quot; class=&quot;js_darkmode__283&quot;&gt;&lt;section&gt;&lt;img data-src=&quot;https://mmbiz.qpic.cn/sz_mmbiz_png/Qia51icmhYocK2OxnBtoZ0810pn7SIjaXum7cwUeIow391csC8UJicT9mc2QFwfHm8gSBIiaGwmk9PFMiar8bk36F80GHDZCWXxHrcLjN9wo8GicE/640?wx_fmt=png&amp;amp;from=appmsg&amp;amp;watermark=1#imgIndex=5&quot; alt=&quot;系统监控&quot; class=&quot;rich_pages wxw-img js_darkmode__284&quot; data-ratio=&quot;0.549074074074074&quot; data-type=&quot;png&quot; data-w=&quot;1080&quot; style=&quot;box-sizing: content-box; border: 0px none; max-width: 100%; background-color: rgb(255, 255, 255); cursor: pointer; display: inline-block !important; height: auto !important; visibility: visible !important; width: 578.016px !important;&quot; data-imgfileid=&quot;100011305&quot; data-aistatus=&quot;1&quot; data-original-style=&quot;box-sizing: content-box;border: 0px none;max-width: 100%;background-color: rgb(255, 255, 255);cursor: pointer;display: inline-block !important;&quot; data-index=&quot;8&quot; src=&quot;https://mmbiz.qpic.cn/sz_mmbiz_png/Qia51icmhYocK2OxnBtoZ0810pn7SIjaXum7cwUeIow391csC8UJicT9mc2QFwfHm8gSBIiaGwmk9PFMiar8bk36F80GHDZCWXxHrcLjN9wo8GicE/640?wx_fmt=png&amp;from=appmsg&amp;tp=wxpic&amp;wxfrom=5&amp;wx_lazy=1&amp;watermark=1#imgIndex=5&quot; _width=&quot;614px&quot; data-before-load-time=&quot;1783907974592&quot; data-report-img-idx=&quot;5&quot; data-fail=&quot;0&quot;/&gt;&lt;/section&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;box-sizing: border-box;background-color: rgb(255, 255, 255);border-top: 1px solid rgb(198, 203, 209);&quot; class=&quot;js_darkmode__285&quot;&gt;&lt;td style=&quot;box-sizing: border-box;padding: 6px 13px;border: 1px solid rgb(223, 226, 229);&quot; class=&quot;js_darkmode__286&quot;&gt;&lt;section&gt;在线文档&lt;/section&gt;&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box;padding: 6px 13px;border: 1px solid rgb(223, 226, 229);&quot; class=&quot;js_darkmode__287&quot;&gt;&lt;section&gt;&lt;img data-src=&quot;https://mmbiz.qpic.cn/mmbiz_png/Qia51icmhYocLO48obPhgeo2Bj4icE9zGJn2svF0DBkU64crC0AibLX0zl6b0e6oIJAyJ81IhnLicKJxFCECThynEb9nr9icAo0q7XGVTUeWSichCE/640?wx_fmt=png&amp;amp;from=appmsg&amp;amp;watermark=1#imgIndex=6&quot; alt=&quot;在线文档&quot; class=&quot;rich_pages wxw-img js_darkmode__288&quot; data-ratio=&quot;0.549074074074074&quot; data-type=&quot;png&quot; data-w=&quot;1080&quot; style=&quot;box-sizing: content-box; border: 0px none; max-width: 100%; background-color: rgb(255, 255, 255); cursor: pointer; display: inline-block !important; height: auto !important; visibility: visible !important; width: 578.016px !important;&quot; data-imgfileid=&quot;100011306&quot; data-aistatus=&quot;1&quot; data-original-style=&quot;box-sizing: content-box;border: 0px none;max-width: 100%;background-color: rgb(255, 255, 255);cursor: pointer;display: inline-block !important;&quot; data-index=&quot;9&quot; src=&quot;https://mmbiz.qpic.cn/mmbiz_png/Qia51icmhYocLO48obPhgeo2Bj4icE9zGJn2svF0DBkU64crC0AibLX0zl6b0e6oIJAyJ81IhnLicKJxFCECThynEb9nr9icAo0q7XGVTUeWSichCE/640?wx_fmt=png&amp;from=appmsg&amp;tp=wxpic&amp;wxfrom=5&amp;wx_lazy=1&amp;watermark=1#imgIndex=6&quot; _width=&quot;614px&quot; data-before-load-time=&quot;1783907974651&quot; data-report-img-idx=&quot;6&quot; data-fail=&quot;0&quot;/&gt;&lt;/section&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h3 style=&quot;font-size: 17px;font-weight: bold;color: rgb(51, 51, 51);margin: 28px 0px 12px;padding-left: 12px;border-left: 4px solid rgb(102, 126, 234);line-height: 1.5;font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Roboto, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, sans-serif;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;&quot; class=&quot;js_darkmode__289&quot;&gt;云桌面模式&lt;/h3&gt;&lt;table class=&quot;js_darkmode__290&quot; width=&quot;856&quot;&gt;&lt;thead&gt;&lt;tr style=&quot;box-sizing: border-box;background-color: rgb(255, 255, 255);border-top: 1px solid rgb(198, 203, 209);&quot; class=&quot;js_darkmode__291 firstRow&quot;&gt;&lt;th style=&quot;box-sizing: border-box;padding: 6px 13px;font-weight: 600;border: 1px solid rgb(223, 226, 229);&quot; class=&quot;js_darkmode__292&quot;&gt;&lt;section&gt;功能&lt;/section&gt;&lt;/th&gt;&lt;th style=&quot;box-sizing: border-box;padding: 6px 13px;font-weight: 600;border: 1px solid rgb(223, 226, 229);&quot; class=&quot;js_darkmode__293&quot;&gt;&lt;section&gt;截图&lt;/section&gt;&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr style=&quot;box-sizing: border-box;background-color: rgb(255, 255, 255);border-top: 1px solid rgb(198, 203, 209);&quot; class=&quot;js_darkmode__294&quot;&gt;&lt;td style=&quot;box-sizing: border-box;padding: 6px 13px;border: 1px solid rgb(223, 226, 229);&quot; class=&quot;js_darkmode__295&quot;&gt;&lt;section&gt;桌面首页&lt;/section&gt;&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box;padding: 6px 13px;border: 1px solid rgb(223, 226, 229);&quot; class=&quot;js_darkmode__296&quot;&gt;&lt;section&gt;&lt;img data-src=&quot;https://mmbiz.qpic.cn/sz_mmbiz_png/Qia51icmhYocIvUbMJxTic7PeZUqYOF1MmrzxbcY7g2giceoicr7dj04DUC0IIEhVfLribuTiaZflN2aZhzwbBV98d2GhLADDCfEOfRmtlkHT9QLwA/640?wx_fmt=png&amp;amp;from=appmsg&amp;amp;watermark=1#imgIndex=7&quot; class=&quot;rich_pages wxw-img js_insertlocalimg&quot; data-ratio=&quot;0.549074074074074&quot; data-s=&quot;300,640&quot; data-type=&quot;png&quot; data-w=&quot;1080&quot; type=&quot;inline&quot; data-imgfileid=&quot;100011310&quot; data-aistatus=&quot;1&quot; data-original-style=&quot;null&quot; data-index=&quot;10&quot; src=&quot;https://mmbiz.qpic.cn/sz_mmbiz_png/Qia51icmhYocIvUbMJxTic7PeZUqYOF1MmrzxbcY7g2giceoicr7dj04DUC0IIEhVfLribuTiaZflN2aZhzwbBV98d2GhLADDCfEOfRmtlkHT9QLwA/640?wx_fmt=png&amp;from=appmsg&amp;tp=wxpic&amp;wxfrom=5&amp;wx_lazy=1&amp;watermark=1#imgIndex=7&quot; _width=&quot;614px&quot; style=&quot;height: auto !important; visibility: visible !important; width: 572.531px !important;&quot; alt=&quot;图片&quot; data-before-load-time=&quot;1783907974982&quot; data-report-img-idx=&quot;7&quot; data-fail=&quot;0&quot;/&gt;&lt;/section&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;box-sizing: border-box;background-color: rgb(246, 248, 250);border-top: 1px solid rgb(198, 203, 209);&quot; class=&quot;js_darkmode__297&quot;&gt;&lt;td style=&quot;box-sizing: border-box;padding: 6px 13px;border: 1px solid rgb(223, 226, 229);&quot; class=&quot;js_darkmode__298&quot;&gt;&lt;section&gt;云文件管理&lt;/section&gt;&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box;padding: 6px 13px;border: 1px solid rgb(223, 226, 229);&quot; class=&quot;js_darkmode__299&quot;&gt;&lt;section&gt;&lt;img data-src=&quot;https://mmbiz.qpic.cn/mmbiz_png/Qia51icmhYocIso22iapNFOOAMmSHwocxH2O7ibC7SgHNMib0QqUmvLZwxfFPPyy0iaVfUuPSYRCx51aIYmpEkS5SOZZ3LywJuib5rJROAyibOKkaYE/640?wx_fmt=png&amp;amp;from=appmsg&amp;amp;watermark=1#imgIndex=8&quot; class=&quot;rich_pages wxw-img js_insertlocalimg&quot; data-ratio=&quot;0.549074074074074&quot; data-s=&quot;300,640&quot; data-type=&quot;png&quot; data-w=&quot;1080&quot; type=&quot;inline&quot; data-imgfileid=&quot;100011311&quot; data-aistatus=&quot;1&quot; data-original-style=&quot;null&quot; data-index=&quot;11&quot; src=&quot;https://mmbiz.qpic.cn/mmbiz_png/Qia51icmhYocIso22iapNFOOAMmSHwocxH2O7ibC7SgHNMib0QqUmvLZwxfFPPyy0iaVfUuPSYRCx51aIYmpEkS5SOZZ3LywJuib5rJROAyibOKkaYE/640?wx_fmt=png&amp;from=appmsg&amp;tp=wxpic&amp;wxfrom=5&amp;wx_lazy=1&amp;watermark=1#imgIndex=8&quot; _width=&quot;614px&quot; style=&quot;height: auto !important; visibility: visible !important; width: 572.531px !important;&quot; alt=&quot;图片&quot; data-before-load-time=&quot;1783907975192&quot; data-report-img-idx=&quot;8&quot; data-fail=&quot;0&quot;/&gt;&lt;/section&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;box-sizing: border-box;background-color: rgb(255, 255, 255);border-top: 1px solid rgb(198, 203, 209);&quot; class=&quot;js_darkmode__300&quot;&gt;&lt;td style=&quot;box-sizing: border-box;padding: 6px 13px;border: 1px solid rgb(223, 226, 229);&quot; class=&quot;js_darkmode__301&quot;&gt;&lt;section&gt;记事本&lt;/section&gt;&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box;padding: 6px 13px;border: 1px solid rgb(223, 226, 229);&quot; class=&quot;js_darkmode__302&quot;&gt;&lt;section&gt;&lt;img data-src=&quot;https://mmbiz.qpic.cn/sz_mmbiz_png/Qia51icmhYocKJ4RTj6EuGetdvB7Nxd9MvDZ0ib4MkicficiaAll0meXicseb3oDia5c5hNLv7YDoqLLurcklbClWxxqLZ92uT1KS12sZn6u6Z2Puco/640?wx_fmt=png&amp;amp;from=appmsg&amp;amp;watermark=1#imgIndex=9&quot; class=&quot;rich_pages wxw-img js_insertlocalimg&quot; data-ratio=&quot;0.549074074074074&quot; data-s=&quot;300,640&quot; data-type=&quot;png&quot; data-w=&quot;1080&quot; type=&quot;inline&quot; data-imgfileid=&quot;100011312&quot; data-aistatus=&quot;1&quot; data-original-style=&quot;null&quot; data-index=&quot;12&quot; src=&quot;https://mmbiz.qpic.cn/sz_mmbiz_png/Qia51icmhYocKJ4RTj6EuGetdvB7Nxd9MvDZ0ib4MkicficiaAll0meXicseb3oDia5c5hNLv7YDoqLLurcklbClWxxqLZ92uT1KS12sZn6u6Z2Puco/640?wx_fmt=png&amp;from=appmsg&amp;tp=wxpic&amp;wxfrom=5&amp;wx_lazy=1&amp;watermark=1#imgIndex=9&quot; _width=&quot;614px&quot; style=&quot;height: auto !important; visibility: visible !important; width: 572.531px !important;&quot; alt=&quot;图片&quot; data-before-load-time=&quot;1783907975433&quot; data-report-img-idx=&quot;9&quot; data-fail=&quot;0&quot;/&gt;&lt;/section&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;box-sizing: border-box;background-color: rgb(246, 248, 250);border-top: 1px solid rgb(198, 203, 209);&quot; class=&quot;js_darkmode__303&quot;&gt;&lt;td style=&quot;box-sizing: border-box;padding: 6px 13px;border: 1px solid rgb(223, 226, 229);&quot; class=&quot;js_darkmode__304&quot;&gt;&lt;section&gt;图片查看&lt;/section&gt;&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box;padding: 6px 13px;border: 1px solid rgb(223, 226, 229);&quot; class=&quot;js_darkmode__305&quot;&gt;&lt;section&gt;&lt;img data-src=&quot;https://mmbiz.qpic.cn/mmbiz_png/Qia51icmhYocIoqKzIhSURf2pedW4vMd8JOSjjBTSdHdC5eZD7OnJ6Vcmnscc2ULzzWazKgBkjHX2kQRmhKnDnXlMuric5Wfvmn7y9E03TuCick/640?wx_fmt=png&amp;amp;from=appmsg&amp;amp;watermark=1#imgIndex=10&quot; class=&quot;rich_pages wxw-img js_insertlocalimg&quot; data-ratio=&quot;0.549074074074074&quot; data-s=&quot;300,640&quot; data-type=&quot;png&quot; data-w=&quot;1080&quot; type=&quot;inline&quot; data-imgfileid=&quot;100011313&quot; data-aistatus=&quot;1&quot; data-original-style=&quot;null&quot; data-index=&quot;13&quot; src=&quot;https://mmbiz.qpic.cn/mmbiz_png/Qia51icmhYocIoqKzIhSURf2pedW4vMd8JOSjjBTSdHdC5eZD7OnJ6Vcmnscc2ULzzWazKgBkjHX2kQRmhKnDnXlMuric5Wfvmn7y9E03TuCick/640?wx_fmt=png&amp;from=appmsg&amp;tp=wxpic&amp;wxfrom=5&amp;wx_lazy=1&amp;watermark=1#imgIndex=10&quot; _width=&quot;614px&quot; style=&quot;height: auto !important; visibility: visible !important; width: 572.531px !important;&quot; alt=&quot;图片&quot; data-before-load-time=&quot;1783907975587&quot; data-report-img-idx=&quot;10&quot; data-fail=&quot;0&quot;/&gt;&lt;/section&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;box-sizing: border-box;background-color: rgb(255, 255, 255);border-top: 1px solid rgb(198, 203, 209);&quot; class=&quot;js_darkmode__306&quot;&gt;&lt;td style=&quot;box-sizing: border-box;padding: 6px 13px;border: 1px solid rgb(223, 226, 229);&quot; class=&quot;js_darkmode__307&quot;&gt;&lt;section&gt;音频播放&lt;/section&gt;&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box;padding: 6px 13px;border: 1px solid rgb(223, 226, 229);&quot; class=&quot;js_darkmode__308&quot;&gt;&lt;section&gt;&lt;img data-src=&quot;https://mmbiz.qpic.cn/mmbiz_png/Qia51icmhYocLk8xBzJyBBOKRY1iaoibicS2JciaiaHPSIf1H0HrRAwqRbziaRdSuOMoEj1uyITCKgQXceVv80XWiacH9SvGmD3Xzw0Ma63HiacpSEf4A/640?wx_fmt=png&amp;amp;from=appmsg&amp;amp;watermark=1#imgIndex=11&quot; class=&quot;rich_pages wxw-img js_insertlocalimg&quot; data-ratio=&quot;0.549074074074074&quot; data-s=&quot;300,640&quot; data-type=&quot;png&quot; data-w=&quot;1080&quot; type=&quot;inline&quot; data-imgfileid=&quot;100011314&quot; data-aistatus=&quot;1&quot; data-original-style=&quot;null&quot; data-index=&quot;14&quot; src=&quot;https://mmbiz.qpic.cn/mmbiz_png/Qia51icmhYocLk8xBzJyBBOKRY1iaoibicS2JciaiaHPSIf1H0HrRAwqRbziaRdSuOMoEj1uyITCKgQXceVv80XWiacH9SvGmD3Xzw0Ma63HiacpSEf4A/640?wx_fmt=png&amp;from=appmsg&amp;tp=wxpic&amp;wxfrom=5&amp;wx_lazy=1&amp;watermark=1#imgIndex=11&quot; _width=&quot;614px&quot; style=&quot;height: auto !important; visibility: visible !important; width: 572.531px !important;&quot; alt=&quot;图片&quot; data-before-load-time=&quot;1783907975721&quot; data-report-img-idx=&quot;11&quot; data-fail=&quot;0&quot;/&gt;&lt;/section&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;box-sizing: border-box;background-color: rgb(246, 248, 250);border-top: 1px solid rgb(198, 203, 209);&quot; class=&quot;js_darkmode__309&quot;&gt;&lt;td style=&quot;box-sizing: border-box;padding: 6px 13px;border: 1px solid rgb(223, 226, 229);&quot; class=&quot;js_darkmode__310&quot;&gt;&lt;section&gt;待办事项&lt;/section&gt;&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box;padding: 6px 13px;border: 1px solid rgb(223, 226, 229);&quot; class=&quot;js_darkmode__311&quot;&gt;&lt;section&gt;&lt;img data-src=&quot;https://mmbiz.qpic.cn/mmbiz_png/Qia51icmhYocIj24UC6EDFXuSEScPLxswzMdWE4obia32oh5HP4oHgPIkZqtsXAB2XbiccXqw58mViaATP49Uy4R1apBia4eyqxZoO2ePVcGlLEicE/640?wx_fmt=png&amp;amp;from=appmsg&amp;amp;watermark=1#imgIndex=12&quot; class=&quot;rich_pages wxw-img js_insertlocalimg&quot; data-ratio=&quot;0.549074074074074&quot; data-s=&quot;300,640&quot; data-type=&quot;png&quot; data-w=&quot;1080&quot; type=&quot;inline&quot; data-imgfileid=&quot;100011315&quot; data-aistatus=&quot;1&quot; data-original-style=&quot;null&quot; data-index=&quot;15&quot; src=&quot;https://mmbiz.qpic.cn/mmbiz_png/Qia51icmhYocIj24UC6EDFXuSEScPLxswzMdWE4obia32oh5HP4oHgPIkZqtsXAB2XbiccXqw58mViaATP49Uy4R1apBia4eyqxZoO2ePVcGlLEicE/640?wx_fmt=png&amp;from=appmsg&amp;tp=wxpic&amp;wxfrom=5&amp;wx_lazy=1&amp;watermark=1#imgIndex=12&quot; _width=&quot;614px&quot; style=&quot;height: auto !important; visibility: visible !important; width: 572.531px !important;&quot; alt=&quot;图片&quot; data-before-load-time=&quot;1783907976003&quot; data-report-img-idx=&quot;12&quot; data-fail=&quot;0&quot;/&gt;&lt;/section&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;box-sizing: border-box;background-color: rgb(255, 255, 255);border-top: 1px solid rgb(198, 203, 209);&quot; class=&quot;js_darkmode__312&quot;&gt;&lt;td style=&quot;box-sizing: border-box;padding: 6px 13px;border: 1px solid rgb(223, 226, 229);&quot; class=&quot;js_darkmode__313&quot;&gt;&lt;section&gt;终端管理&lt;/section&gt;&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box;padding: 6px 13px;border: 1px solid rgb(223, 226, 229);&quot; class=&quot;js_darkmode__314&quot;&gt;&lt;section&gt;&lt;img data-src=&quot;https://mmbiz.qpic.cn/sz_mmbiz_png/Qia51icmhYocKPRMbf0m8RChbiaz3ibT172ia5eaHNDg0Vbib1FUfSdJDLXeCL7cjrjy8Rlhuy61bR2ZZXsE8y7cx3bYk4sDLXzVshaZ5wBDfue5U/640?wx_fmt=png&amp;amp;from=appmsg&amp;amp;watermark=1#imgIndex=13&quot; class=&quot;rich_pages wxw-img js_insertlocalimg&quot; data-ratio=&quot;0.549074074074074&quot; data-s=&quot;300,640&quot; data-type=&quot;png&quot; data-w=&quot;1080&quot; type=&quot;inline&quot; data-imgfileid=&quot;100011316&quot; data-aistatus=&quot;1&quot; data-original-style=&quot;null&quot; data-index=&quot;16&quot; src=&quot;https://mmbiz.qpic.cn/sz_mmbiz_png/Qia51icmhYocKPRMbf0m8RChbiaz3ibT172ia5eaHNDg0Vbib1FUfSdJDLXeCL7cjrjy8Rlhuy61bR2ZZXsE8y7cx3bYk4sDLXzVshaZ5wBDfue5U/640?wx_fmt=png&amp;from=appmsg&amp;tp=wxpic&amp;wxfrom=5&amp;wx_lazy=1&amp;watermark=1#imgIndex=13&quot; _width=&quot;614px&quot; style=&quot;height: auto !important; visibility: visible !important; width: 572.531px !important;&quot; alt=&quot;图片&quot; data-before-load-time=&quot;1783907977699&quot; data-report-img-idx=&quot;13&quot; data-fail=&quot;0&quot;/&gt;&lt;/section&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h3 style=&quot;box-sizing: border-box;font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Helvetica, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Liberation Sans&amp;quot;, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Wenquanyi Micro Hei&amp;quot;, &amp;quot;WenQuanYi Zen Hei&amp;quot;, &amp;quot;ST Heiti&amp;quot;, SimHei, SimSun, &amp;quot;WenQuanYi Zen Hei Sharp&amp;quot;, sans-serif;line-height: 1.25;margin: 24px 0em 16px;font-weight: 600;padding: 0em;font-size: 1.25em;color: rgb(64, 72, 91);font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;&quot; class=&quot;js_darkmode__315&quot;&gt;&lt;br/&gt;&lt;/h3&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Mon, 13 Jul 2026 10:01:16 +0800</pubDate></item><item><title>C# .NET 周刊｜2026年5月2期</title><link>https://www.codepub.top/post/623.html</link><description>&lt;p style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);margin: 1.5em 8px;text-align: justify;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;text-indent: 2em;letter-spacing: 0.1em;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__2 js_darkmode__text__1&quot;&gt;&lt;strong style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-weight: bold;text-align: left;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: inherit;color: rgb(15, 76, 129);&quot; class=&quot;js_darkmode__3 js_darkmode__text__2&quot;&gt;&lt;span class=&quot;js_darkmode__text__3&quot;&gt;C# .NET 周刊｜2026年5月2期 2026-05-10 dotnet_week_26_5_2&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;h2 style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-size: 18.2px;font-weight: bold;margin: 4em auto 2em;text-align: center;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;display: table;color: rgb(255, 255, 255);background: rgb(15, 76, 129);border-radius: 8px;box-shadow: rgba(0, 0, 0, 0.1) 0px 4px 6px;&quot; class=&quot;js_darkmode__4 js_darkmode__text__4&quot;&gt;&lt;span class=&quot;js_darkmode__text__5&quot;&gt;国内文章&lt;/span&gt;&lt;/h2&gt;&lt;h3 style=&quot;box-sizing: border-box;border-width: 0px 0px 1px 4px;border-style: solid solid dashed;border-color: rgb(229, 229, 229) rgb(229, 229, 229) rgb(15, 76, 129) rgb(15, 76, 129);font-size: 16.8px;font-weight: bold;margin: 2em 8px 0.75em 0px;text-align: left;line-height: 1.2;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;padding-left: 12px;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__5 js_darkmode__text__6&quot;&gt;&lt;span class=&quot;js_darkmode__text__7&quot;&gt;OpenHarmony.Avalonia 归档事件对中国自主软件生态的影响--信任的坍塌与生态的异化&lt;/span&gt;&lt;/h3&gt;&lt;p style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);margin: 1.5em 8px;text-align: justify;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;text-indent: 2em;letter-spacing: 0.1em;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__6 js_darkmode__text__8&quot;&gt;&lt;span class=&quot;js_darkmode__text__9&quot;&gt;https://www.cnblogs.com/shanyou/p/19998663&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);margin: 1.5em 8px;text-align: justify;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;text-indent: 2em;letter-spacing: 0.1em;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__7 js_darkmode__text__10&quot;&gt;&lt;span class=&quot;js_darkmode__text__11&quot;&gt;2026年5月8日，开发者“布布”宣布 OpenHarmony-NET/OpenHarmony.Avalonia 停更并归档，引发技术圈强烈讨论。布布称他以业余身份推进 Avalonia 在鸿蒙的底层适配，并与 Avalonia 官方接触，期待官方或华为合作并获聘。布布为保护商业利益曾放缓公开发布并移至闭源仓库。后来他发现华为在与 Avalonia 洽谈同时在招标平台发布技术标书，外包公司如&lt;span class=&quot;&quot;&gt;软通动力&lt;/span&gt;中标并在招聘中寻觅 Avalonia 工程师。布布据此怀疑存在利用官方交流信息进行招标的行为。此事触发对企业诚信、开源治理和国产操作系统生态建设路径的广泛争议。&lt;/span&gt;&lt;/p&gt;&lt;h3 style=&quot;box-sizing: border-box;border-width: 0px 0px 1px 4px;border-style: solid solid dashed;border-color: rgb(229, 229, 229) rgb(229, 229, 229) rgb(15, 76, 129) rgb(15, 76, 129);font-size: 16.8px;font-weight: bold;margin: 2em 8px 0.75em 0px;text-align: left;line-height: 1.2;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;padding-left: 12px;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__8 js_darkmode__text__12&quot;&gt;&lt;span class=&quot;js_darkmode__text__13&quot;&gt;.NET 8 Web开发入门(二)：C# 现代语法速成——为 Web API 量身定制&lt;/span&gt;&lt;/h3&gt;&lt;p style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);margin: 1.5em 8px;text-align: justify;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;text-indent: 2em;letter-spacing: 0.1em;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__9 js_darkmode__text__14&quot;&gt;&lt;span class=&quot;js_darkmode__text__15&quot;&gt;https://www.cnblogs.com/shenchuanchao/p/19990124/dotnet-8-web-development-part2-modern-csharp-for-webapi&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);margin: 1.5em 8px;text-align: justify;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;text-indent: 2em;letter-spacing: 0.1em;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__10 js_darkmode__text__16&quot;&gt;&lt;span class=&quot;js_darkmode__text__17&quot;&gt;文章讲述在现代.NET 8中将 DTO 从 class 迁移到 record，展示 record 的构造、不变性、值相等性与 with 用法。文章强调异步编程(async/await)对提升 Web 并发的关键性，并用餐厅类比解释同步阻塞的问题。示例直观且实用。文章技术深度中等，原创性一般，缺少引用，个别章节未完整展开。&lt;/span&gt;&lt;/p&gt;&lt;h3 style=&quot;box-sizing: border-box;border-width: 0px 0px 1px 4px;border-style: solid solid dashed;border-color: rgb(229, 229, 229) rgb(229, 229, 229) rgb(15, 76, 129) rgb(15, 76, 129);font-size: 16.8px;font-weight: bold;margin: 2em 8px 0.75em 0px;text-align: left;line-height: 1.2;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;padding-left: 12px;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__11 js_darkmode__text__18&quot;&gt;&lt;span class=&quot;js_darkmode__text__19&quot;&gt;记一次 .NET 某智慧工厂视觉程序 崩溃分析&lt;/span&gt;&lt;/h3&gt;&lt;p style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);margin: 1.5em 8px;text-align: justify;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;text-indent: 2em;letter-spacing: 0.1em;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__12 js_darkmode__text__20&quot;&gt;&lt;span class=&quot;js_darkmode__text__21&quot;&gt;https://www.cnblogs.com/huangxincheng/p/19980635&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);margin: 1.5em 8px;text-align: justify;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;text-indent: 2em;letter-spacing: 0.1em;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__13 js_darkmode__text__22&quot;&gt;&lt;span class=&quot;js_darkmode__text__23&quot;&gt;文章记录作者用 &lt;span class=&quot;&quot;&gt;WinDbg&lt;/span&gt; 分析 .NET 程序崩溃的过程。作者提供 dump 输出，显示 CLR 异常 e0434352 和 System.Reflection.TargetInvocationException。作者用 !t 查看线程与托管异常，用 !pe -nested 展开异常链。示例真实，步骤可复现，适合有调试基础的读者。文章实践性强但细节与解决步骤不足，引用缺乏。&lt;/span&gt;&lt;/p&gt;&lt;h3 style=&quot;box-sizing: border-box;border-width: 0px 0px 1px 4px;border-style: solid solid dashed;border-color: rgb(229, 229, 229) rgb(229, 229, 229) rgb(15, 76, 129) rgb(15, 76, 129);font-size: 16.8px;font-weight: bold;margin: 2em 8px 0.75em 0px;text-align: left;line-height: 1.2;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;padding-left: 12px;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__14 js_darkmode__text__24&quot;&gt;&lt;span class=&quot;js_darkmode__text__25&quot;&gt;【EF Core】&lt;span class=&quot;&quot;&gt;值转换器&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);margin: 1.5em 8px;text-align: justify;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;text-indent: 2em;letter-spacing: 0.1em;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__15 js_darkmode__text__26&quot;&gt;&lt;span class=&quot;js_darkmode__text__27&quot;&gt;https://www.cnblogs.com/tcjiaan/p/19966652&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);margin: 1.5em 8px;text-align: justify;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;text-indent: 2em;letter-spacing: 0.1em;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__16 js_darkmode__text__28&quot;&gt;&lt;span class=&quot;js_darkmode__text__29&quot;&gt;作者开篇提及近况和裁员观察，认为多数裁员与 AI 无关。正文介绍 EF Core 值转换器的概念与用途。文章区分两种值：Provider(数据库映射到 .NET 的类型)与 Model(实体属性类型)。当二者不一致时需要值转换器。文中举例说明枚举与数据库字符串互转，以及将自定义 Point 结构序列化为“100,85”字符串保存并还原的场景。文章还提供了建表脚本和部分 C# 实体代码示例。技术性为入门到中级，注重实用示例，未见引用说明来源。&lt;/span&gt;&lt;/p&gt;&lt;h3 style=&quot;box-sizing: border-box;border-width: 0px 0px 1px 4px;border-style: solid solid dashed;border-color: rgb(229, 229, 229) rgb(229, 229, 229) rgb(15, 76, 129) rgb(15, 76, 129);font-size: 16.8px;font-weight: bold;margin: 2em 8px 0.75em 0px;text-align: left;line-height: 1.2;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;padding-left: 12px;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__17 js_darkmode__text__30&quot;&gt;&lt;span class=&quot;js_darkmode__text__31&quot;&gt;.NET 10 使用 Microsoft.AspNetCore.OpenApi 实现 API 版本管理&lt;/span&gt;&lt;/h3&gt;&lt;p style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);margin: 1.5em 8px;text-align: justify;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;text-indent: 2em;letter-spacing: 0.1em;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__18 js_darkmode__text__32&quot;&gt;&lt;span class=&quot;js_darkmode__text__33&quot;&gt;https://www.cnblogs.com/denglei1024/p/19975811&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);margin: 1.5em 8px;text-align: justify;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;text-indent: 2em;letter-spacing: 0.1em;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__19 js_darkmode__text__34&quot;&gt;&lt;span class=&quot;js_darkmode__text__35&quot;&gt;文章说明 API 版本管理的重要性，目标是在不破坏现有用户的前提下持续迭代。列举了 URL 路径、查询参数、请求头和媒体类型四种常见策略。指出在 C# 生态中长期用 Swashbuckle 配合 Asp.Versioning，而 .NET 10 推出 Microsoft.AspNetCore.OpenApi，且 Asp.Versioning v10 已支持该库，实现版本管理与文档生成的无缝结合。给出需安装的 NuGet 包列表并示例 Program.cs 配置流程：AddApiVersioning、AddApiExplorer、为每个版本 AddOpenApi、MapOpenApi 和 MapScalarApiReference。示例展示为每个版本生成独立 OpenAPI 文档，并在路由中通过 apiVersion 指定版本，但控制器示例未完整展开。&lt;/span&gt;&lt;/p&gt;&lt;h3 style=&quot;box-sizing: border-box;border-width: 0px 0px 1px 4px;border-style: solid solid dashed;border-color: rgb(229, 229, 229) rgb(229, 229, 229) rgb(15, 76, 129) rgb(15, 76, 129);font-size: 16.8px;font-weight: bold;margin: 2em 8px 0.75em 0px;text-align: left;line-height: 1.2;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;padding-left: 12px;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__20 js_darkmode__text__36&quot;&gt;&lt;span class=&quot;js_darkmode__text__37&quot;&gt;C# 也能像 Python 一样写脚本 | .NET 10 构建基于文件的应用&lt;/span&gt;&lt;/h3&gt;&lt;p style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);margin: 1.5em 8px;text-align: justify;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;text-indent: 2em;letter-spacing: 0.1em;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__21 js_darkmode__text__38&quot;&gt;&lt;span class=&quot;js_darkmode__text__39&quot;&gt;https://www.cnblogs.com/denglei1024/p/19979190&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);margin: 1.5em 8px;text-align: justify;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;text-indent: 2em;letter-spacing: 0.1em;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__22 js_darkmode__text__40&quot;&gt;&lt;span class=&quot;js_darkmode__text__41&quot;&gt;文章介绍 .NET 10 的基于文件的应用功能。开发者可在单个 .cs 文件中编写、运行和构建应用，适合快速原型、脚本和小型工具。需要安装 .NET 10 SDK。文中给出两个示例：一个显示当前日期，另一个用 CsvHelper 处理销售数据并生成 CSV。说明了 #:package、#:property、#:sdk、#:reference、#:project 等指令用法及版本写法，并展示 dotnet run &amp;lt;file.cs&amp;gt; 等 CLI 命令。文章实用清晰，但缺少引用和更深入的性能或限制分析。&lt;/span&gt;&lt;/p&gt;&lt;h3 style=&quot;box-sizing: border-box;border-width: 0px 0px 1px 4px;border-style: solid solid dashed;border-color: rgb(229, 229, 229) rgb(229, 229, 229) rgb(15, 76, 129) rgb(15, 76, 129);font-size: 16.8px;font-weight: bold;margin: 2em 8px 0.75em 0px;text-align: left;line-height: 1.2;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;padding-left: 12px;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__23 js_darkmode__text__42&quot;&gt;&lt;span class=&quot;js_darkmode__text__43&quot;&gt;OpenClaw.NET .NET 原生插件开发完全指南：以 Mempalace 插件为范例&lt;/span&gt;&lt;/h3&gt;&lt;p style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);margin: 1.5em 8px;text-align: justify;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;text-indent: 2em;letter-spacing: 0.1em;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__24 js_darkmode__text__44&quot;&gt;&lt;span class=&quot;js_darkmode__text__45&quot;&gt;https://www.cnblogs.com/shanyou/p/19974437&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);margin: 1.5em 8px;text-align: justify;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;text-indent: 2em;letter-spacing: 0.1em;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__25 js_darkmode__text__46&quot;&gt;&lt;span class=&quot;js_darkmode__text__47&quot;&gt;文章介绍 OpenClaw.NET，一个用 C&lt;a class=&quot;wx_topic_link js_darkmode__text__48&quot; style=&quot;color: #576B95 !important;&quot; data-topic=&quot;1&quot; data-recommend=&quot;&quot;&gt;#13&lt;/a&gt;&amp;nbsp;从零构建的独立 &lt;span class=&quot;&quot;&gt;AI Agent&lt;/span&gt; 网关与运行时。项目以 NativeAOT 为核心设计以实现毫秒级冷启动和低内存占用。默认以本地 AOT 模式在回环地址 18789 运行，插件以内进程方式加载以换取性能。框架支持多种插件加载模式并允许标记为仅 JIT 的插件以兼顾扩展性。为兼容 OpenClaw 生态，采用语义兼容的插件契约和配置，并利用 Microsoft.Extensions.AI 与依赖注入实现与 &lt;span class=&quot;&quot;&gt;LLM&lt;/span&gt; 提供商的集成。插件承担模型接入、消息通道、工具、记忆和后台服务等核心职责，记忆采用独占插槽策略。&lt;/span&gt;&lt;/p&gt;&lt;h3 style=&quot;box-sizing: border-box;border-width: 0px 0px 1px 4px;border-style: solid solid dashed;border-color: rgb(229, 229, 229) rgb(229, 229, 229) rgb(15, 76, 129) rgb(15, 76, 129);font-size: 16.8px;font-weight: bold;margin: 2em 8px 0.75em 0px;text-align: left;line-height: 1.2;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;padding-left: 12px;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__26 js_darkmode__text__49&quot;&gt;&lt;span class=&quot;js_darkmode__text__50&quot;&gt;.NET 8 Web开发入门(一)：启程——.NET生态全景与开发环境构建&lt;/span&gt;&lt;/h3&gt;&lt;p style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);margin: 1.5em 8px;text-align: justify;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;text-indent: 2em;letter-spacing: 0.1em;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__27 js_darkmode__text__51&quot;&gt;&lt;span class=&quot;js_darkmode__text__52&quot;&gt;https://www.cnblogs.com/shenchuanchao/p/19972855/dotnet-8-web-development-part1-ecosystem-setup&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);margin: 1.5em 8px;text-align: justify;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;text-indent: 2em;letter-spacing: 0.1em;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__28 js_darkmode__text__53&quot;&gt;&lt;span class=&quot;js_darkmode__text__54&quot;&gt;.NET 8 是LTS版本，具备跨平台、高性能与统一生态。作者纠正了“.NET很老”的误解，指出其可在Linux和macOS上稳定运行并在基准测试中表现优异。文章分解技术栈：CLR 负责将IL即时编译并管理垃圾回收，BCL 提供丰富基础库，SDK 包含运行时、编译器与CLI。文中区分了Runtime与SDK的安装用途并提示常见部署错误。作者回顾了从.NET Framework到.NET Core再到.NET 5+的演进。最后给出安装.NET 8 SDK并用 dotnet --info 验证的实操步骤。&lt;/span&gt;&lt;/p&gt;&lt;h3 style=&quot;box-sizing: border-box;border-width: 0px 0px 1px 4px;border-style: solid solid dashed;border-color: rgb(229, 229, 229) rgb(229, 229, 229) rgb(15, 76, 129) rgb(15, 76, 129);font-size: 16.8px;font-weight: bold;margin: 2em 8px 0.75em 0px;text-align: left;line-height: 1.2;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;padding-left: 12px;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__29 js_darkmode__text__55&quot;&gt;&lt;span class=&quot;js_darkmode__text__56&quot;&gt;.NET+AI | Harness | MAF 1.4 发布，Harness Engineering 如约而至，智能体工程化更进一步&lt;/span&gt;&lt;/h3&gt;&lt;p style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);margin: 1.5em 8px;text-align: justify;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;text-indent: 2em;letter-spacing: 0.1em;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__30 js_darkmode__text__57&quot;&gt;&lt;span class=&quot;js_darkmode__text__58&quot;&gt;https://www.cnblogs.com/sheng-jie/p/19995466&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);margin: 1.5em 8px;text-align: justify;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;text-indent: 2em;letter-spacing: 0.1em;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__31 js_darkmode__text__59&quot;&gt;&lt;span class=&quot;js_darkmode__text__60&quot;&gt;文章将 Harness Engineering 定义为模型外的可执行脚手架，强调四要素：有输入、有步骤、有验收、有兜底。文章指出 Harness 解决任务接入、任务拆解、状态管理、环境安全、长上下文收敛与失败恢复等工程问题。作者认为 MAF 1.4 把 Harness 提升为运行时控制面，推动智能体开发从能力拼装走向工程化。文章区分 Skills(能力包)与 Harness(执行治理)，并拟用简单的 .NET 示例说明 Harness 的实际价值。&lt;/span&gt;&lt;/p&gt;&lt;h3 style=&quot;box-sizing: border-box;border-width: 0px 0px 1px 4px;border-style: solid solid dashed;border-color: rgb(229, 229, 229) rgb(229, 229, 229) rgb(15, 76, 129) rgb(15, 76, 129);font-size: 16.8px;font-weight: bold;margin: 2em 8px 0.75em 0px;text-align: left;line-height: 1.2;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;padding-left: 12px;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__32 js_darkmode__text__61&quot;&gt;&lt;span class=&quot;js_darkmode__text__62&quot;&gt;基于AScript的python3脚本语言发布啦！&lt;/span&gt;&lt;/h3&gt;&lt;p style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);margin: 1.5em 8px;text-align: justify;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;text-indent: 2em;letter-spacing: 0.1em;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__33 js_darkmode__text__63&quot;&gt;&lt;span class=&quot;js_darkmode__text__64&quot;&gt;https://www.cnblogs.com/rockey627/p/19971851&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);margin: 1.5em 8px;text-align: justify;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;text-indent: 2em;letter-spacing: 0.1em;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__34 js_darkmode__text__65&quot;&gt;&lt;span class=&quot;js_darkmode__text__66&quot;&gt;AScript是开源C&lt;a class=&quot;wx_topic_link js_darkmode__text__67&quot; style=&quot;color: #576B95 !important;&quot; data-topic=&quot;1&quot; data-recommend=&quot;&quot;&gt;#动态脚本引擎&lt;/a&gt;，2026-05-04发布AScript.Lang.Python3 0.0.1。它支持Python3基础语法、主要数据类型、函数、列表/集合/字典操作，以及字符串插值和切片。文中提供NuGet安装命令和丰富的C&lt;a class=&quot;wx_topic_link js_darkmode__text__68&quot; style=&quot;color: #576B95 !important;&quot; data-topic=&quot;1&quot; data-recommend=&quot;&quot;&gt;#示例&lt;/a&gt;，示范注册语言、上下文指定、@lang嵌入与集合行为。技术深度中等，覆盖基础特性但缺少高级互操作与安全细节。实用性高，示例可直接运行。表达清晰，可读性好。原创性一般，时效性佳，但缺乏引用与性能评估。总体评价良好。&lt;/span&gt;&lt;/p&gt;&lt;h3 style=&quot;box-sizing: border-box;border-width: 0px 0px 1px 4px;border-style: solid solid dashed;border-color: rgb(229, 229, 229) rgb(229, 229, 229) rgb(15, 76, 129) rgb(15, 76, 129);font-size: 16.8px;font-weight: bold;margin: 2em 8px 0.75em 0px;text-align: left;line-height: 1.2;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;padding-left: 12px;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__35 js_darkmode__text__69&quot;&gt;&lt;span class=&quot;js_darkmode__text__70&quot;&gt;C# SwaggerLoginAuthPlugin 一款给Swagger文档加登录页面的小插件&lt;/span&gt;&lt;/h3&gt;&lt;p style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);margin: 1.5em 8px;text-align: justify;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;text-indent: 2em;letter-spacing: 0.1em;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__36 js_darkmode__text__71&quot;&gt;&lt;span class=&quot;js_darkmode__text__72&quot;&gt;https://www.cnblogs.com/zhangboyan/p/20001532&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);margin: 1.5em 8px;text-align: justify;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;text-indent: 2em;letter-spacing: 0.1em;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__37 js_darkmode__text__73&quot;&gt;&lt;span class=&quot;js_darkmode__text__74&quot;&gt;文章介绍一款用于局域网限制Swagger查看权限的小插件。作者提供NuGet包和示例代码，说明在非最小API的Web API项目中通过 builder.Services.AddSwaggerAuth 配置默认用户名密码，并在 UseSwagger 前调用 app.UseSwaggerAuth 实现拦截。作者提醒插件仅适合内网使用并给出开源仓库地址。插件由作者借助 deepseek 和 AI 在约2小时内开发，功能简单实用但技术细节和安全说明有限，适合项目组快速加固Swagger访问控制。&lt;/span&gt;&lt;/p&gt;&lt;h3 style=&quot;box-sizing: border-box;border-width: 0px 0px 1px 4px;border-style: solid solid dashed;border-color: rgb(229, 229, 229) rgb(229, 229, 229) rgb(15, 76, 129) rgb(15, 76, 129);font-size: 16.8px;font-weight: bold;margin: 2em 8px 0.75em 0px;text-align: left;line-height: 1.2;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;padding-left: 12px;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__38 js_darkmode__text__75&quot;&gt;&lt;span class=&quot;js_darkmode__text__76&quot;&gt;.NET生态系统中的A2A(Agent-to-Agent)协议支持与跨平台多智能体协同&lt;/span&gt;&lt;/h3&gt;&lt;p style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);margin: 1.5em 8px;text-align: justify;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;text-indent: 2em;letter-spacing: 0.1em;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__39 js_darkmode__text__77&quot;&gt;&lt;span class=&quot;js_darkmode__text__78&quot;&gt;https://www.cnblogs.com/shanyou/p/19974558/dotnet-a2a&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);margin: 1.5em 8px;text-align: justify;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;text-indent: 2em;letter-spacing: 0.1em;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__40 js_darkmode__text__79&quot;&gt;&lt;span class=&quot;js_darkmode__text__80&quot;&gt;文章论述从单一大语言模型向分布式多智能体的架构演进。提出A2A v1.0作为跨智能体互操作性标准，基于HTTP+JSON与JSON-RPC 2.0，并通过SSE支持流式传输。引入Agent Card实现发现优先机制，声明身份、能力、数据模式与认证。将交互建模为有状态的Task，消息由多种Parts(TextPart、FilePart、DataPart)构成，输出为可被下游消费的Artifact。重点评估.NET生态对A2A的采用与实现路径，列举Microsoft Agent Framework、BotSharp(PR 1345)与OpenClaw.NET(PR 90)的具体集成与安全、NativeAOT等优化。文章技术深度高且面向企业实用场景。&lt;/span&gt;&lt;/p&gt;&lt;h3 style=&quot;box-sizing: border-box;border-width: 0px 0px 1px 4px;border-style: solid solid dashed;border-color: rgb(229, 229, 229) rgb(229, 229, 229) rgb(15, 76, 129) rgb(15, 76, 129);font-size: 16.8px;font-weight: bold;margin: 2em 8px 0.75em 0px;text-align: left;line-height: 1.2;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;padding-left: 12px;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__41 js_darkmode__text__81&quot;&gt;&lt;span class=&quot;js_darkmode__text__82&quot;&gt;一款基于 C# 开发的 Windows 10/11 系统增强工具，精简、优化、定制一站完成！&lt;/span&gt;&lt;/h3&gt;&lt;p style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);margin: 1.5em 8px;text-align: justify;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;text-indent: 2em;letter-spacing: 0.1em;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__42 js_darkmode__text__83&quot;&gt;&lt;span class=&quot;js_darkmode__text__84&quot;&gt;https://www.cnblogs.com/Can-daydayup/p/20007914&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);margin: 1.5em 8px;text-align: justify;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;text-indent: 2em;letter-spacing: 0.1em;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__43 js_darkmode__text__85&quot;&gt;&lt;span class=&quot;js_darkmode__text__86&quot;&gt;Winhance 是一款基于 C# 的开源 Windows 10/11 系统增强工具。它以图形界面整合应用管理、系统优化、隐私设置、界面定制、常用软件安装、配置导入导出和自定义 ISO 制作等功能。适合新机初始化、系统重装后快速恢复和日常优化维护。核心模块包括软件管理(移除/安装应用、WinGet 支持)、系统优化(隐私、性能、更新、通知等)、界面定制和高级工具(生成 autounattend.xml)。项目托管在 GitHub，并已收录于 C#/.NET 项目精选，便于开发者参考和贡献。&lt;/span&gt;&lt;/p&gt;&lt;h3 style=&quot;box-sizing: border-box;border-width: 0px 0px 1px 4px;border-style: solid solid dashed;border-color: rgb(229, 229, 229) rgb(229, 229, 229) rgb(15, 76, 129) rgb(15, 76, 129);font-size: 16.8px;font-weight: bold;margin: 2em 8px 0.75em 0px;text-align: left;line-height: 1.2;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;padding-left: 12px;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__44 js_darkmode__text__87&quot;&gt;&lt;span class=&quot;js_darkmode__text__88&quot;&gt;Memgraph 与 Neo4j 图数据库对比及 .NET 生态适配分析&lt;/span&gt;&lt;/h3&gt;&lt;p style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);margin: 1.5em 8px;text-align: justify;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;text-indent: 2em;letter-spacing: 0.1em;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__45 js_darkmode__text__89&quot;&gt;&lt;span class=&quot;js_darkmode__text__90&quot;&gt;https://www.cnblogs.com/shanyou/p/19976092/neo4jvsmemgraph&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);margin: 1.5em 8px;text-align: justify;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;text-indent: 2em;letter-spacing: 0.1em;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__46 js_darkmode__text__91&quot;&gt;&lt;span class=&quot;js_darkmode__text__92&quot;&gt;文章比较 Memgraph 与 Neo4j 在设计哲学、实现语言、存储模型、事务一致性、索引策略、查询兼容性和 .NET 生态适配上的差异。Neo4j 基于 Java、磁盘优先、采用 Index-Free Adjacency、保持 ACID 强一致并拥有成熟的 .NET 工具链。Memgraph 基于 C++、内存优先、提供亚毫秒延迟和高吞吐、兼容 openCypher 与 Bolt、采用 BSL 许可并提供可选的分析模式以换取吞吐。文章引用实测数据比较内存占用、延迟和持久化差异，并指出对于万级节点的读分析场景优先选 Neo4j，对于实时增量更新和高吞吐写入优先选 Memgraph。&lt;/span&gt;&lt;/p&gt;&lt;h3 style=&quot;box-sizing: border-box;border-width: 0px 0px 1px 4px;border-style: solid solid dashed;border-color: rgb(229, 229, 229) rgb(229, 229, 229) rgb(15, 76, 129) rgb(15, 76, 129);font-size: 16.8px;font-weight: bold;margin: 2em 8px 0.75em 0px;text-align: left;line-height: 1.2;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;padding-left: 12px;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__47 js_darkmode__text__93&quot;&gt;&lt;span class=&quot;js_darkmode__text__94&quot;&gt;AScript中一个很有意思的语法&lt;/span&gt;&lt;/h3&gt;&lt;p style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);margin: 1.5em 8px;text-align: justify;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;text-indent: 2em;letter-spacing: 0.1em;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__48 js_darkmode__text__95&quot;&gt;&lt;span class=&quot;js_darkmode__text__96&quot;&gt;https://www.cnblogs.com/rockey627/p/19998021&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);margin: 1.5em 8px;text-align: justify;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;text-indent: 2em;letter-spacing: 0.1em;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__49 js_darkmode__text__97&quot;&gt;&lt;span class=&quot;js_darkmode__text__98&quot;&gt;文章介绍AScript开源C&lt;a class=&quot;wx_topic_link js_darkmode__text__99&quot; style=&quot;color: #576B95 !important;&quot; data-topic=&quot;1&quot; data-recommend=&quot;&quot;&gt;#动态脚本引擎的static语法&lt;/a&gt;。解析执行模式下，static语句与普通语句等效；编译执行模式下，static语句在编译期执行并返回结果，static内定义的变量在脚本执行前已计算。通过示例展示static在eval函数中用于预拼接表达式，以及在编译委托中用于初始化配置。最后给出StaticTokenHandler实现片段以说明实现原理。&lt;/span&gt;&lt;/p&gt;&lt;h3 style=&quot;box-sizing: border-box;border-width: 0px 0px 1px 4px;border-style: solid solid dashed;border-color: rgb(229, 229, 229) rgb(229, 229, 229) rgb(15, 76, 129) rgb(15, 76, 129);font-size: 16.8px;font-weight: bold;margin: 2em 8px 0.75em 0px;text-align: left;line-height: 1.2;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;padding-left: 12px;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__50 js_darkmode__text__100&quot;&gt;&lt;span class=&quot;js_darkmode__text__101&quot;&gt;OpenClaw.NET 外部 CLI 连接器 (External CLI Connectors) 详细技术总结&lt;/span&gt;&lt;/h3&gt;&lt;p style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);margin: 1.5em 8px;text-align: justify;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;text-indent: 2em;letter-spacing: 0.1em;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__51 js_darkmode__text__102&quot;&gt;&lt;span class=&quot;js_darkmode__text__103&quot;&gt;https://www.cnblogs.com/shanyou/p/20009085&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);margin: 1.5em 8px;text-align: justify;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;text-indent: 2em;letter-spacing: 0.1em;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__52 js_darkmode__text__104&quot;&gt;&lt;span class=&quot;js_darkmode__text__105&quot;&gt;本文介绍 OpenClaw.NET 的 External CLI Connectors，封装官方平台 CLI 为 AI Agent 可控工具。设计默认禁用，不接受自由命令，只允许预配置具名命令。安全采用多层防护：命名命令白名单、风险评分、dry-run 预览、审批流程、脱敏、超时限制和审计日志。Agent 通过指定连接器名、命令名和命名参数调用，运行时将参数展开为 ProcessStartInfo.ArgumentList，不经 Shell。文档列出顶层配置和连接器示例，关键默认值包括 Enabled=false、AllowFreeformCommands=false、RequireApprovalForMutatingCommands=true、RiskLevel=high、ReadOnly=false。&lt;/span&gt;&lt;/p&gt;&lt;h3 style=&quot;box-sizing: border-box;border-width: 0px 0px 1px 4px;border-style: solid solid dashed;border-color: rgb(229, 229, 229) rgb(229, 229, 229) rgb(15, 76, 129) rgb(15, 76, 129);font-size: 16.8px;font-weight: bold;margin: 2em 8px 0.75em 0px;text-align: left;line-height: 1.2;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;padding-left: 12px;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__53 js_darkmode__text__106&quot;&gt;&lt;span class=&quot;js_darkmode__text__107&quot;&gt;【EF Core】使用自定义的值比较器&lt;/span&gt;&lt;/h3&gt;&lt;p style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);margin: 1.5em 8px;text-align: justify;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;text-indent: 2em;letter-spacing: 0.1em;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__54 js_darkmode__text__108&quot;&gt;&lt;span class=&quot;js_darkmode__text__109&quot;&gt;https://www.cnblogs.com/tcjiaan/p/20008424&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);margin: 1.5em 8px;text-align: justify;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;text-indent: 2em;letter-spacing: 0.1em;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__55 js_darkmode__text__110&quot;&gt;&lt;span class=&quot;js_darkmode__text__111&quot;&gt;文章讨论 EF Core 的值比较器问题。默认比较器按值比较，但有时不同格式表示同一含义。以 Company.Phone 为例，固话可写成 (010)88988989 或 010-88988989，默认比较器会误判为不同。作者介绍通过继承 ValueComparer&lt;/span&gt;&lt;span class=&quot;js_darkmode__text__113&quot;&gt;&amp;nbsp;自定义比较器。需要提供三种委托：相等判断、哈希计算与快照创建。示例通过正则解析区号与号码，重写相等与哈希逻辑，快照可用内置实现，从而实现语义相等比较并避免错误的状态变更检测。&lt;/span&gt;&lt;/p&gt;&lt;h3 style=&quot;box-sizing: border-box;border-width: 0px 0px 1px 4px;border-style: solid solid dashed;border-color: rgb(229, 229, 229) rgb(229, 229, 229) rgb(15, 76, 129) rgb(15, 76, 129);font-size: 16.8px;font-weight: bold;margin: 2em 8px 0.75em 0px;text-align: left;line-height: 1.2;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;padding-left: 12px;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__57 js_darkmode__text__114&quot;&gt;&lt;span class=&quot;js_darkmode__text__115&quot;&gt;我的开源项目分享-基于SharpBrowser二次开发的定制浏览器，过程中填坑无数&lt;/span&gt;&lt;/h3&gt;&lt;p style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);margin: 1.5em 8px;text-align: justify;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;text-indent: 2em;letter-spacing: 0.1em;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__58 js_darkmode__text__116&quot;&gt;&lt;span class=&quot;js_darkmode__text__117&quot;&gt;https://www.cnblogs.com/rrooyy/p/19995607&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);margin: 1.5em 8px;text-align: justify;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;text-indent: 2em;letter-spacing: 0.1em;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__59 js_darkmode__text__118&quot;&gt;&lt;span class=&quot;js_darkmode__text__119&quot;&gt;为满足仅允许固定电脑登录的安全需求，作者定制浏览器。每个请求头加入设备ID，由服务器校验。项目基于C&lt;a class=&quot;wx_topic_link js_darkmode__text__120&quot; style=&quot;color: #576B95 !important;&quot; data-topic=&quot;1&quot; data-recommend=&quot;&quot;&gt;#开源SharpBrowser&lt;/a&gt;。作者发现多个缺陷。包括不支持alert/prompt/confirm、window.open无返回、下载页面日期与排序错误及CEF不支持H.264。作者修正安装脚本路径、内置存储位置、下载日期显示及window.open返回值。作者新增中文界面、打开文件夹功能、公司打印管理器自定义协议、设备ID与设备密钥设置。对不支持H.264的视频，选择上传时自动转换为webm。构建需自行放置ffmpeg.exe于src\bin\net8.0-windows，安装包用Inno Setup并加中文语言包。&lt;/span&gt;&lt;/p&gt;&lt;h3 style=&quot;box-sizing: border-box;border-width: 0px 0px 1px 4px;border-style: solid solid dashed;border-color: rgb(229, 229, 229) rgb(229, 229, 229) rgb(15, 76, 129) rgb(15, 76, 129);font-size: 16.8px;font-weight: bold;margin: 2em 8px 0.75em 0px;text-align: left;line-height: 1.2;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;padding-left: 12px;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__60 js_darkmode__text__121&quot;&gt;&lt;span class=&quot;js_darkmode__text__122&quot;&gt;【译】Azure MCP 工具现已内置集成至 Visual Studio 2022，无需额外安装扩展&lt;/span&gt;&lt;/h3&gt;&lt;p style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);margin: 1.5em 8px;text-align: justify;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;text-indent: 2em;letter-spacing: 0.1em;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__61 js_darkmode__text__123&quot;&gt;&lt;span class=&quot;js_darkmode__text__124&quot;&gt;https://www.cnblogs.com/MeteorSeed/p/19979206&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);margin: 1.5em 8px;text-align: justify;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;text-indent: 2em;letter-spacing: 0.1em;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__62 js_darkmode__text__125&quot;&gt;&lt;span class=&quot;js_darkmode__text__126&quot;&gt;文章说明Azure MCP工具已内置于Visual Studio 2022的Azure开发工作负载(自17.14.30起)，无需单独安装扩展。作者指出内置后可避免扩展兼容性问题并随VS统一更新，但Visual Studio 2026独有功能不包含在2022中。Azure MCP通过GitHub Copilot Chat提供覆盖45项Azure服务的230余种工具。示例包括列出订阅中的存储账户、将ASP.NET Core应用通过azd部署到Azure、使用AppLens诊断应用服务和在Log Analytics中运行KQL查询。工具默认禁用，需在IDE中手动启用即可在所有会话中持续使用。&lt;/span&gt;&lt;/p&gt;&lt;h3 style=&quot;box-sizing: border-box;border-width: 0px 0px 1px 4px;border-style: solid solid dashed;border-color: rgb(229, 229, 229) rgb(229, 229, 229) rgb(15, 76, 129) rgb(15, 76, 129);font-size: 16.8px;font-weight: bold;margin: 2em 8px 0.75em 0px;text-align: left;line-height: 1.2;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;padding-left: 12px;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__63 js_darkmode__text__127&quot;&gt;&lt;span class=&quot;js_darkmode__text__128&quot;&gt;CsGrafeq: 比 Desmos 更“能折腾”的几何函数画板(.NET + Avalonia)&lt;/span&gt;&lt;/h3&gt;&lt;p style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);margin: 1.5em 8px;text-align: justify;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;text-indent: 2em;letter-spacing: 0.1em;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__64 js_darkmode__text__129&quot;&gt;&lt;span class=&quot;js_darkmode__text__130&quot;&gt;https://www.cnblogs.com/StuLittleLi/p/20005397&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);margin: 1.5em 8px;text-align: justify;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;text-indent: 2em;letter-spacing: 0.1em;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__65 js_darkmode__text__131&quot;&gt;&lt;span class=&quot;js_darkmode__text__132&quot;&gt;CsGrafeq 是一款由高中生开发的跨平台几何草图與隐函数作图工具。它支持点、线、圆等几何构造与拖拽交互，能高质量绘制隐函数 f(x,y)=0 的图像。项目基于 .NET 与 Avalonia，强调即时交互与易用性，适合学习、验证与探索数学问题。作者说明了开发动机、功能场景與跨平台优势，并开源在 GitHub，欢迎 Issue 与 PR。文章实用性与可玩性强，但技术实现细节与引用较少。&lt;/span&gt;&lt;/p&gt;&lt;h3 style=&quot;box-sizing: border-box;border-width: 0px 0px 1px 4px;border-style: solid solid dashed;border-color: rgb(229, 229, 229) rgb(229, 229, 229) rgb(15, 76, 129) rgb(15, 76, 129);font-size: 16.8px;font-weight: bold;margin: 2em 8px 0.75em 0px;text-align: left;line-height: 1.2;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;padding-left: 12px;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__66 js_darkmode__text__133&quot;&gt;&lt;span class=&quot;js_darkmode__text__134&quot;&gt;【译】TypeScript 7 测试版已在 Visual Studio 2026 18.6 Insiders 3 中默认启用&lt;/span&gt;&lt;/h3&gt;&lt;p style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);margin: 1.5em 8px;text-align: justify;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;text-indent: 2em;letter-spacing: 0.1em;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__67 js_darkmode__text__135&quot;&gt;&lt;span class=&quot;js_darkmode__text__136&quot;&gt;https://www.cnblogs.com/MeteorSeed/p/19996925&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);margin: 1.5em 8px;text-align: justify;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;text-indent: 2em;letter-spacing: 0.1em;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__68 js_darkmode__text__137&quot;&gt;&lt;span class=&quot;js_darkmode__text__138&quot;&gt;Visual Studio 2026 18.6 预览版3 将内置 TypeScript SDK 升级为 TypeScript 7 Beta 原生预览版。该更新影响使用内置 SDK 的所有项目，包括 TypeScript 项目和使用 npm 的 ASP.NET Core 项目。TypeScript 7 带来原生执行和共享内存并行处理，编译速度最高提升约 10 倍，内存占用显著下降，项目加载和语言服务响应约提升 8 倍。编辑体验的智能感知、查找引用、转到定义和错误诊断均明显加速。若需使用其他版本，可在项目中安装 typescript@^6.0.0 或 @typescript/native-preview@beta，Visual Studio 优先使用本地 node_modules。可在 Tools &amp;gt; Options &amp;gt; Preview Features 中禁用原生预览。文末列出若干正在修复的已知问题。&lt;/span&gt;&lt;/p&gt;&lt;hr style=&quot;box-sizing: border-box;border-width: medium;border-style: none;border-color: currentcolor;height: 1px;color: inherit;margin: 2em 0px;text-align: left;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;transform-origin: 0px 0px;transform: scale(1, 0.5);border-image: none;background: linear-gradient(to right, rgba(0, 0, 0, 0), rgba(0, 0, 0, 0.1), rgba(0, 0, 0, 0));&quot; class=&quot;js_darkmode__bg__0&quot;/&gt;&lt;h2 style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-size: 18.2px;font-weight: bold;margin: 4em auto 2em;text-align: center;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;display: table;padding: 0.3em 1em;color: rgb(255, 255, 255);background: rgb(15, 76, 129);border-radius: 8px;box-shadow: rgba(0, 0, 0, 0.1) 0px 4px 6px;&quot; class=&quot;js_darkmode__69 js_darkmode__text__139&quot;&gt;&lt;span class=&quot;js_darkmode__text__140&quot;&gt;国际周报&lt;/span&gt;&lt;/h2&gt;&lt;h2 style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-size: 18.2px;font-weight: bold;margin: 4em auto 2em;text-align: center;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;display: table;padding: 0.3em 1em;color: rgb(255, 255, 255);background: rgb(15, 76, 129);border-radius: 8px;box-shadow: rgba(0, 0, 0, 0.1) 0px 4px 6px;&quot; class=&quot;js_darkmode__70 js_darkmode__text__141&quot;&gt;&lt;span class=&quot;js_darkmode__text__142&quot;&gt;话题&lt;/span&gt;&lt;/h2&gt;&lt;h3 style=&quot;box-sizing: border-box;border-width: 0px 0px 1px 4px;border-style: solid solid dashed;border-color: rgb(229, 229, 229) rgb(229, 229, 229) rgb(15, 76, 129) rgb(15, 76, 129);font-size: 16.8px;font-weight: bold;margin: 2em 8px 0.75em 0px;text-align: left;line-height: 1.2;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;padding-left: 12px;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__71 js_darkmode__text__143&quot;&gt;&lt;span class=&quot;js_darkmode__text__144&quot;&gt;.NET 10.0.7 带外安全更新 - .NET 博客&lt;/span&gt;&lt;/h3&gt;&lt;p style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);margin: 1.5em 8px;text-align: justify;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;text-indent: 2em;letter-spacing: 0.1em;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__72 js_darkmode__text__145&quot;&gt;&lt;span class=&quot;js_darkmode__text__146&quot;&gt;https://devblogs.microsoft.com/dotnet/dotnet-10-0-7-oob-security-update/&lt;/span&gt;&lt;/p&gt;&lt;h3 style=&quot;box-sizing: border-box;border-width: 0px 0px 1px 4px;border-style: solid solid dashed;border-color: rgb(229, 229, 229) rgb(229, 229, 229) rgb(15, 76, 129) rgb(15, 76, 129);font-size: 16.8px;font-weight: bold;margin: 2em 8px 0.75em 0px;text-align: left;line-height: 1.2;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;padding-left: 12px;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__73 js_darkmode__text__147&quot;&gt;&lt;span class=&quot;js_darkmode__text__148&quot;&gt;Aspire 13.3 最新动态 | Aspire 博客&lt;/span&gt;&lt;/h3&gt;&lt;p style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);margin: 1.5em 8px;text-align: justify;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;text-indent: 2em;letter-spacing: 0.1em;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__74 js_darkmode__text__149&quot;&gt;&lt;span class=&quot;js_darkmode__text__150&quot;&gt;https://devblogs.microsoft.com/aspire/whats-new-aspire-13-3/&lt;/span&gt;&lt;/p&gt;&lt;h3 style=&quot;box-sizing: border-box;border-width: 0px 0px 1px 4px;border-style: solid solid dashed;border-color: rgb(229, 229, 229) rgb(229, 229, 229) rgb(15, 76, 129) rgb(15, 76, 129);font-size: 16.8px;font-weight: bold;margin: 2em 8px 0.75em 0px;text-align: left;line-height: 1.2;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;padding-left: 12px;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__75 js_darkmode__text__151&quot;&gt;&lt;span class=&quot;js_darkmode__text__152&quot;&gt;Windows 应用 SDK 2.0 发布说明 - Windows 应用&lt;/span&gt;&lt;/h3&gt;&lt;p style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);margin: 1.5em 8px;text-align: justify;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;text-indent: 2em;letter-spacing: 0.1em;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__76 js_darkmode__text__153&quot;&gt;&lt;span class=&quot;js_darkmode__text__154&quot;&gt;https://learn.microsoft.com/en-us/windows/apps/windows-app-sdk/release-notes/windows-app-sdk-2-0?pivots=stable&lt;/span&gt;&lt;/p&gt;&lt;ul style=&quot;list-style-type: none;&quot; class=&quot;js_darkmode__77 js_darkmode__text__155 list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;section class=&quot;js_darkmode__text__157&quot;&gt;&lt;span class=&quot;js_darkmode__text__158&quot;&gt;•&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;text-align: left;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;color: #576B95;&quot; class=&quot;js_darkmode__79 js_darkmode__text__159&quot;&gt;&lt;span class=&quot;js_darkmode__text__160&quot;&gt;发布 Windows 应用 SDK 2.0 (2.0.1) 🎉 · microsoft/WindowsAppSDK&lt;/span&gt;&lt;sup style=&quot; box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-size: 10.5px;line-height: 0; vertical-align: baseline;top: -0.5em; &quot; class=&quot;js_darkmode__80 js_darkmode__text__161&quot;&gt;&lt;span class=&quot;js_darkmode__text__162&quot;&gt;[1]&lt;/span&gt;&lt;/sup&gt;&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3 style=&quot;box-sizing: border-box;border-width: 0px 0px 1px 4px;border-style: solid solid dashed;border-color: rgb(229, 229, 229) rgb(229, 229, 229) rgb(15, 76, 129) rgb(15, 76, 129);font-size: 16.8px;font-weight: bold;margin: 2em 8px 0.75em 0px;text-align: left;line-height: 1.2;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;padding-left: 12px;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__81 js_darkmode__text__163&quot;&gt;&lt;span class=&quot;js_darkmode__text__164&quot;&gt;VSTest 正在移除其 Newtonsoft.Json 依赖 - .NET 博客&lt;/span&gt;&lt;/h3&gt;&lt;p style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);margin: 1.5em 8px;text-align: justify;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;text-indent: 2em;letter-spacing: 0.1em;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__82 js_darkmode__text__165&quot;&gt;&lt;span class=&quot;js_darkmode__text__166&quot;&gt;https://devblogs.microsoft.com/dotnet/vs-test-is-removing-its-newtonsoft-json-dependency/&lt;/span&gt;&lt;/p&gt;&lt;h3 style=&quot;box-sizing: border-box;border-width: 0px 0px 1px 4px;border-style: solid solid dashed;border-color: rgb(229, 229, 229) rgb(229, 229, 229) rgb(15, 76, 129) rgb(15, 76, 129);font-size: 16.8px;font-weight: bold;margin: 2em 8px 0.75em 0px;text-align: left;line-height: 1.2;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;padding-left: 12px;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__83 js_darkmode__text__167&quot;&gt;&lt;span class=&quot;js_darkmode__text__168&quot;&gt;Visual Studio 四月更新 – 云代理集成 - Visual Studio 博客&lt;/span&gt;&lt;/h3&gt;&lt;p style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);margin: 1.5em 8px;text-align: justify;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;text-indent: 2em;letter-spacing: 0.1em;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__84 js_darkmode__text__169&quot;&gt;&lt;span class=&quot;js_darkmode__text__170&quot;&gt;https://devblogs.microsoft.com/visualstudio/visual-studio-april-update-cloud-agent-integration/&lt;/span&gt;&lt;/p&gt;&lt;h3 style=&quot;box-sizing: border-box;border-width: 0px 0px 1px 4px;border-style: solid solid dashed;border-color: rgb(229, 229, 229) rgb(229, 229, 229) rgb(15, 76, 129) rgb(15, 76, 129);font-size: 16.8px;font-weight: bold;margin: 2em 8px 0.75em 0px;text-align: left;line-height: 1.2;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;padding-left: 12px;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__85 js_darkmode__text__171&quot;&gt;&lt;span class=&quot;js_darkmode__text__172&quot;&gt;Copilot Studio 在 WebAssembly 上运行 .NET 10 加速 - .NET 博客&lt;/span&gt;&lt;/h3&gt;&lt;p style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);margin: 1.5em 8px;text-align: justify;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;text-indent: 2em;letter-spacing: 0.1em;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__86 js_darkmode__text__173&quot;&gt;&lt;span class=&quot;js_darkmode__text__174&quot;&gt;https://devblogs.microsoft.com/dotnet/copilot-studio-dotnet-10-migration/&lt;/span&gt;&lt;/p&gt;&lt;h3 style=&quot;box-sizing: border-box;border-width: 0px 0px 1px 4px;border-style: solid solid dashed;border-color: rgb(229, 229, 229) rgb(229, 229, 229) rgb(15, 76, 129) rgb(15, 76, 129);font-size: 16.8px;font-weight: bold;margin: 2em 8px 0.75em 0px;text-align: left;line-height: 1.2;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;padding-left: 12px;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__87 js_darkmode__text__175&quot;&gt;&lt;span class=&quot;js_darkmode__text__176&quot;&gt;欢迎来到SkiaSharp 4.0预览1 - .NET博客&lt;/span&gt;&lt;/h3&gt;&lt;p style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);margin: 1.5em 8px;text-align: justify;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;text-indent: 2em;letter-spacing: 0.1em;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__88 js_darkmode__text__177&quot;&gt;&lt;span class=&quot;js_darkmode__text__178&quot;&gt;https://devblogs.microsoft.com/dotnet/welcome-to-skia-sharp-40-preview1/&lt;/span&gt;&lt;/p&gt;&lt;h3 style=&quot;box-sizing: border-box;border-width: 0px 0px 1px 4px;border-style: solid solid dashed;border-color: rgb(229, 229, 229) rgb(229, 229, 229) rgb(15, 76, 129) rgb(15, 76, 129);font-size: 16.8px;font-weight: bold;margin: 2em 8px 0.75em 0px;text-align: left;line-height: 1.2;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;padding-left: 12px;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__89 js_darkmode__text__179&quot;&gt;&lt;span class=&quot;js_darkmode__text__180&quot;&gt;Ubuntu 26.04 中 .NET 的新内容 - .NET 博客&lt;/span&gt;&lt;/h3&gt;&lt;p style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);margin: 1.5em 8px;text-align: justify;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;text-indent: 2em;letter-spacing: 0.1em;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__90 js_darkmode__text__181&quot;&gt;&lt;span class=&quot;js_darkmode__text__182&quot;&gt;https://devblogs.microsoft.com/dotnet/whats-new-for-dotnet-in-ubuntu-2604/&lt;/span&gt;&lt;/p&gt;&lt;h3 style=&quot;box-sizing: border-box;border-width: 0px 0px 1px 4px;border-style: solid solid dashed;border-color: rgb(229, 229, 229) rgb(229, 229, 229) rgb(15, 76, 129) rgb(15, 76, 129);font-size: 16.8px;font-weight: bold;margin: 2em 8px 0.75em 0px;text-align: left;line-height: 1.2;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;padding-left: 12px;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__91 js_darkmode__text__183&quot;&gt;&lt;span class=&quot;js_darkmode__text__184&quot;&gt;宣布WinApp VS Code扩展——在VS Code中运行、调试和打包Windows应用 -&amp;nbsp;&lt;a class=&quot;wx_topic_link js_darkmode__text__185&quot; style=&quot;color: #576B95 !important;&quot; data-topic=&quot;1&quot; data-recommend=&quot;&quot;&gt;#ifdef&lt;/a&gt;&amp;nbsp;窗户&lt;/span&gt;&lt;/h3&gt;&lt;p style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);margin: 1.5em 8px;text-align: justify;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;text-indent: 2em;letter-spacing: 0.1em;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__92 js_darkmode__text__186&quot;&gt;&lt;span class=&quot;js_darkmode__text__187&quot;&gt;https://devblogs.microsoft.com/ifdef-windows/announcing-the-winapp-vs-code-extension-run-debug-and-package-windows-apps-in-vs-code/&lt;/span&gt;&lt;/p&gt;&lt;h3 style=&quot;box-sizing: border-box;border-width: 0px 0px 1px 4px;border-style: solid solid dashed;border-color: rgb(229, 229, 229) rgb(229, 229, 229) rgb(15, 76, 129) rgb(15, 76, 129);font-size: 16.8px;font-weight: bold;margin: 2em 8px 0.75em 0px;text-align: left;line-height: 1.2;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;padding-left: 12px;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__93 js_darkmode__text__188&quot;&gt;&lt;span class=&quot;js_darkmode__text__189&quot;&gt;宣布WinUI 3图库2.9 -&amp;nbsp;&lt;a class=&quot;wx_topic_link js_darkmode__text__190&quot; style=&quot;color: #576B95 !important;&quot; data-topic=&quot;1&quot; data-recommend=&quot;&quot;&gt;#ifdef&lt;/a&gt;&amp;nbsp;Windows&lt;/span&gt;&lt;/h3&gt;&lt;p style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);margin: 1.5em 8px;text-align: justify;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;text-indent: 2em;letter-spacing: 0.1em;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__94 js_darkmode__text__191&quot;&gt;&lt;span class=&quot;js_darkmode__text__192&quot;&gt;https://devblogs.microsoft.com/ifdef-windows/announcing-winui-3-gallery-2-9/&lt;/span&gt;&lt;/p&gt;&lt;h3 style=&quot;box-sizing: border-box;border-width: 0px 0px 1px 4px;border-style: solid solid dashed;border-color: rgb(229, 229, 229) rgb(229, 229, 229) rgb(15, 76, 129) rgb(15, 76, 129);font-size: 16.8px;font-weight: bold;margin: 2em 8px 0.75em 0px;text-align: left;line-height: 1.2;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;padding-left: 12px;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__95 js_darkmode__text__193&quot;&gt;&lt;span class=&quot;js_darkmode__text__194&quot;&gt;TypeScript 7 测试版现已默认启用，已在Visual Studio 2026 18.6 Insiders 3 - Visual Studio 博客&lt;/span&gt;&lt;/h3&gt;&lt;p style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);margin: 1.5em 8px;text-align: justify;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;text-indent: 2em;letter-spacing: 0.1em;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__96 js_darkmode__text__195&quot;&gt;&lt;span class=&quot;js_darkmode__text__196&quot;&gt;https://devblogs.microsoft.com/visualstudio/typescript-7-beta-now-enabled-by-default-in-visual-studio-2026-18-6-insiders-3/&lt;/span&gt;&lt;/p&gt;&lt;h3 style=&quot;box-sizing: border-box;border-width: 0px 0px 1px 4px;border-style: solid solid dashed;border-color: rgb(229, 229, 229) rgb(229, 229, 229) rgb(15, 76, 129) rgb(15, 76, 129);font-size: 16.8px;font-weight: bold;margin: 2em 8px 0.75em 0px;text-align: left;line-height: 1.2;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;padding-left: 12px;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__97 js_darkmode__text__197&quot;&gt;&lt;span class=&quot;js_darkmode__text__198&quot;&gt;通过代理治理工具包在.NET中管理MCP工具调用 - .NET博客&lt;/span&gt;&lt;/h3&gt;&lt;p style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);margin: 1.5em 8px;text-align: justify;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;text-indent: 2em;letter-spacing: 0.1em;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__98 js_darkmode__text__199&quot;&gt;&lt;span class=&quot;js_darkmode__text__200&quot;&gt;https://devblogs.microsoft.com/dotnet/governing-mcp-tool-calls-in-dotnet-with-the-agent-governance-toolkit/&lt;/span&gt;&lt;/p&gt;&lt;h3 style=&quot;box-sizing: border-box;border-width: 0px 0px 1px 4px;border-style: solid solid dashed;border-color: rgb(229, 229, 229) rgb(229, 229, 229) rgb(15, 76, 129) rgb(15, 76, 129);font-size: 16.8px;font-weight: bold;margin: 2em 8px 0.75em 0px;text-align: left;line-height: 1.2;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;padding-left: 12px;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__99 js_darkmode__text__201&quot;&gt;&lt;span class=&quot;js_darkmode__text__202&quot;&gt;SDK 风格的扩展项目支持 - Visual Studio 博客&lt;/span&gt;&lt;/h3&gt;&lt;p style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);margin: 1.5em 8px;text-align: justify;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;text-indent: 2em;letter-spacing: 0.1em;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__100 js_darkmode__text__203&quot;&gt;&lt;span class=&quot;js_darkmode__text__204&quot;&gt;https://devblogs.microsoft.com/visualstudio/sdk-style-support-for-extension-projects/&lt;/span&gt;&lt;/p&gt;&lt;h2 style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-size: 18.2px;font-weight: bold;margin: 4em auto 2em;text-align: center;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;display: table;padding: 0.3em 1em;color: rgb(255, 255, 255);background: rgb(15, 76, 129);border-radius: 8px;box-shadow: rgba(0, 0, 0, 0.1) 0px 4px 6px;&quot; class=&quot;js_darkmode__101 js_darkmode__text__205&quot;&gt;&lt;span class=&quot;js_darkmode__text__206&quot;&gt;发布&lt;/span&gt;&lt;/h2&gt;&lt;ul style=&quot;list-style-type: none;&quot; class=&quot;js_darkmode__102 js_darkmode__text__207 list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;section class=&quot;js_darkmode__text__209&quot;&gt;&lt;span class=&quot;js_darkmode__text__210&quot;&gt;•&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;text-align: left;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;color: #576B95;&quot; class=&quot;js_darkmode__104 js_darkmode__text__211&quot;&gt;&lt;span class=&quot;js_darkmode__text__212&quot;&gt;AvaloniaUI/Avalonia&lt;/span&gt;&lt;sup style=&quot; box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-size: 10.5px;line-height: 0; vertical-align: baseline;top: -0.5em; &quot; class=&quot;js_darkmode__105 js_darkmode__text__213&quot;&gt;&lt;span class=&quot;js_darkmode__text__214&quot;&gt;[2]&lt;/span&gt;&lt;/sup&gt;&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;ul style=&quot;list-style-type: circle;&quot; class=&quot;js_darkmode__106 js_darkmode__text__215 list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;section class=&quot;js_darkmode__text__217&quot;&gt;&lt;span class=&quot;js_darkmode__text__218&quot;&gt;•&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;text-align: left;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;color: #576B95;&quot; class=&quot;js_darkmode__108 js_darkmode__text__219&quot;&gt;&lt;span class=&quot;js_darkmode__text__220&quot;&gt;12.0.2&lt;/span&gt;&lt;sup style=&quot; box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-size: 10.5px;line-height: 0; vertical-align: baseline;top: -0.5em; &quot; class=&quot;js_darkmode__109 js_darkmode__text__221&quot;&gt;&lt;span class=&quot;js_darkmode__text__222&quot;&gt;[3]&lt;/span&gt;&lt;/sup&gt;&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;section class=&quot;js_darkmode__text__224&quot;&gt;&lt;span class=&quot;js_darkmode__text__225&quot;&gt;•&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;text-align: left;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;color: #576B95;&quot; class=&quot;js_darkmode__111 js_darkmode__text__226&quot;&gt;&lt;span class=&quot;js_darkmode__text__227&quot;&gt;aws/aws-sdk-net&lt;/span&gt;&lt;sup style=&quot; box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-size: 10.5px;line-height: 0; vertical-align: baseline;top: -0.5em; &quot; class=&quot;js_darkmode__112 js_darkmode__text__228&quot;&gt;&lt;span class=&quot;js_darkmode__text__229&quot;&gt;[4]&lt;/span&gt;&lt;/sup&gt;&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;ul style=&quot;list-style-type: circle;&quot; class=&quot;js_darkmode__113 js_darkmode__text__230 list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;section class=&quot;js_darkmode__text__232&quot;&gt;&lt;span class=&quot;js_darkmode__text__233&quot;&gt;•&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;text-align: left;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;color: #576B95;&quot; class=&quot;js_darkmode__115 js_darkmode__text__234&quot;&gt;&lt;span class=&quot;js_darkmode__text__235&quot;&gt;4.0.235.0&lt;/span&gt;&lt;sup style=&quot; box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-size: 10.5px;line-height: 0; vertical-align: baseline;top: -0.5em; &quot; class=&quot;js_darkmode__116 js_darkmode__text__236&quot;&gt;&lt;span class=&quot;js_darkmode__text__237&quot;&gt;[5]&lt;/span&gt;&lt;/sup&gt;&lt;/span&gt;&lt;span class=&quot;js_darkmode__text__238&quot;&gt;，&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;text-align: left;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;color: #576B95;&quot; class=&quot;js_darkmode__117 js_darkmode__text__239&quot;&gt;&lt;span class=&quot;js_darkmode__text__240&quot;&gt;4.0.236.0&lt;/span&gt;&lt;sup style=&quot; box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-size: 10.5px;line-height: 0; vertical-align: baseline;top: -0.5em; &quot; class=&quot;js_darkmode__118 js_darkmode__text__241&quot;&gt;&lt;span class=&quot;js_darkmode__text__242&quot;&gt;[6]&lt;/span&gt;&lt;/sup&gt;&lt;/span&gt;&lt;span class=&quot;js_darkmode__text__243&quot;&gt;，&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;text-align: left;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;color: #576B95;&quot; class=&quot;js_darkmode__119 js_darkmode__text__244&quot;&gt;&lt;span class=&quot;js_darkmode__text__245&quot;&gt;4.0.237。 0&lt;/span&gt;&lt;sup style=&quot; box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-size: 10.5px;line-height: 0; vertical-align: baseline;top: -0.5em; &quot; class=&quot;js_darkmode__120 js_darkmode__text__246&quot;&gt;&lt;span class=&quot;js_darkmode__text__247&quot;&gt;[7]&lt;/span&gt;&lt;/sup&gt;&lt;/span&gt;&lt;span class=&quot;js_darkmode__text__248&quot;&gt;，&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;text-align: left;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;color: #576B95;&quot; class=&quot;js_darkmode__121 js_darkmode__text__249&quot;&gt;&lt;span class=&quot;js_darkmode__text__250&quot;&gt;4.0.238.0&lt;/span&gt;&lt;sup style=&quot; box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-size: 10.5px;line-height: 0; vertical-align: baseline;top: -0.5em; &quot; class=&quot;js_darkmode__122 js_darkmode__text__251&quot;&gt;&lt;span class=&quot;js_darkmode__text__252&quot;&gt;[8]&lt;/span&gt;&lt;/sup&gt;&lt;/span&gt;&lt;span class=&quot;js_darkmode__text__253&quot;&gt;，&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;text-align: left;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;color: #576B95;&quot; class=&quot;js_darkmode__123 js_darkmode__text__254&quot;&gt;&lt;span class=&quot;js_darkmode__text__255&quot;&gt;4.0.239.0&lt;/span&gt;&lt;sup style=&quot; box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-size: 10.5px;line-height: 0; vertical-align: baseline;top: -0.5em; &quot; class=&quot;js_darkmode__124 js_darkmode__text__256&quot;&gt;&lt;span class=&quot;js_darkmode__text__257&quot;&gt;[9]&lt;/span&gt;&lt;/sup&gt;&lt;/span&gt;&lt;span class=&quot;js_darkmode__text__258&quot;&gt;，&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;text-align: left;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;color: #576B95;&quot; class=&quot;js_darkmode__125 js_darkmode__text__259&quot;&gt;&lt;span class=&quot;js_darkmode__text__260&quot;&gt;4.0.240.0&lt;/span&gt;&lt;sup style=&quot; box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-size: 10.5px;line-height: 0; vertical-align: baseline;top: -0.5em; &quot; class=&quot;js_darkmode__126 js_darkmode__text__261&quot;&gt;&lt;span class=&quot;js_darkmode__text__262&quot;&gt;[10]&lt;/span&gt;&lt;/sup&gt;&lt;/span&gt;&lt;span class=&quot;js_darkmode__text__263&quot;&gt;，&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;text-align: left;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;color: #576B95;&quot; class=&quot;js_darkmode__127 js_darkmode__text__264&quot;&gt;&lt;span class=&quot;js_darkmode__text__265&quot;&gt;4.0.241.0&lt;/span&gt;&lt;sup style=&quot; box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-size: 10.5px;line-height: 0; vertical-align: baseline;top: -0.5em; &quot; class=&quot;js_darkmode__128 js_darkmode__text__266&quot;&gt;&lt;span class=&quot;js_darkmode__text__267&quot;&gt;[11]&lt;/span&gt;&lt;/sup&gt;&lt;/span&gt;&lt;span class=&quot;js_darkmode__text__268&quot;&gt;，&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;text-align: left;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;color: #576B95;&quot; class=&quot;js_darkmode__129 js_darkmode__text__269&quot;&gt;&lt;span class=&quot;js_darkmode__text__270&quot;&gt;4.0.242.0&lt;/span&gt;&lt;sup style=&quot; box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-size: 10.5px;line-height: 0; vertical-align: baseline;top: -0.5em; &quot; class=&quot;js_darkmode__130 js_darkmode__text__271&quot;&gt;&lt;span class=&quot;js_darkmode__text__272&quot;&gt;[12]&lt;/span&gt;&lt;/sup&gt;&lt;/span&gt;&lt;span class=&quot;js_darkmode__text__273&quot;&gt;，&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;text-align: left;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;color: #576B95;&quot; class=&quot;js_darkmode__131 js_darkmode__text__274&quot;&gt;&lt;span class=&quot;js_darkmode__text__275&quot;&gt;4.0.243.0&lt;/span&gt;&lt;sup style=&quot; box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-size: 10.5px;line-height: 0; vertical-align: baseline;top: -0.5em; &quot; class=&quot;js_darkmode__132 js_darkmode__text__276&quot;&gt;&lt;span class=&quot;js_darkmode__text__277&quot;&gt;[13]&lt;/span&gt;&lt;/sup&gt;&lt;/span&gt;&lt;span class=&quot;js_darkmode__text__278&quot;&gt;，&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;text-align: left;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;color: #576B95;&quot; class=&quot;js_darkmode__133 js_darkmode__text__279&quot;&gt;&lt;span class=&quot;js_darkmode__text__280&quot;&gt;4.0.244.0&lt;/span&gt;&lt;sup style=&quot; box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-size: 10.5px;line-height: 0; vertical-align: baseline;top: -0.5em; &quot; class=&quot;js_darkmode__134 js_darkmode__text__281&quot;&gt;&lt;span class=&quot;js_darkmode__text__282&quot;&gt;[14]&lt;/span&gt;&lt;/sup&gt;&lt;/span&gt;&lt;span class=&quot;js_darkmode__text__283&quot;&gt;，&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;text-align: left;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;color: #576B95;&quot; class=&quot;js_darkmode__135 js_darkmode__text__284&quot;&gt;&lt;span class=&quot;js_darkmode__text__285&quot;&gt;4.0.245.0&lt;/span&gt;&lt;sup style=&quot; box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-size: 10.5px;line-height: 0; vertical-align: baseline;top: -0.5em; &quot; class=&quot;js_darkmode__136 js_darkmode__text__286&quot;&gt;&lt;span class=&quot;js_darkmode__text__287&quot;&gt;[15]&lt;/span&gt;&lt;/sup&gt;&lt;/span&gt;&lt;span class=&quot;js_darkmode__text__288&quot;&gt;，&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;text-align: left;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;color: #576B95;&quot; class=&quot;js_darkmode__137 js_darkmode__text__289&quot;&gt;&lt;span class=&quot;js_darkmode__text__290&quot;&gt;4.0.246.0&lt;/span&gt;&lt;sup style=&quot; box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-size: 10.5px;line-height: 0; vertical-align: baseline;top: -0.5em; &quot; class=&quot;js_darkmode__138 js_darkmode__text__291&quot;&gt;&lt;span class=&quot;js_darkmode__text__292&quot;&gt;[16]&lt;/span&gt;&lt;/sup&gt;&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;section class=&quot;js_darkmode__text__294&quot;&gt;&lt;span class=&quot;js_darkmode__text__295&quot;&gt;•&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;text-align: left;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;color: #576B95;&quot; class=&quot;js_darkmode__140 js_darkmode__text__296&quot;&gt;&lt;span class=&quot;js_darkmode__text__297&quot;&gt;Azure/azure-cosmos-dotnet-v3&lt;/span&gt;&lt;sup style=&quot; box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-size: 10.5px;line-height: 0; vertical-align: baseline;top: -0.5em; &quot; class=&quot;js_darkmode__141 js_darkmode__text__298&quot;&gt;&lt;span class=&quot;js_darkmode__text__299&quot;&gt;[17]&lt;/span&gt;&lt;/sup&gt;&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;ul style=&quot;list-style-type: circle;&quot; class=&quot;js_darkmode__142 js_darkmode__text__300 list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;section class=&quot;js_darkmode__text__302&quot;&gt;&lt;span class=&quot;js_darkmode__text__303&quot;&gt;•&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;text-align: left;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;color: #576B95;&quot; class=&quot;js_darkmode__144 js_darkmode__text__304&quot;&gt;&lt;span class=&quot;js_darkmode__text__305&quot;&gt;3.59.0&lt;/span&gt;&lt;sup style=&quot; box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-size: 10.5px;line-height: 0; vertical-align: baseline;top: -0.5em; &quot; class=&quot;js_darkmode__145 js_darkmode__text__306&quot;&gt;&lt;span class=&quot;js_darkmode__text__307&quot;&gt;[18]&lt;/span&gt;&lt;/sup&gt;&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;section class=&quot;js_darkmode__text__309&quot;&gt;&lt;span class=&quot;js_darkmode__text__310&quot;&gt;•&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;text-align: left;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;color: #576B95;&quot; class=&quot;js_darkmode__147 js_darkmode__text__311&quot;&gt;&lt;span class=&quot;js_darkmode__text__312&quot;&gt;Azure/azure-sdk-for-net&lt;/span&gt;&lt;sup style=&quot; box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-size: 10.5px;line-height: 0; vertical-align: baseline;top: -0.5em; &quot; class=&quot;js_darkmode__148 js_darkmode__text__313&quot;&gt;&lt;span class=&quot;js_darkmode__text__314&quot;&gt;[19]&lt;/span&gt;&lt;/sup&gt;&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;ul style=&quot;list-style-type: circle;&quot; class=&quot;js_darkmode__149 js_darkmode__text__315 list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;section class=&quot;js_darkmode__text__317&quot;&gt;&lt;span class=&quot;js_darkmode__text__318&quot;&gt;•&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;text-align: left;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;color: #576B95;&quot; class=&quot;js_darkmode__151 js_darkmode__text__319&quot;&gt;&lt;span class=&quot;js_darkmode__text__320&quot;&gt;Azure.AI.Projects_2.0.1&lt;/span&gt;&lt;sup style=&quot; box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-size: 10.5px;line-height: 0; vertical-align: baseline;top: -0.5em; &quot; class=&quot;js_darkmode__152 js_darkmode__text__321&quot;&gt;&lt;span class=&quot;js_darkmode__text__322&quot;&gt;[20]&lt;/span&gt;&lt;/sup&gt;&lt;/span&gt;&lt;span class=&quot;js_darkmode__text__323&quot;&gt;，&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;text-align: left;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;color: #576B95;&quot; class=&quot;js_darkmode__153 js_darkmode__text__324&quot;&gt;&lt;span class=&quot;js_darkmode__text__325&quot;&gt;Azure.Core_1.54.0&lt;/span&gt;&lt;sup style=&quot; box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-size: 10.5px;line-height: 0; vertical-align: baseline;top: -0.5em; &quot; class=&quot;js_darkmode__154 js_darkmode__text__326&quot;&gt;&lt;span class=&quot;js_darkmode__text__327&quot;&gt;[21]&lt;/span&gt;&lt;/sup&gt;&lt;/span&gt;&lt;span class=&quot;js_darkmode__text__328&quot;&gt;，&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;text-align: left;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;color: #576B95;&quot; class=&quot;js_darkmode__155 js_darkmode__text__329&quot;&gt;&lt;span class=&quot;js_darkmode__text__330&quot;&gt;Azure.Core_1.55.0&lt;/span&gt;&lt;sup style=&quot; box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-size: 10.5px;line-height: 0; vertical-align: baseline;top: -0.5em; &quot; class=&quot;js_darkmode__156 js_darkmode__text__331&quot;&gt;&lt;span class=&quot;js_darkmode__text__332&quot;&gt;[22]&lt;/span&gt;&lt;/sup&gt;&lt;/span&gt;&lt;span class=&quot;js_darkmode__text__333&quot;&gt;，&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;text-align: left;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;color: #576B95;&quot; class=&quot;js_darkmode__157 js_darkmode__text__334&quot;&gt;&lt;span class=&quot;js_darkmode__text__335&quot;&gt;Azure.Extensions.AspNetCore.DataProtection.Blobs_1.5. 2&lt;/span&gt;&lt;sup style=&quot; box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-size: 10.5px;line-height: 0; vertical-align: baseline;top: -0.5em; &quot; class=&quot;js_darkmode__158 js_darkmode__text__336&quot;&gt;&lt;span class=&quot;js_darkmode__text__337&quot;&gt;[23]&lt;/span&gt;&lt;/sup&gt;&lt;/span&gt;&lt;span class=&quot;js_darkmode__text__338&quot;&gt;、&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;text-align: left;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;color: #576B95;&quot; class=&quot;js_darkmode__159 js_darkmode__text__339&quot;&gt;&lt;span class=&quot;js_darkmode__text__340&quot;&gt;Azure.Extensions.AspNetCore.DataProtection.Keys_ 1.6.2&lt;/span&gt;&lt;sup style=&quot; box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-size: 10.5px;line-height: 0; vertical-align: baseline;top: -0.5em; &quot; class=&quot;js_darkmode__160 js_darkmode__text__341&quot;&gt;&lt;span class=&quot;js_darkmode__text__342&quot;&gt;[24]&lt;/span&gt;&lt;/sup&gt;&lt;/span&gt;&lt;span class=&quot;js_darkmode__text__343&quot;&gt;，&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;text-align: left;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;color: #576B95;&quot; class=&quot;js_darkmode__161 js_darkmode__text__344&quot;&gt;&lt;span class=&quot;js_darkmode__text__345&quot;&gt;Azure.Monitor.OpenTelemetry.AspNetCore_1.5. 0&lt;/span&gt;&lt;sup style=&quot; box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-size: 10.5px;line-height: 0; vertical-align: baseline;top: -0.5em; &quot; class=&quot;js_darkmode__162 js_darkmode__text__346&quot;&gt;&lt;span class=&quot;js_darkmode__text__347&quot;&gt;[25]&lt;/span&gt;&lt;/sup&gt;&lt;/span&gt;&lt;span class=&quot;js_darkmode__text__348&quot;&gt;，&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;text-align: left;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;color: #576B95;&quot; class=&quot;js_darkmode__163 js_darkmode__text__349&quot;&gt;&lt;span class=&quot;js_darkmode__text__350&quot;&gt;Azure.Monitor.OpenTelemetry.Exporter_1.8。 0&lt;/span&gt;&lt;sup style=&quot; box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-size: 10.5px;line-height: 0; vertical-align: baseline;top: -0.5em; &quot; class=&quot;js_darkmode__164 js_darkmode__text__351&quot;&gt;&lt;span class=&quot;js_darkmode__text__352&quot;&gt;[26]&lt;/span&gt;&lt;/sup&gt;&lt;/span&gt;&lt;span class=&quot;js_darkmode__text__353&quot;&gt;，&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;text-align: left;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;color: #576B95;&quot; class=&quot;js_darkmode__165 js_darkmode__text__354&quot;&gt;&lt;span class=&quot;js_darkmode__text__355&quot;&gt;Azure.ResourceManager.Automanage_1.1。 2&lt;/span&gt;&lt;sup style=&quot; box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-size: 10.5px;line-height: 0; vertical-align: baseline;top: -0.5em; &quot; class=&quot;js_darkmode__166 js_darkmode__text__356&quot;&gt;&lt;span class=&quot;js_darkmode__text__357&quot;&gt;[27]&lt;/span&gt;&lt;/sup&gt;&lt;/span&gt;&lt;span class=&quot;js_darkmode__text__358&quot;&gt;，&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;text-align: left;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;color: #576B95;&quot; class=&quot;js_darkmode__167 js_darkmode__text__359&quot;&gt;&lt;span class=&quot;js_darkmode__text__360&quot;&gt;Azure.ResourceManager.Automation_1.1。 2&lt;/span&gt;&lt;sup style=&quot; box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-size: 10.5px;line-height: 0; vertical-align: baseline;top: -0.5em; &quot; class=&quot;js_darkmode__168 js_darkmode__text__361&quot;&gt;&lt;span class=&quot;js_darkmode__text__362&quot;&gt;[28]&lt;/span&gt;&lt;/sup&gt;&lt;/span&gt;&lt;span class=&quot;js_darkmode__text__363&quot;&gt;[Azure.ResourceManager.Billing_1.2.2](https://github.com/Azure/azure-sdk-for-net/releases/tag/Azure.ResourceManager.Billing_1.2.2 年)，&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;text-align: left;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;color: #576B95;&quot; class=&quot;js_darkmode__169 js_darkmode__text__364&quot;&gt;&lt;span class=&quot;js_darkmode__text__365&quot;&gt;Azure.ResourceManager.CarbonOptimization_1.0. 1&lt;/span&gt;&lt;sup style=&quot; box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-size: 10.5px;line-height: 0; vertical-align: baseline;top: -0.5em; &quot; class=&quot;js_darkmode__170 js_darkmode__text__366&quot;&gt;&lt;span class=&quot;js_darkmode__text__367&quot;&gt;[29]&lt;/span&gt;&lt;/sup&gt;&lt;/span&gt;&lt;span class=&quot;js_darkmode__text__368&quot;&gt;，[Azure.ResourceManager.ChangeAnalysis_1.1. 2](https://github.com/Azure/azure-sdk-for-net/releases/tag/Azure.ResourceManager.ChangeAnalysis_1.1.2 年)，&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;text-align: left;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;color: #576B95;&quot; class=&quot;js_darkmode__171 js_darkmode__text__369&quot;&gt;&lt;span class=&quot;js_darkmode__text__370&quot;&gt;Azure.ResourceManager.Chaos_1.1。 1&lt;/span&gt;&lt;sup style=&quot; box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-size: 10.5px;line-height: 0; vertical-align: baseline;top: -0.5em; &quot; class=&quot;js_darkmode__172 js_darkmode__text__371&quot;&gt;&lt;span class=&quot;js_darkmode__text__372&quot;&gt;[30]&lt;/span&gt;&lt;/sup&gt;&lt;/span&gt;&lt;span class=&quot;js_darkmode__text__373&quot;&gt;，&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;text-align: left;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;color: #576B95;&quot; class=&quot;js_darkmode__173 js_darkmode__text__374&quot;&gt;&lt;span class=&quot;js_darkmode__text__375&quot;&gt;Azure.ResourceManager.ComputeLimit_1.0. 0&lt;/span&gt;&lt;sup style=&quot; box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-size: 10.5px;line-height: 0; vertical-align: baseline;top: -0.5em; &quot; class=&quot;js_darkmode__174 js_darkmode__text__376&quot;&gt;&lt;span class=&quot;js_darkmode__text__377&quot;&gt;[31]&lt;/span&gt;&lt;/sup&gt;&lt;/span&gt;&lt;span class=&quot;js_darkmode__text__378&quot;&gt;，&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;text-align: left;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;color: #576B95;&quot; class=&quot;js_darkmode__175 js_darkmode__text__379&quot;&gt;&lt;span class=&quot;js_darkmode__text__380&quot;&gt;Azure.ResourceManager.ConnectedVMwarevSphere_1.1。 2&lt;/span&gt;&lt;sup style=&quot; box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-size: 10.5px;line-height: 0; vertical-align: baseline;top: -0.5em; &quot; class=&quot;js_darkmode__176 js_darkmode__text__381&quot;&gt;&lt;span class=&quot;js_darkmode__text__382&quot;&gt;[32]&lt;/span&gt;&lt;/sup&gt;&lt;/span&gt;&lt;span class=&quot;js_darkmode__text__383&quot;&gt;，&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;text-align: left;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;color: #576B95;&quot; class=&quot;js_darkmode__177 js_darkmode__text__384&quot;&gt;&lt;span class=&quot;js_darkmode__text__385&quot;&gt;Azure.ResourceManager.CostManagement_1.0. 3&lt;/span&gt;&lt;sup style=&quot; box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-size: 10.5px;line-height: 0; vertical-align: baseline;top: -0.5em; &quot; class=&quot;js_darkmode__178 js_darkmode__text__386&quot;&gt;&lt;span class=&quot;js_darkmode__text__387&quot;&gt;[33]&lt;/span&gt;&lt;/sup&gt;&lt;/span&gt;&lt;span class=&quot;js_darkmode__text__388&quot;&gt;，&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;text-align: left;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;color: #576B95;&quot; class=&quot;js_darkmode__179 js_darkmode__text__389&quot;&gt;&lt;span class=&quot;js_darkmode__text__390&quot;&gt;Azure.ResourceManager.CustomerInsights_1.0. 0&lt;/span&gt;&lt;sup style=&quot; box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-size: 10.5px;line-height: 0; vertical-align: baseline;top: -0.5em; &quot; class=&quot;js_darkmode__180 js_darkmode__text__391&quot;&gt;&lt;span class=&quot;js_darkmode__text__392&quot;&gt;[34]&lt;/span&gt;&lt;/sup&gt;&lt;/span&gt;&lt;span class=&quot;js_darkmode__text__393&quot;&gt;，&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;text-align: left;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;color: #576B95;&quot; class=&quot;js_darkmode__181 js_darkmode__text__394&quot;&gt;&lt;span class=&quot;js_darkmode__text__395&quot;&gt;Azure.ResourceManager.DataBox_1.1。 1&lt;/span&gt;&lt;sup style=&quot; box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-size: 10.5px;line-height: 0; vertical-align: baseline;top: -0.5em; &quot; class=&quot;js_darkmode__182 js_darkmode__text__396&quot;&gt;&lt;span class=&quot;js_darkmode__text__397&quot;&gt;[35]&lt;/span&gt;&lt;/sup&gt;&lt;/span&gt;&lt;span class=&quot;js_darkmode__text__398&quot;&gt;，&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;text-align: left;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;color: #576B95;&quot; class=&quot;js_darkmode__183 js_darkmode__text__399&quot;&gt;&lt;span class=&quot;js_darkmode__text__400&quot;&gt;Azure.ResourceManager.DataLakeAnalytics_1.1. 2&lt;/span&gt;&lt;sup style=&quot; box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-size: 10.5px;line-height: 0; vertical-align: baseline;top: -0.5em; &quot; class=&quot;js_darkmode__184 js_darkmode__text__401&quot;&gt;&lt;span class=&quot;js_darkmode__text__402&quot;&gt;[36]&lt;/span&gt;&lt;/sup&gt;&lt;/span&gt;&lt;span class=&quot;js_darkmode__text__403&quot;&gt;，&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;text-align: left;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;color: #576B95;&quot; class=&quot;js_darkmode__185 js_darkmode__text__404&quot;&gt;&lt;span class=&quot;js_darkmode__text__405&quot;&gt;Azure.ResourceManager.DataLakeStore_1.1。 2&lt;/span&gt;&lt;sup style=&quot; box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-size: 10.5px;line-height: 0; vertical-align: baseline;top: -0.5em; &quot; class=&quot;js_darkmode__186 js_darkmode__text__406&quot;&gt;&lt;span class=&quot;js_darkmode__text__407&quot;&gt;[37]&lt;/span&gt;&lt;/sup&gt;&lt;/span&gt;&lt;span class=&quot;js_darkmode__text__408&quot;&gt;，&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;text-align: left;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;color: #576B95;&quot; class=&quot;js_darkmode__187 js_darkmode__text__409&quot;&gt;&lt;span class=&quot;js_darkmode__text__410&quot;&gt;Azure.ResourceManager.DataShare_1.1。 2&lt;/span&gt;&lt;sup style=&quot; box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-size: 10.5px;line-height: 0; vertical-align: baseline;top: -0.5em; &quot; class=&quot;js_darkmode__188 js_darkmode__text__411&quot;&gt;&lt;span class=&quot;js_darkmode__text__412&quot;&gt;[38]&lt;/span&gt;&lt;/sup&gt;&lt;/span&gt;&lt;span class=&quot;js_darkmode__text__413&quot;&gt;，&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;text-align: left;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;color: #576B95;&quot; class=&quot;js_darkmode__189 js_darkmode__text__414&quot;&gt;&lt;span class=&quot;js_darkmode__text__415&quot;&gt;Azure.ResourceManager.DeviceUpdate_1.0. 2&lt;/span&gt;&lt;sup style=&quot; box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-size: 10.5px;line-height: 0; vertical-align: baseline;top: -0.5em; &quot; class=&quot;js_darkmode__190 js_darkmode__text__416&quot;&gt;&lt;span class=&quot;js_darkmode__text__417&quot;&gt;[39]&lt;/span&gt;&lt;/sup&gt;&lt;/span&gt;&lt;span class=&quot;js_darkmode__text__418&quot;&gt;，&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;text-align: left;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;color: #576B95;&quot; class=&quot;js_darkmode__191 js_darkmode__text__419&quot;&gt;&lt;span class=&quot;js_darkmode__text__420&quot;&gt;Azure.ResourceManager.DevOpsInfrastructure_1.0. 0&lt;/span&gt;&lt;sup style=&quot; box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-size: 10.5px;line-height: 0; vertical-align: baseline;top: -0.5em; &quot; class=&quot;js_darkmode__192 js_darkmode__text__421&quot;&gt;&lt;span class=&quot;js_darkmode__text__422&quot;&gt;[40]&lt;/span&gt;&lt;/sup&gt;&lt;/span&gt;&lt;span class=&quot;js_darkmode__text__423&quot;&gt;，&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;text-align: left;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;color: #576B95;&quot; class=&quot;js_darkmode__193 js_darkmode__text__424&quot;&gt;&lt;span class=&quot;js_darkmode__text__425&quot;&gt;Azure.ResourceManager.DevSpaces_1.0. 0&lt;/span&gt;&lt;sup style=&quot; box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-size: 10.5px;line-height: 0; vertical-align: baseline;top: -0.5em; &quot; class=&quot;js_darkmode__194 js_darkmode__text__426&quot;&gt;&lt;span class=&quot;js_darkmode__text__427&quot;&gt;[41]&lt;/span&gt;&lt;/sup&gt;&lt;/span&gt;&lt;span class=&quot;js_darkmode__text__428&quot;&gt;，&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;text-align: left;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;color: #576B95;&quot; class=&quot;js_darkmode__195 js_darkmode__text__429&quot;&gt;&lt;span class=&quot;js_darkmode__text__430&quot;&gt;Azure.ResourceManager.DigitalTwins_1.3。 2&lt;/span&gt;&lt;sup style=&quot; box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-size: 10.5px;line-height: 0; vertical-align: baseline;top: -0.5em; &quot; class=&quot;js_darkmode__196 js_darkmode__text__431&quot;&gt;&lt;span class=&quot;js_darkmode__text__432&quot;&gt;[42]&lt;/span&gt;&lt;/sup&gt;&lt;/span&gt;&lt;span class=&quot;js_darkmode__text__433&quot;&gt;，&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;text-align: left;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;color: #576B95;&quot; class=&quot;js_darkmode__197 js_darkmode__text__434&quot;&gt;&lt;span class=&quot;js_darkmode__text__435&quot;&gt;Azure.ResourceManager.EdgeOrder_1.1. 2&lt;/span&gt;&lt;sup style=&quot; box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-size: 10.5px;line-height: 0; vertical-align: baseline;top: -0.5em; &quot; class=&quot;js_darkmode__198 js_darkmode__text__436&quot;&gt;&lt;span class=&quot;js_darkmode__text__437&quot;&gt;[43]&lt;/span&gt;&lt;/sup&gt;&lt;/span&gt;&lt;span class=&quot;js_darkmode__text__438&quot;&gt;，[Azure.ResourceManager.ExtendedLocations_1.1。 2](https://github.com/Azure/azure-sdk-for-net/releases/tag/Azure.ResourceManager.ExtendedLocations_1.1.2 年)，&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;text-align: left;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;color: #576B95;&quot; class=&quot;js_darkmode__199 js_darkmode__text__439&quot;&gt;&lt;span class=&quot;js_darkmode__text__440&quot;&gt;Azure.ResourceManager.FluidRelay_1.1。 2&lt;/span&gt;&lt;sup style=&quot; box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-size: 10.5px;line-height: 0; vertical-align: baseline;top: -0.5em; &quot; class=&quot;js_darkmode__200 js_darkmode__text__441&quot;&gt;&lt;span class=&quot;js_darkmode__text__442&quot;&gt;[44]&lt;/span&gt;&lt;/sup&gt;&lt;/span&gt;&lt;span class=&quot;js_darkmode__text__443&quot;&gt;，&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;text-align: left;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;color: #576B95;&quot; class=&quot;js_darkmode__201 js_darkmode__text__444&quot;&gt;&lt;span class=&quot;js_darkmode__text__445&quot;&gt;Azure.ResourceManager.GraphServices_1.1。 3&lt;/span&gt;&lt;sup style=&quot; box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-size: 10.5px;line-height: 0; vertical-align: baseline;top: -0.5em; &quot; class=&quot;js_darkmode__202 js_darkmode__text__446&quot;&gt;&lt;span class=&quot;js_darkmode__text__447&quot;&gt;[45]&lt;/span&gt;&lt;/sup&gt;&lt;/span&gt;&lt;span class=&quot;js_darkmode__text__448&quot;&gt;，&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;text-align: left;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;color: #576B95;&quot; class=&quot;js_darkmode__203 js_darkmode__text__449&quot;&gt;&lt;span class=&quot;js_darkmode__text__450&quot;&gt;Azure.ResourceManager.GuestConfiguration_1.2。 2&lt;/span&gt;&lt;sup style=&quot; box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-size: 10.5px;line-height: 0; vertical-align: baseline;top: -0.5em; &quot; class=&quot;js_darkmode__204 js_darkmode__text__451&quot;&gt;&lt;span class=&quot;js_darkmode__text__452&quot;&gt;[46]&lt;/span&gt;&lt;/sup&gt;&lt;/span&gt;&lt;span class=&quot;js_darkmode__text__453&quot;&gt;，&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;text-align: left;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;color: #576B95;&quot; class=&quot;js_darkmode__205 js_darkmode__text__454&quot;&gt;&lt;span class=&quot;js_darkmode__text__455&quot;&gt;Azure.ResourceManager.HardwareSecurityModules_1.0. 1&lt;/span&gt;&lt;sup style=&quot; box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-size: 10.5px;line-height: 0; vertical-align: baseline;top: -0.5em; &quot; class=&quot;js_darkmode__206 js_darkmode__text__456&quot;&gt;&lt;span class=&quot;js_darkmode__text__457&quot;&gt;[47]&lt;/span&gt;&lt;/sup&gt;&lt;/span&gt;&lt;span class=&quot;js_darkmode__text__458&quot;&gt;，&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;text-align: left;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;color: #576B95;&quot; class=&quot;js_darkmode__207 js_darkmode__text__459&quot;&gt;&lt;span class=&quot;js_darkmode__text__460&quot;&gt;Azure.ResourceManager.HealthcareApis_1.3. 2&lt;/span&gt;&lt;sup style=&quot; box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-size: 10.5px;line-height: 0; vertical-align: baseline;top: -0.5em; &quot; class=&quot;js_darkmode__208 js_darkmode__text__461&quot;&gt;&lt;span class=&quot;js_darkmode__text__462&quot;&gt;[48]&lt;/span&gt;&lt;/sup&gt;&lt;/span&gt;&lt;span class=&quot;js_darkmode__text__463&quot;&gt;，&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;text-align: left;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;color: #576B95;&quot; class=&quot;js_darkmode__209 js_darkmode__text__464&quot;&gt;&lt;span class=&quot;js_darkmode__text__465&quot;&gt;Azure.ResourceManager.HealthDataAIServices_1.0。 1&lt;/span&gt;&lt;sup style=&quot; box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-size: 10.5px;line-height: 0; vertical-align: baseline;top: -0.5em; &quot; class=&quot;js_darkmode__210 js_darkmode__text__466&quot;&gt;&lt;span class=&quot;js_darkmode__text__467&quot;&gt;[49]&lt;/span&gt;&lt;/sup&gt;&lt;/span&gt;&lt;span class=&quot;js_darkmode__text__468&quot;&gt;，&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;text-align: left;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;color: #576B95;&quot; class=&quot;js_darkmode__211 js_darkmode__text__469&quot;&gt;&lt;span class=&quot;js_darkmode__text__470&quot;&gt;Azure.ResourceManager.HybridConnectivity_1.1. 1&lt;/span&gt;&lt;sup style=&quot; box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-size: 10.5px;line-height: 0; vertical-align: baseline;top: -0.5em; &quot; class=&quot;js_darkmode__212 js_darkmode__text__471&quot;&gt;&lt;span class=&quot;js_darkmode__text__472&quot;&gt;[50]&lt;/span&gt;&lt;/sup&gt;&lt;/span&gt;&lt;span class=&quot;js_darkmode__text__473&quot;&gt;，&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;text-align: left;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;color: #576B95;&quot; class=&quot;js_darkmode__213 js_darkmode__text__474&quot;&gt;&lt;span class=&quot;js_darkmode__text__475&quot;&gt;Azure.ResourceManager.HybridContainerService_1.0. 2&lt;/span&gt;&lt;sup style=&quot; box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-size: 10.5px;line-height: 0; vertical-align: baseline;top: -0.5em; &quot; class=&quot;js_darkmode__214 js_darkmode__text__476&quot;&gt;&lt;span class=&quot;js_darkmode__text__477&quot;&gt;[51]&lt;/span&gt;&lt;/sup&gt;&lt;/span&gt;&lt;span class=&quot;js_darkmode__text__478&quot;&gt;，&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;text-align: left;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;color: #576B95;&quot; class=&quot;js_darkmode__215 js_darkmode__text__479&quot;&gt;&lt;span class=&quot;js_darkmode__text__480&quot;&gt;Azure.ResourceManager.InformaticaDataManagement_1.0. 0&lt;/span&gt;&lt;sup style=&quot; box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-size: 10.5px;line-height: 0; vertical-align: baseline;top: -0.5em; &quot; class=&quot;js_darkmode__216 js_darkmode__text__481&quot;&gt;&lt;span class=&quot;js_darkmode__text__482&quot;&gt;[52]&lt;/span&gt;&lt;/sup&gt;&lt;/span&gt;&lt;span class=&quot;js_darkmode__text__483&quot;&gt;，&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;text-align: left;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;color: #576B95;&quot; class=&quot;js_darkmode__217 js_darkmode__text__484&quot;&gt;&lt;span class=&quot;js_darkmode__text__485&quot;&gt;Azure.ResourceManager.KubernetesConfiguration_1.2。 1&lt;/span&gt;&lt;sup style=&quot; box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-size: 10.5px;line-height: 0; vertical-align: baseline;top: -0.5em; &quot; class=&quot;js_darkmode__218 js_darkmode__text__486&quot;&gt;&lt;span class=&quot;js_darkmode__text__487&quot;&gt;[53]&lt;/span&gt;&lt;/sup&gt;&lt;/span&gt;&lt;span class=&quot;js_darkmode__text__488&quot;&gt;，&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;text-align: left;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;color: #576B95;&quot; class=&quot;js_darkmode__219 js_darkmode__text__489&quot;&gt;&lt;span class=&quot;js_darkmode__text__490&quot;&gt;Azure.ResourceManager.KubernetesConfiguration.Extensions_1.0.0&lt;/span&gt;&lt;sup style=&quot; box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-size: 10.5px;line-height: 0; vertical-align: baseline;top: -0.5em; &quot; class=&quot;js_darkmode__220 js_darkmode__text__491&quot;&gt;&lt;span class=&quot;js_darkmode__text__492&quot;&gt;[54]&lt;/span&gt;&lt;/sup&gt;&lt;/span&gt;&lt;span class=&quot;js_darkmode__text__493&quot;&gt;，&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;text-align: left;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;color: #576B95;&quot; class=&quot;js_darkmode__221 js_darkmode__text__494&quot;&gt;&lt;span class=&quot;js_darkmode__text__495&quot;&gt;Azure.ResourceManager.LabServices_1.1。 2&lt;/span&gt;&lt;sup style=&quot; box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-size: 10.5px;line-height: 0; vertical-align: baseline;top: -0.5em; &quot; class=&quot;js_darkmode__222 js_darkmode__text__496&quot;&gt;&lt;span class=&quot;js_darkmode__text__497&quot;&gt;[55]&lt;/span&gt;&lt;/sup&gt;&lt;/span&gt;&lt;span class=&quot;js_darkmode__text__498&quot;&gt;，&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;text-align: left;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;color: #576B95;&quot; class=&quot;js_darkmode__223 js_darkmode__text__499&quot;&gt;&lt;span class=&quot;js_darkmode__text__500&quot;&gt;Azure.ResourceManager.LambdaTestHyperExecute_1.0. 1&lt;/span&gt;&lt;sup style=&quot; box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-size: 10.5px;line-height: 0; vertical-align: baseline;top: -0.5em; &quot; class=&quot;js_darkmode__224 js_darkmode__text__501&quot;&gt;&lt;span class=&quot;js_darkmode__text__502&quot;&gt;[56]&lt;/span&gt;&lt;/sup&gt;&lt;/span&gt;&lt;span class=&quot;js_darkmode__text__503&quot;&gt;，&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;text-align: left;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;color: #576B95;&quot; class=&quot;js_darkmode__225 js_darkmode__text__504&quot;&gt;&lt;span class=&quot;js_darkmode__text__505&quot;&gt;Azure.ResourceManager.Logic_1.2。 0&lt;/span&gt;&lt;sup style=&quot; box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-size: 10.5px;line-height: 0; vertical-align: baseline;top: -0.5em; &quot; class=&quot;js_darkmode__226 js_darkmode__text__506&quot;&gt;&lt;span class=&quot;js_darkmode__text__507&quot;&gt;[57]&lt;/span&gt;&lt;/sup&gt;&lt;/span&gt;&lt;span class=&quot;js_darkmode__text__508&quot;&gt;，&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;text-align: left;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;color: #576B95;&quot; class=&quot;js_darkmode__227 js_darkmode__text__509&quot;&gt;&lt;span class=&quot;js_darkmode__text__510&quot;&gt;Azure.ResourceManager.ManagedNetworkFabric_1.1. 3&lt;/span&gt;&lt;sup style=&quot; box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-size: 10.5px;line-height: 0; vertical-align: baseline;top: -0.5em; &quot; class=&quot;js_darkmode__228 js_darkmode__text__511&quot;&gt;&lt;span class=&quot;js_darkmode__text__512&quot;&gt;[58]&lt;/span&gt;&lt;/sup&gt;&lt;/span&gt;&lt;span class=&quot;js_darkmode__text__513&quot;&gt;，&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;text-align: left;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;color: #576B95;&quot; class=&quot;js_darkmode__229 js_darkmode__text__514&quot;&gt;&lt;span class=&quot;js_darkmode__text__515&quot;&gt;Azure.ResourceManager.ManagedServiceIdentities_1.4。 1&lt;/span&gt;&lt;sup style=&quot; box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-size: 10.5px;line-height: 0; vertical-align: baseline;top: -0.5em; &quot; class=&quot;js_darkmode__230 js_darkmode__text__516&quot;&gt;&lt;span class=&quot;js_darkmode__text__517&quot;&gt;[59]&lt;/span&gt;&lt;/sup&gt;&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;text-align: left;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;color: #576B95;&quot; class=&quot;js_darkmode__231 js_darkmode__text__518&quot;&gt;&lt;span class=&quot;js_darkmode__text__519&quot;&gt;Azure.ResourceManager.Marketplace_1.1.3&lt;/span&gt;&lt;sup style=&quot; box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-size: 10.5px;line-height: 0; vertical-align: baseline;top: -0.5em; &quot; class=&quot;js_darkmode__232 js_darkmode__text__520&quot;&gt;&lt;span class=&quot;js_darkmode__text__521&quot;&gt;[60]&lt;/span&gt;&lt;/sup&gt;&lt;/span&gt;&lt;span class=&quot;js_darkmode__text__522&quot;&gt;，&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;text-align: left;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;color: #576B95;&quot; class=&quot;js_darkmode__233 js_darkmode__text__523&quot;&gt;&lt;span class=&quot;js_darkmode__text__524&quot;&gt;Azure.ResourceManager.MarketplaceOrdering_1.1. 2&lt;/span&gt;&lt;sup style=&quot; box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-size: 10.5px;line-height: 0; vertical-align: baseline;top: -0.5em; &quot; class=&quot;js_darkmode__234 js_darkmode__text__525&quot;&gt;&lt;span class=&quot;js_darkmode__text__526&quot;&gt;[61]&lt;/span&gt;&lt;/sup&gt;&lt;/span&gt;&lt;span class=&quot;js_darkmode__text__527&quot;&gt;， [Azure.ResourceManager.MongoDBAtlas_1.0. 1](https://github.com/Azure/azure-sdk-for-net/releases/tag/Azure.ResourceManager.MongoDBAtlas_1.0.1 年)，&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;text-align: left;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;color: #576B95;&quot; class=&quot;js_darkmode__235 js_darkmode__text__528&quot;&gt;&lt;span class=&quot;js_darkmode__text__529&quot;&gt;Azure.ResourceManager.NetApp_1.16。 0&lt;/span&gt;&lt;sup style=&quot; box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-size: 10.5px;line-height: 0; vertical-align: baseline;top: -0.5em; &quot; class=&quot;js_darkmode__236 js_darkmode__text__530&quot;&gt;&lt;span class=&quot;js_darkmode__text__531&quot;&gt;[62]&lt;/span&gt;&lt;/sup&gt;&lt;/span&gt;&lt;span class=&quot;js_darkmode__text__532&quot;&gt;，&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;text-align: left;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;color: #576B95;&quot; class=&quot;js_darkmode__237 js_darkmode__text__533&quot;&gt;&lt;span class=&quot;js_darkmode__text__534&quot;&gt;Azure.ResourceManager.NetworkFunction_1.0. 0&lt;/span&gt;&lt;sup style=&quot; box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-size: 10.5px;line-height: 0; vertical-align: baseline;top: -0.5em; &quot; class=&quot;js_darkmode__238 js_darkmode__text__535&quot;&gt;&lt;span class=&quot;js_darkmode__text__536&quot;&gt;[63]&lt;/span&gt;&lt;/sup&gt;&lt;/span&gt;&lt;span class=&quot;js_darkmode__text__537&quot;&gt;，&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;text-align: left;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;color: #576B95;&quot; class=&quot;js_darkmode__239 js_darkmode__text__538&quot;&gt;&lt;span class=&quot;js_darkmode__text__539&quot;&gt;Azure.ResourceManager.Orbital_1.1. 2&lt;/span&gt;&lt;sup style=&quot; box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-size: 10.5px;line-height: 0; vertical-align: baseline;top: -0.5em; &quot; class=&quot;js_darkmode__240 js_darkmode__text__540&quot;&gt;&lt;span class=&quot;js_darkmode__text__541&quot;&gt;[64]&lt;/span&gt;&lt;/sup&gt;&lt;/span&gt;&lt;span class=&quot;js_darkmode__text__542&quot;&gt;，&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;text-align: left;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;color: #576B95;&quot; class=&quot;js_darkmode__241 js_darkmode__text__543&quot;&gt;&lt;span class=&quot;js_darkmode__text__544&quot;&gt;Azure.ResourceManager.Peering_1.2。 3&lt;/span&gt;&lt;sup style=&quot; box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-size: 10.5px;line-height: 0; vertical-align: baseline;top: -0.5em; &quot; class=&quot;js_darkmode__242 js_darkmode__text__545&quot;&gt;&lt;span class=&quot;js_darkmode__text__546&quot;&gt;[65]&lt;/span&gt;&lt;/sup&gt;&lt;/span&gt;&lt;span class=&quot;js_darkmode__text__547&quot;&gt;，&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;text-align: left;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;color: #576B95;&quot; class=&quot;js_darkmode__243 js_darkmode__text__548&quot;&gt;&lt;span class=&quot;js_darkmode__text__549&quot;&gt;Azure.ResourceManager.PlanetaryComputer_1.0. 0&lt;/span&gt;&lt;sup style=&quot; box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-size: 10.5px;line-height: 0; vertical-align: baseline;top: -0.5em; &quot; class=&quot;js_darkmode__244 js_darkmode__text__550&quot;&gt;&lt;span class=&quot;js_darkmode__text__551&quot;&gt;[66]&lt;/span&gt;&lt;/sup&gt;&lt;/span&gt;&lt;span class=&quot;js_darkmode__text__552&quot;&gt;，&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;text-align: left;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;color: #576B95;&quot; class=&quot;js_darkmode__245 js_darkmode__text__553&quot;&gt;&lt;span class=&quot;js_darkmode__text__554&quot;&gt;Azure.ResourceManager.PostgreSql_1.4。 2&lt;/span&gt;&lt;sup style=&quot; box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-size: 10.5px;line-height: 0; vertical-align: baseline;top: -0.5em; &quot; class=&quot;js_darkmode__246 js_darkmode__text__555&quot;&gt;&lt;span class=&quot;js_darkmode__text__556&quot;&gt;[67]&lt;/span&gt;&lt;/sup&gt;&lt;/span&gt;&lt;span class=&quot;js_darkmode__text__557&quot;&gt;，&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;text-align: left;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;color: #576B95;&quot; class=&quot;js_darkmode__247 js_darkmode__text__558&quot;&gt;&lt;span class=&quot;js_darkmode__text__559&quot;&gt;Azure.ResourceManager.PowerBIDedicated_1.0. 0&lt;/span&gt;&lt;sup style=&quot; box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-size: 10.5px;line-height: 0; vertical-align: baseline;top: -0.5em; &quot; class=&quot;js_darkmode__248 js_darkmode__text__560&quot;&gt;&lt;span class=&quot;js_darkmode__text__561&quot;&gt;[68]&lt;/span&gt;&lt;/sup&gt;&lt;/span&gt;&lt;span class=&quot;js_darkmode__text__562&quot;&gt;，&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;text-align: left;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;color: #576B95;&quot; class=&quot;js_darkmode__249 js_darkmode__text__563&quot;&gt;&lt;span class=&quot;js_darkmode__text__564&quot;&gt;Azure.ResourceManager.PrivateDns_1.2。 2&lt;/span&gt;&lt;sup style=&quot; box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-size: 10.5px;line-height: 0; vertical-align: baseline;top: -0.5em; &quot; class=&quot;js_darkmode__250 js_darkmode__text__565&quot;&gt;&lt;span class=&quot;js_darkmode__text__566&quot;&gt;[69]&lt;/span&gt;&lt;/sup&gt;&lt;/span&gt;&lt;span class=&quot;js_darkmode__text__567&quot;&gt;，&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;text-align: left;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;color: #576B95;&quot; class=&quot;js_darkmode__251 js_darkmode__text__568&quot;&gt;&lt;span class=&quot;js_darkmode__text__569&quot;&gt;Azure.ResourceManager.PureStorageBlock_1.0. 1&lt;/span&gt;&lt;sup style=&quot; box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-size: 10.5px;line-height: 0; vertical-align: baseline;top: -0.5em; &quot; class=&quot;js_darkmode__252 js_darkmode__text__570&quot;&gt;&lt;span class=&quot;js_darkmode__text__571&quot;&gt;[70]&lt;/span&gt;&lt;/sup&gt;&lt;/span&gt;&lt;span class=&quot;js_darkmode__text__572&quot;&gt;，&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;text-align: left;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;color: #576B95;&quot; class=&quot;js_darkmode__253 js_darkmode__text__573&quot;&gt;&lt;span class=&quot;js_darkmode__text__574&quot;&gt;Azure.ResourceManager.RecoveryServicesSiteRecovery_1.3. 1&lt;/span&gt;&lt;sup style=&quot; box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-size: 10.5px;line-height: 0; vertical-align: baseline;top: -0.5em; &quot; class=&quot;js_darkmode__254 js_darkmode__text__575&quot;&gt;&lt;span class=&quot;js_darkmode__text__576&quot;&gt;[71]&lt;/span&gt;&lt;/sup&gt;&lt;/span&gt;&lt;span class=&quot;js_darkmode__text__577&quot;&gt;，&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;text-align: left;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;color: #576B95;&quot; class=&quot;js_darkmode__255 js_darkmode__text__578&quot;&gt;&lt;span class=&quot;js_darkmode__text__579&quot;&gt;Azure.ResourceManager.ScVmm_1.0. 0&lt;/span&gt;&lt;sup style=&quot; box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-size: 10.5px;line-height: 0; vertical-align: baseline;top: -0.5em; &quot; class=&quot;js_darkmode__256 js_darkmode__text__580&quot;&gt;&lt;span class=&quot;js_darkmode__text__581&quot;&gt;[72]&lt;/span&gt;&lt;/sup&gt;&lt;/span&gt;&lt;span class=&quot;js_darkmode__text__582&quot;&gt;，&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;text-align: left;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;color: #576B95;&quot; class=&quot;js_darkmode__257 js_darkmode__text__583&quot;&gt;&lt;span class=&quot;js_darkmode__text__584&quot;&gt;Azure.ResourceManager.Sphere_1.0. 2&lt;/span&gt;&lt;sup style=&quot; box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-size: 10.5px;line-height: 0; vertical-align: baseline;top: -0.5em; &quot; class=&quot;js_darkmode__258 js_darkmode__text__585&quot;&gt;&lt;span class=&quot;js_darkmode__text__586&quot;&gt;[73]&lt;/span&gt;&lt;/sup&gt;&lt;/span&gt;&lt;span class=&quot;js_darkmode__text__587&quot;&gt;，&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;text-align: left;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;color: #576B95;&quot; class=&quot;js_darkmode__259 js_darkmode__text__588&quot;&gt;&lt;span class=&quot;js_darkmode__text__589&quot;&gt;Azure.ResourceManager.StorageActions_1.0. 1&lt;/span&gt;&lt;sup style=&quot; box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-size: 10.5px;line-height: 0; vertical-align: baseline;top: -0.5em; &quot; class=&quot;js_darkmode__260 js_darkmode__text__590&quot;&gt;&lt;span class=&quot;js_darkmode__text__591&quot;&gt;[74]&lt;/span&gt;&lt;/sup&gt;&lt;/span&gt;&lt;span class=&quot;js_darkmode__text__592&quot;&gt;，&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;text-align: left;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;color: #576B95;&quot; class=&quot;js_darkmode__261 js_darkmode__text__593&quot;&gt;&lt;span class=&quot;js_darkmode__text__594&quot;&gt;Azure.ResourceManager.StorageMover_1.4。 0&lt;/span&gt;&lt;sup style=&quot; box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-size: 10.5px;line-height: 0; vertical-align: baseline;top: -0.5em; &quot; class=&quot;js_darkmode__262 js_darkmode__text__595&quot;&gt;&lt;span class=&quot;js_darkmode__text__596&quot;&gt;[75]&lt;/span&gt;&lt;/sup&gt;&lt;/span&gt;&lt;span class=&quot;js_darkmode__text__597&quot;&gt;，&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;text-align: left;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;color: #576B95;&quot; class=&quot;js_darkmode__263 js_darkmode__text__598&quot;&gt;&lt;span class=&quot;js_darkmode__text__599&quot;&gt;Azure.ResourceManager.Subscription_1.1. 2&lt;/span&gt;&lt;sup style=&quot; box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-size: 10.5px;line-height: 0; vertical-align: baseline;top: -0.5em; &quot; class=&quot;js_darkmode__264 js_darkmode__text__600&quot;&gt;&lt;span class=&quot;js_darkmode__text__601&quot;&gt;[76]&lt;/span&gt;&lt;/sup&gt;&lt;/span&gt;&lt;span class=&quot;js_darkmode__text__602&quot;&gt;，&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;text-align: left;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;color: #576B95;&quot; class=&quot;js_darkmode__265 js_darkmode__text__603&quot;&gt;&lt;span class=&quot;js_darkmode__text__604&quot;&gt;Azure.ResourceManager.Synapse_1.2。 2&lt;/span&gt;&lt;sup style=&quot; box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-size: 10.5px;line-height: 0; vertical-align: baseline;top: -0.5em; &quot; class=&quot;js_darkmode__266 js_darkmode__text__605&quot;&gt;&lt;span class=&quot;js_darkmode__text__606&quot;&gt;[77]&lt;/span&gt;&lt;/sup&gt;&lt;/span&gt;&lt;span class=&quot;js_darkmode__text__607&quot;&gt;，&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;text-align: left;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;color: #576B95;&quot; class=&quot;js_darkmode__267 js_darkmode__text__608&quot;&gt;&lt;span class=&quot;js_darkmode__text__609&quot;&gt;Azure.Search.Documents_12.0. 0&lt;/span&gt;&lt;sup style=&quot; box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-size: 10.5px;line-height: 0; vertical-align: baseline;top: -0.5em; &quot; class=&quot;js_darkmode__268 js_darkmode__text__610&quot;&gt;&lt;span class=&quot;js_darkmode__text__611&quot;&gt;[78]&lt;/span&gt;&lt;/sup&gt;&lt;/span&gt;&lt;span class=&quot;js_darkmode__text__612&quot;&gt;，&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;text-align: left;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;color: #576B95;&quot; class=&quot;js_darkmode__269 js_darkmode__text__613&quot;&gt;&lt;span class=&quot;js_darkmode__text__614&quot;&gt;Azure.Security.KeyVault.Administration_4.8。 0&lt;/span&gt;&lt;sup style=&quot; box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-size: 10.5px;line-height: 0; vertical-align: baseline;top: -0.5em; &quot; class=&quot;js_darkmode__270 js_darkmode__text__615&quot;&gt;&lt;span class=&quot;js_darkmode__text__616&quot;&gt;[79]&lt;/span&gt;&lt;/sup&gt;&lt;/span&gt;&lt;span class=&quot;js_darkmode__text__617&quot;&gt;，&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;text-align: left;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;color: #576B95;&quot; class=&quot;js_darkmode__271 js_darkmode__text__618&quot;&gt;&lt;span class=&quot;js_darkmode__text__619&quot;&gt;Azure.Security.KeyVault.Keys_4.10。 0&lt;/span&gt;&lt;sup style=&quot; box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-size: 10.5px;line-height: 0; vertical-align: baseline;top: -0.5em; &quot; class=&quot;js_darkmode__272 js_darkmode__text__620&quot;&gt;&lt;span class=&quot;js_darkmode__text__621&quot;&gt;[80]&lt;/span&gt;&lt;/sup&gt;&lt;/span&gt;&lt;span class=&quot;js_darkmode__text__622&quot;&gt;，&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;text-align: left;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;color: #576B95;&quot; class=&quot;js_darkmode__273 js_darkmode__text__623&quot;&gt;&lt;span class=&quot;js_darkmode__text__624&quot;&gt;Azure.Security.KeyVault.Secrets_4.11。 0&lt;/span&gt;&lt;sup style=&quot; box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-size: 10.5px;line-height: 0; vertical-align: baseline;top: -0.5em; &quot; class=&quot;js_darkmode__274 js_darkmode__text__625&quot;&gt;&lt;span class=&quot;js_darkmode__text__626&quot;&gt;[81]&lt;/span&gt;&lt;/sup&gt;&lt;/span&gt;&lt;span class=&quot;js_darkmode__text__627&quot;&gt;，&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;text-align: left;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;color: #576B95;&quot; class=&quot;js_darkmode__275 js_darkmode__text__628&quot;&gt;&lt;span class=&quot;js_darkmode__text__629&quot;&gt;Microsoft.Extensions.Azure_1.14. 0&lt;/span&gt;&lt;sup style=&quot; box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-size: 10.5px;line-height: 0; vertical-align: baseline;top: -0.5em; &quot; class=&quot;js_darkmode__276 js_darkmode__text__630&quot;&gt;&lt;span class=&quot;js_darkmode__text__631&quot;&gt;[82]&lt;/span&gt;&lt;/sup&gt;&lt;/span&gt;&lt;span class=&quot;js_darkmode__text__632&quot;&gt;，&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;text-align: left;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;color: #576B95;&quot; class=&quot;js_darkmode__277 js_darkmode__text__633&quot;&gt;&lt;span class=&quot;js_darkmode__text__634&quot;&gt;System.ClientModel_1.11.0&lt;/span&gt;&lt;sup style=&quot; box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-size: 10.5px;line-height: 0; vertical-align: baseline;top: -0.5em; &quot; class=&quot;js_darkmode__278 js_darkmode__text__635&quot;&gt;&lt;span class=&quot;js_darkmode__text__636&quot;&gt;[83]&lt;/span&gt;&lt;/sup&gt;&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;section class=&quot;js_darkmode__text__638&quot;&gt;&lt;span class=&quot;js_darkmode__text__639&quot;&gt;•&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;text-align: left;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;color: #576B95;&quot; class=&quot;js_darkmode__280 js_darkmode__text__640&quot;&gt;&lt;span class=&quot;js_darkmode__text__641&quot;&gt;CommunityToolkit/Maui&lt;/span&gt;&lt;sup style=&quot; box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-size: 10.5px;line-height: 0; vertical-align: baseline;top: -0.5em; &quot; class=&quot;js_darkmode__281 js_darkmode__text__642&quot;&gt;&lt;span class=&quot;js_darkmode__text__643&quot;&gt;[84]&lt;/span&gt;&lt;/sup&gt;&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;ul style=&quot;list-style-type: circle;&quot; class=&quot;js_darkmode__282 js_darkmode__text__644 list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;section class=&quot;js_darkmode__text__646&quot;&gt;&lt;span class=&quot;js_darkmode__text__647&quot;&gt;•&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;text-align: left;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;color: #576B95;&quot; class=&quot;js_darkmode__284 js_darkmode__text__648&quot;&gt;&lt;span class=&quot;js_darkmode__text__649&quot;&gt;14.1.1&lt;/span&gt;&lt;sup style=&quot; box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-size: 10.5px;line-height: 0; vertical-align: baseline;top: -0.5em; &quot; class=&quot;js_darkmode__285 js_darkmode__text__650&quot;&gt;&lt;span class=&quot;js_darkmode__text__651&quot;&gt;[85]&lt;/span&gt;&lt;/sup&gt;&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;section class=&quot;js_darkmode__text__653&quot;&gt;&lt;span class=&quot;js_darkmode__text__654&quot;&gt;•&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;text-align: left;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;color: #576B95;&quot; class=&quot;js_darkmode__287 js_darkmode__text__655&quot;&gt;&lt;span class=&quot;js_darkmode__text__656&quot;&gt;DataDog/dd-trace-dotnet&lt;/span&gt;&lt;sup style=&quot; box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-size: 10.5px;line-height: 0; vertical-align: baseline;top: -0.5em; &quot; class=&quot;js_darkmode__288 js_darkmode__text__657&quot;&gt;&lt;span class=&quot;js_darkmode__text__658&quot;&gt;[86]&lt;/span&gt;&lt;/sup&gt;&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;ul style=&quot;list-style-type: circle;&quot; class=&quot;js_darkmode__289 js_darkmode__text__659 list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;section class=&quot;js_darkmode__text__661&quot;&gt;&lt;span class=&quot;js_darkmode__text__662&quot;&gt;•&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;text-align: left;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;color: #576B95;&quot; class=&quot;js_darkmode__291 js_darkmode__text__663&quot;&gt;&lt;span class=&quot;js_darkmode__text__664&quot;&gt;v3.43.0&lt;/span&gt;&lt;sup style=&quot; box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-size: 10.5px;line-height: 0; vertical-align: baseline;top: -0.5em; &quot; class=&quot;js_darkmode__292 js_darkmode__text__665&quot;&gt;&lt;span class=&quot;js_darkmode__text__666&quot;&gt;[87]&lt;/span&gt;&lt;/sup&gt;&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;section class=&quot;js_darkmode__text__668&quot;&gt;&lt;span class=&quot;js_darkmode__text__669&quot;&gt;•&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;text-align: left;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;color: #576B95;&quot; class=&quot;js_darkmode__294 js_darkmode__text__670&quot;&gt;&lt;span class=&quot;js_darkmode__text__671&quot;&gt;dotnet/诊断&lt;/span&gt;&lt;sup style=&quot; box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-size: 10.5px;line-height: 0; vertical-align: baseline;top: -0.5em; &quot; class=&quot;js_darkmode__295 js_darkmode__text__672&quot;&gt;&lt;span class=&quot;js_darkmode__text__673&quot;&gt;[88]&lt;/span&gt;&lt;/sup&gt;&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;ul style=&quot;list-style-type: circle;&quot; class=&quot;js_darkmode__296 js_darkmode__text__674 list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;section class=&quot;js_darkmode__text__676&quot;&gt;&lt;span class=&quot;js_darkmode__text__677&quot;&gt;•&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;text-align: left;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;color: #576B95;&quot; class=&quot;js_darkmode__298 js_darkmode__text__678&quot;&gt;&lt;span class=&quot;js_darkmode__text__679&quot;&gt;v10.0.721401&lt;/span&gt;&lt;sup style=&quot; box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-size: 10.5px;line-height: 0; vertical-align: baseline;top: -0.5em; &quot; class=&quot;js_darkmode__299 js_darkmode__text__680&quot;&gt;&lt;span class=&quot;js_darkmode__text__681&quot;&gt;[89]&lt;/span&gt;&lt;/sup&gt;&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;section class=&quot;js_darkmode__text__683&quot;&gt;&lt;span class=&quot;js_darkmode__text__684&quot;&gt;•&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;text-align: left;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;color: #576B95;&quot; class=&quot;js_darkmode__301 js_darkmode__text__685&quot;&gt;&lt;span class=&quot;js_darkmode__text__686&quot;&gt;dotnet/SqlClient&lt;/span&gt;&lt;sup style=&quot; box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-size: 10.5px;line-height: 0; vertical-align: baseline;top: -0.5em; &quot; class=&quot;js_darkmode__302 js_darkmode__text__687&quot;&gt;&lt;span class=&quot;js_darkmode__text__688&quot;&gt;[90]&lt;/span&gt;&lt;/sup&gt;&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;ul style=&quot;list-style-type: circle;&quot; class=&quot;js_darkmode__303 js_darkmode__text__689 list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;section class=&quot;js_darkmode__text__691&quot;&gt;&lt;span class=&quot;js_darkmode__text__692&quot;&gt;•&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;text-align: left;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;color: #576B95;&quot; class=&quot;js_darkmode__305 js_darkmode__text__693&quot;&gt;&lt;span class=&quot;js_darkmode__text__694&quot;&gt;v6.1.5&lt;/span&gt;&lt;sup style=&quot; box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-size: 10.5px;line-height: 0; vertical-align: baseline;top: -0.5em; &quot; class=&quot;js_darkmode__306 js_darkmode__text__695&quot;&gt;&lt;span class=&quot;js_darkmode__text__696&quot;&gt;[91]&lt;/span&gt;&lt;/sup&gt;&lt;/span&gt;&lt;span class=&quot;js_darkmode__text__697&quot;&gt;，&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;text-align: left;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;color: #576B95;&quot; class=&quot;js_darkmode__307 js_darkmode__text__698&quot;&gt;&lt;span class=&quot;js_darkmode__text__699&quot;&gt;v7.0.1&lt;/span&gt;&lt;sup style=&quot; box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-size: 10.5px;line-height: 0; vertical-align: baseline;top: -0.5em; &quot; class=&quot;js_darkmode__308 js_darkmode__text__700&quot;&gt;&lt;span class=&quot;js_darkmode__text__701&quot;&gt;[92]&lt;/span&gt;&lt;/sup&gt;&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;section class=&quot;js_darkmode__text__703&quot;&gt;&lt;span class=&quot;js_darkmode__text__704&quot;&gt;•&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;text-align: left;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;color: #576B95;&quot; class=&quot;js_darkmode__310 js_darkmode__text__705&quot;&gt;&lt;span class=&quot;js_darkmode__text__706&quot;&gt;googleapis/google-cloud-dotnet&lt;/span&gt;&lt;sup style=&quot; box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-size: 10.5px;line-height: 0; vertical-align: baseline;top: -0.5em; &quot; class=&quot;js_darkmode__311 js_darkmode__text__707&quot;&gt;&lt;span class=&quot;js_darkmode__text__708&quot;&gt;[93]&lt;/span&gt;&lt;/sup&gt;&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;ul style=&quot;list-style-type: circle;&quot; class=&quot;js_darkmode__312 js_darkmode__text__709 list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;section class=&quot;js_darkmode__text__711&quot;&gt;&lt;span class=&quot;js_darkmode__text__712&quot;&gt;•&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;text-align: left;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;color: #576B95;&quot; class=&quot;js_darkmode__314 js_darkmode__text__713&quot;&gt;&lt;span class=&quot;js_darkmode__text__714&quot;&gt;Google.Cloud.Redis.Cluster.V1-1.7.0&lt;/span&gt;&lt;sup style=&quot; box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-size: 10.5px;line-height: 0; vertical-align: baseline;top: -0.5em; &quot; class=&quot;js_darkmode__315 js_darkmode__text__715&quot;&gt;&lt;span class=&quot;js_darkmode__text__716&quot;&gt;[94]&lt;/span&gt;&lt;/sup&gt;&lt;/span&gt;&lt;span class=&quot;js_darkmode__text__717&quot;&gt;，&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;text-align: left;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;color: #576B95;&quot; class=&quot;js_darkmode__316 js_darkmode__text__718&quot;&gt;&lt;span class=&quot;js_darkmode__text__719&quot;&gt;Google.Shopping.Merchant.Products.V1-1.6.0&lt;/span&gt;&lt;sup style=&quot; box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-size: 10.5px;line-height: 0; vertical-align: baseline;top: -0.5em; &quot; class=&quot;js_darkmode__317 js_darkmode__text__720&quot;&gt;&lt;span class=&quot;js_darkmode__text__721&quot;&gt;[95]&lt;/span&gt;&lt;/sup&gt;&lt;/span&gt;&lt;span class=&quot;js_darkmode__text__722&quot;&gt;，&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;text-align: left;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;color: #576B95;&quot; class=&quot;js_darkmode__318 js_darkmode__text__723&quot;&gt;&lt;span class=&quot;js_darkmode__text__724&quot;&gt;Google.Shopping.Merchant.Reports.V1-1.2.0&lt;/span&gt;&lt;sup style=&quot; box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-size: 10.5px;line-height: 0; vertical-align: baseline;top: -0.5em; &quot; class=&quot;js_darkmode__319 js_darkmode__text__725&quot;&gt;&lt;span class=&quot;js_darkmode__text__726&quot;&gt;[96]&lt;/span&gt;&lt;/sup&gt;&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;section class=&quot;js_darkmode__text__728&quot;&gt;&lt;span class=&quot;js_darkmode__text__729&quot;&gt;•&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;text-align: left;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;color: #576B95;&quot; class=&quot;js_darkmode__321 js_darkmode__text__730&quot;&gt;&lt;span class=&quot;js_darkmode__text__731&quot;&gt;grpc/grpc-dotnet&lt;/span&gt;&lt;sup style=&quot; box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-size: 10.5px;line-height: 0; vertical-align: baseline;top: -0.5em; &quot; class=&quot;js_darkmode__322 js_darkmode__text__732&quot;&gt;&lt;span class=&quot;js_darkmode__text__733&quot;&gt;[97]&lt;/span&gt;&lt;/sup&gt;&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;ul style=&quot;list-style-type: circle;&quot; class=&quot;js_darkmode__323 js_darkmode__text__734 list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;section class=&quot;js_darkmode__text__736&quot;&gt;&lt;span class=&quot;js_darkmode__text__737&quot;&gt;•&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;text-align: left;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;color: #576B95;&quot; class=&quot;js_darkmode__325 js_darkmode__text__738&quot;&gt;&lt;span class=&quot;js_darkmode__text__739&quot;&gt;v2.80.0&lt;/span&gt;&lt;sup style=&quot; box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-size: 10.5px;line-height: 0; vertical-align: baseline;top: -0.5em; &quot; class=&quot;js_darkmode__326 js_darkmode__text__740&quot;&gt;&lt;span class=&quot;js_darkmode__text__741&quot;&gt;[98]&lt;/span&gt;&lt;/sup&gt;&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;section class=&quot;js_darkmode__text__743&quot;&gt;&lt;span class=&quot;js_darkmode__text__744&quot;&gt;•&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;text-align: left;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;color: #576B95;&quot; class=&quot;js_darkmode__328 js_darkmode__text__745&quot;&gt;&lt;span class=&quot;js_darkmode__text__746&quot;&gt;icsharpcode/ILSpy&lt;/span&gt;&lt;sup style=&quot; box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-size: 10.5px;line-height: 0; vertical-align: baseline;top: -0.5em; &quot; class=&quot;js_darkmode__329 js_darkmode__text__747&quot;&gt;&lt;span class=&quot;js_darkmode__text__748&quot;&gt;[99]&lt;/span&gt;&lt;/sup&gt;&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;ul style=&quot;list-style-type: circle;&quot; class=&quot;js_darkmode__330 js_darkmode__text__749 list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;section class=&quot;js_darkmode__text__751&quot;&gt;&lt;span class=&quot;js_darkmode__text__752&quot;&gt;•&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;text-align: left;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;color: #576B95;&quot; class=&quot;js_darkmode__332 js_darkmode__text__753&quot;&gt;&lt;span class=&quot;js_darkmode__text__754&quot;&gt;v10.0.1&lt;/span&gt;&lt;sup style=&quot; box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-size: 10.5px;line-height: 0; vertical-align: baseline;top: -0.5em; &quot; class=&quot;js_darkmode__333 js_darkmode__text__755&quot;&gt;&lt;span class=&quot;js_darkmode__text__756&quot;&gt;[100]&lt;/span&gt;&lt;/sup&gt;&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;section class=&quot;js_darkmode__text__758&quot;&gt;&lt;span class=&quot;js_darkmode__text__759&quot;&gt;•&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;text-align: left;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;color: #576B95;&quot; class=&quot;js_darkmode__335 js_darkmode__text__760&quot;&gt;&lt;span class=&quot;js_darkmode__text__761&quot;&gt;微软/Aspire&lt;/span&gt;&lt;sup style=&quot; box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-size: 10.5px;line-height: 0; vertical-align: baseline;top: -0.5em; &quot; class=&quot;js_darkmode__336 js_darkmode__text__762&quot;&gt;&lt;span class=&quot;js_darkmode__text__763&quot;&gt;[101]&lt;/span&gt;&lt;/sup&gt;&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;ul style=&quot;list-style-type: circle;&quot; class=&quot;js_darkmode__337 js_darkmode__text__764 list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;section class=&quot;js_darkmode__text__766&quot;&gt;&lt;span class=&quot;js_darkmode__text__767&quot;&gt;•&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;text-align: left;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;color: #576B95;&quot; class=&quot;js_darkmode__339 js_darkmode__text__768&quot;&gt;&lt;span class=&quot;js_darkmode__text__769&quot;&gt;v13.2.3&lt;/span&gt;&lt;sup style=&quot; box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-size: 10.5px;line-height: 0; vertical-align: baseline;top: -0.5em; &quot; class=&quot;js_darkmode__340 js_darkmode__text__770&quot;&gt;&lt;span class=&quot;js_darkmode__text__771&quot;&gt;[102]&lt;/span&gt;&lt;/sup&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;text-align: left;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;color: #576B95;&quot; class=&quot;js_darkmode__341 js_darkmode__text__772&quot;&gt;&lt;span class=&quot;js_darkmode__text__773&quot;&gt;v13.2.4&lt;/span&gt;&lt;sup style=&quot; box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-size: 10.5px;line-height: 0; vertical-align: baseline;top: -0.5em; &quot; class=&quot;js_darkmode__342 js_darkmode__text__774&quot;&gt;&lt;span class=&quot;js_darkmode__text__775&quot;&gt;[103]&lt;/span&gt;&lt;/sup&gt;&lt;/span&gt;&lt;span class=&quot;js_darkmode__text__776&quot;&gt;，&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;text-align: left;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;color: #576B95;&quot; class=&quot;js_darkmode__343 js_darkmode__text__777&quot;&gt;&lt;span class=&quot;js_darkmode__text__778&quot;&gt;v13.3.0&lt;/span&gt;&lt;sup style=&quot; box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-size: 10.5px;line-height: 0; vertical-align: baseline;top: -0.5em; &quot; class=&quot;js_darkmode__344 js_darkmode__text__779&quot;&gt;&lt;span class=&quot;js_darkmode__text__780&quot;&gt;[104]&lt;/span&gt;&lt;/sup&gt;&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;section class=&quot;js_darkmode__text__782&quot;&gt;&lt;span class=&quot;js_darkmode__text__783&quot;&gt;•&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;text-align: left;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;color: #576B95;&quot; class=&quot;js_darkmode__346 js_darkmode__text__784&quot;&gt;&lt;span class=&quot;js_darkmode__text__785&quot;&gt;microsoft/WindowsAppSDK&lt;/span&gt;&lt;sup style=&quot; box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-size: 10.5px;line-height: 0; vertical-align: baseline;top: -0.5em; &quot; class=&quot;js_darkmode__347 js_darkmode__text__786&quot;&gt;&lt;span class=&quot;js_darkmode__text__787&quot;&gt;[105]&lt;/span&gt;&lt;/sup&gt;&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;ul style=&quot;list-style-type: circle;&quot; class=&quot;js_darkmode__348 js_darkmode__text__788 list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;section class=&quot;js_darkmode__text__790&quot;&gt;&lt;span class=&quot;js_darkmode__text__791&quot;&gt;•&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;text-align: left;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;color: #576B95;&quot; class=&quot;js_darkmode__350 js_darkmode__text__792&quot;&gt;&lt;span class=&quot;js_darkmode__text__793&quot;&gt;v1.8.7&lt;/span&gt;&lt;sup style=&quot; box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-size: 10.5px;line-height: 0; vertical-align: baseline;top: -0.5em; &quot; class=&quot;js_darkmode__351 js_darkmode__text__794&quot;&gt;&lt;span class=&quot;js_darkmode__text__795&quot;&gt;[106]&lt;/span&gt;&lt;/sup&gt;&lt;/span&gt;&lt;span class=&quot;js_darkmode__text__796&quot;&gt;，&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;text-align: left;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;color: #576B95;&quot; class=&quot;js_darkmode__352 js_darkmode__text__797&quot;&gt;&lt;span class=&quot;js_darkmode__text__798&quot;&gt;v2.0.1&lt;/span&gt;&lt;sup style=&quot; box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-size: 10.5px;line-height: 0; vertical-align: baseline;top: -0.5em; &quot; class=&quot;js_darkmode__353 js_darkmode__text__799&quot;&gt;&lt;span class=&quot;js_darkmode__text__800&quot;&gt;[107]&lt;/span&gt;&lt;/sup&gt;&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;section class=&quot;js_darkmode__text__802&quot;&gt;&lt;span class=&quot;js_darkmode__text__803&quot;&gt;•&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;text-align: left;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;color: #576B95;&quot; class=&quot;js_darkmode__355 js_darkmode__text__804&quot;&gt;&lt;span class=&quot;js_darkmode__text__805&quot;&gt;newrelic/newrelic-dotnet-agent&lt;/span&gt;&lt;sup style=&quot; box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-size: 10.5px;line-height: 0; vertical-align: baseline;top: -0.5em; &quot; class=&quot;js_darkmode__356 js_darkmode__text__806&quot;&gt;&lt;span class=&quot;js_darkmode__text__807&quot;&gt;[108]&lt;/span&gt;&lt;/sup&gt;&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;ul style=&quot;list-style-type: circle;&quot; class=&quot;js_darkmode__357 js_darkmode__text__808 list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;section class=&quot;js_darkmode__text__810&quot;&gt;&lt;span class=&quot;js_darkmode__text__811&quot;&gt;•&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;text-align: left;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;color: #576B95;&quot; class=&quot;js_darkmode__359 js_darkmode__text__812&quot;&gt;&lt;span class=&quot;js_darkmode__text__813&quot;&gt;v10.51.0&lt;/span&gt;&lt;sup style=&quot; box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-size: 10.5px;line-height: 0; vertical-align: baseline;top: -0.5em; &quot; class=&quot;js_darkmode__360 js_darkmode__text__814&quot;&gt;&lt;span class=&quot;js_darkmode__text__815&quot;&gt;[109]&lt;/span&gt;&lt;/sup&gt;&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;section class=&quot;js_darkmode__text__817&quot;&gt;&lt;span class=&quot;js_darkmode__text__818&quot;&gt;•&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;text-align: left;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;color: #576B95;&quot; class=&quot;js_darkmode__362 js_darkmode__text__819&quot;&gt;&lt;span class=&quot;js_darkmode__text__820&quot;&gt;开放遥测/开放遥测点网&lt;/span&gt;&lt;sup style=&quot; box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-size: 10.5px;line-height: 0; vertical-align: baseline;top: -0.5em; &quot; class=&quot;js_darkmode__363 js_darkmode__text__821&quot;&gt;&lt;span class=&quot;js_darkmode__text__822&quot;&gt;[110]&lt;/span&gt;&lt;/sup&gt;&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;ul style=&quot;list-style-type: circle;&quot; class=&quot;js_darkmode__364 js_darkmode__text__823 list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;section class=&quot;js_darkmode__text__825&quot;&gt;&lt;span class=&quot;js_darkmode__text__826&quot;&gt;•&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;text-align: left;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;color: #576B95;&quot; class=&quot;js_darkmode__366 js_darkmode__text__827&quot;&gt;&lt;span class=&quot;js_darkmode__text__828&quot;&gt;core-1.15.3&lt;/span&gt;&lt;sup style=&quot; box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-size: 10.5px;line-height: 0; vertical-align: baseline;top: -0.5em; &quot; class=&quot;js_darkmode__367 js_darkmode__text__829&quot;&gt;&lt;span class=&quot;js_darkmode__text__830&quot;&gt;[111]&lt;/span&gt;&lt;/sup&gt;&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;section class=&quot;js_darkmode__text__832&quot;&gt;&lt;span class=&quot;js_darkmode__text__833&quot;&gt;•&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;text-align: left;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;color: #576B95;&quot; class=&quot;js_darkmode__369 js_darkmode__text__834&quot;&gt;&lt;span class=&quot;js_darkmode__text__835&quot;&gt;开放遥测/开放遥测点网贡献&lt;/span&gt;&lt;sup style=&quot; box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-size: 10.5px;line-height: 0; vertical-align: baseline;top: -0.5em; &quot; class=&quot;js_darkmode__370 js_darkmode__text__836&quot;&gt;&lt;span class=&quot;js_darkmode__text__837&quot;&gt;[112]&lt;/span&gt;&lt;/sup&gt;&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;ul style=&quot;list-style-type: circle;&quot; class=&quot;js_darkmode__371 js_darkmode__text__838 list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;section class=&quot;js_darkmode__text__840&quot;&gt;&lt;span class=&quot;js_darkmode__text__841&quot;&gt;•&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;text-align: left;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;color: #576B95;&quot; class=&quot;js_darkmode__373 js_darkmode__text__842&quot;&gt;&lt;span class=&quot;js_darkmode__text__843&quot;&gt;Exporter.Instana-1.1.0&lt;/span&gt;&lt;sup style=&quot; box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-size: 10.5px;line-height: 0; vertical-align: baseline;top: -0.5em; &quot; class=&quot;js_darkmode__374 js_darkmode__text__844&quot;&gt;&lt;span class=&quot;js_darkmode__text__845&quot;&gt;[113]&lt;/span&gt;&lt;/sup&gt;&lt;/span&gt;&lt;span class=&quot;js_darkmode__text__846&quot;&gt;，&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;text-align: left;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;color: #576B95;&quot; class=&quot;js_darkmode__375 js_darkmode__text__847&quot;&gt;&lt;span class=&quot;js_darkmode__text__848&quot;&gt;PersistentStorage-1.0。 3&lt;/span&gt;&lt;sup style=&quot; box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-size: 10.5px;line-height: 0; vertical-align: baseline;top: -0.5em; &quot; class=&quot;js_darkmode__376 js_darkmode__text__849&quot;&gt;&lt;span class=&quot;js_darkmode__text__850&quot;&gt;[114]&lt;/span&gt;&lt;/sup&gt;&lt;/span&gt;&lt;span class=&quot;js_darkmode__text__851&quot;&gt;，&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;text-align: left;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;color: #576B95;&quot; class=&quot;js_darkmode__377 js_darkmode__text__852&quot;&gt;&lt;span class=&quot;js_darkmode__text__853&quot;&gt;PersistentStorage-1.1. 0&lt;/span&gt;&lt;sup style=&quot; box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-size: 10.5px;line-height: 0; vertical-align: baseline;top: -0.5em; &quot; class=&quot;js_darkmode__378 js_darkmode__text__854&quot;&gt;&lt;span class=&quot;js_darkmode__text__855&quot;&gt;[115]&lt;/span&gt;&lt;/sup&gt;&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;section class=&quot;js_darkmode__text__857&quot;&gt;&lt;span class=&quot;js_darkmode__text__858&quot;&gt;•&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;text-align: left;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;color: #576B95;&quot; class=&quot;js_darkmode__380 js_darkmode__text__859&quot;&gt;&lt;span class=&quot;js_darkmode__text__860&quot;&gt;unoplatform/uno&lt;/span&gt;&lt;sup style=&quot; box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-size: 10.5px;line-height: 0; vertical-align: baseline;top: -0.5em; &quot; class=&quot;js_darkmode__381 js_darkmode__text__861&quot;&gt;&lt;span class=&quot;js_darkmode__text__862&quot;&gt;[116]&lt;/span&gt;&lt;/sup&gt;&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;ul style=&quot;list-style-type: circle;&quot; class=&quot;js_darkmode__382 js_darkmode__text__863 list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;section class=&quot;js_darkmode__text__865&quot;&gt;&lt;span class=&quot;js_darkmode__text__866&quot;&gt;•&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;text-align: left;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;color: #576B95;&quot; class=&quot;js_darkmode__384 js_darkmode__text__867&quot;&gt;&lt;span class=&quot;js_darkmode__text__868&quot;&gt;6.5.229&lt;/span&gt;&lt;sup style=&quot; box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-size: 10.5px;line-height: 0; vertical-align: baseline;top: -0.5em; &quot; class=&quot;js_darkmode__385 js_darkmode__text__869&quot;&gt;&lt;span class=&quot;js_darkmode__text__870&quot;&gt;[117]&lt;/span&gt;&lt;/sup&gt;&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;h2 style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-size: 18.2px;font-weight: bold;margin: 4em auto 2em;text-align: center;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;display: table;padding: 0.3em 1em;color: rgb(255, 255, 255);background: rgb(15, 76, 129);border-radius: 8px;box-shadow: rgba(0, 0, 0, 0.1) 0px 4px 6px;&quot; class=&quot;js_darkmode__386 js_darkmode__text__871&quot;&gt;&lt;span class=&quot;js_darkmode__text__872&quot;&gt;文章、幻灯片及更多内容&lt;/span&gt;&lt;/h2&gt;&lt;h3 style=&quot;box-sizing: border-box;border-width: 0px 0px 1px 4px;border-style: solid solid dashed;border-color: rgb(229, 229, 229) rgb(229, 229, 229) rgb(15, 76, 129) rgb(15, 76, 129);font-size: 16.8px;font-weight: bold;margin: 2em 8px 0.75em 0px;text-align: left;line-height: 1.2;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;padding-left: 12px;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__387 js_darkmode__text__873&quot;&gt;&lt;span class=&quot;js_darkmode__text__874&quot;&gt;Doco 用到 C# 吗？ 2026&lt;/span&gt;&lt;/h3&gt;&lt;p style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);margin: 1.5em 8px;text-align: justify;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;text-indent: 2em;letter-spacing: 0.1em;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__388 js_darkmode__text__875&quot;&gt;&lt;span class=&quot;js_darkmode__text__876&quot;&gt;https://zenn.dev/inuinu/articles/where-is-csharp-used-2026&lt;/span&gt;&lt;/p&gt;&lt;h3 style=&quot;box-sizing: border-box;border-width: 0px 0px 1px 4px;border-style: solid solid dashed;border-color: rgb(229, 229, 229) rgb(229, 229, 229) rgb(15, 76, 129) rgb(15, 76, 129);font-size: 16.8px;font-weight: bold;margin: 2em 8px 0.75em 0px;text-align: left;line-height: 1.2;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;padding-left: 12px;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__389 js_darkmode__text__877&quot;&gt;&lt;span class=&quot;js_darkmode__text__878&quot;&gt;理解 Microsoft 代理框架的 Harness 机制及 LM Studio 和本地大型语言模型的执行流程&lt;/span&gt;&lt;/h3&gt;&lt;p style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);margin: 1.5em 8px;text-align: justify;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;text-indent: 2em;letter-spacing: 0.1em;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__390 js_darkmode__text__879&quot;&gt;&lt;span class=&quot;js_darkmode__text__880&quot;&gt;https://zenn.dev/yy7613/articles/74265daaf7929a&lt;/span&gt;&lt;/p&gt;&lt;h3 style=&quot;box-sizing: border-box;border-width: 0px 0px 1px 4px;border-style: solid solid dashed;border-color: rgb(229, 229, 229) rgb(229, 229, 229) rgb(15, 76, 129) rgb(15, 76, 129);font-size: 16.8px;font-weight: bold;margin: 2em 8px 0.75em 0px;text-align: left;line-height: 1.2;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;padding-left: 12px;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__391 js_darkmode__text__881&quot;&gt;&lt;span class=&quot;js_darkmode__text__882&quot;&gt;AI 子代理“即将登陆”Visual Studio Copilot——Visual Studio 杂志&lt;/span&gt;&lt;/h3&gt;&lt;p style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);margin: 1.5em 8px;text-align: justify;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;text-indent: 2em;letter-spacing: 0.1em;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__392 js_darkmode__text__883&quot;&gt;&lt;span class=&quot;js_darkmode__text__884&quot;&gt;https://visualstudiomagazine.com/articles/2026/05/06/ai-subagents-coming-to-visual-studio-ides-copilot.aspx&lt;/span&gt;&lt;/p&gt;&lt;h3 style=&quot;box-sizing: border-box;border-width: 0px 0px 1px 4px;border-style: solid solid dashed;border-color: rgb(229, 229, 229) rgb(229, 229, 229) rgb(15, 76, 129) rgb(15, 76, 129);font-size: 16.8px;font-weight: bold;margin: 2em 8px 0.75em 0px;text-align: left;line-height: 1.2;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;padding-left: 12px;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__393 js_darkmode__text__885&quot;&gt;&lt;span class=&quot;js_darkmode__text__886&quot;&gt;Microsoft代理框架中的持久工作流 - .NET 博客&lt;/span&gt;&lt;/h3&gt;&lt;p style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);margin: 1.5em 8px;text-align: justify;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;text-indent: 2em;letter-spacing: 0.1em;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__394 js_darkmode__text__887&quot;&gt;&lt;span class=&quot;js_darkmode__text__888&quot;&gt;https://devblogs.microsoft.com/dotnet/durable-workflows-in-microsoft-agent-framework/&lt;/span&gt;&lt;/p&gt;&lt;h3 style=&quot;box-sizing: border-box;border-width: 0px 0px 1px 4px;border-style: solid solid dashed;border-color: rgb(229, 229, 229) rgb(229, 229, 229) rgb(15, 76, 129) rgb(15, 76, 129);font-size: 16.8px;font-weight: bold;margin: 2em 8px 0.75em 0px;text-align: left;line-height: 1.2;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;padding-left: 12px;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__395 js_darkmode__text__889&quot;&gt;&lt;span class=&quot;js_darkmode__text__890&quot;&gt;试试带本地LLM的Microsoft代理框架第13部分(中间件)&lt;/span&gt;&lt;/h3&gt;&lt;p style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);margin: 1.5em 8px;text-align: justify;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;text-indent: 2em;letter-spacing: 0.1em;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__396 js_darkmode__text__891&quot;&gt;&lt;span class=&quot;js_darkmode__text__892&quot;&gt;https://zenn.dev/yy7613/articles/bb5fa8cdb6bf64&lt;/span&gt;&lt;/p&gt;&lt;h3 style=&quot;box-sizing: border-box;border-width: 0px 0px 1px 4px;border-style: solid solid dashed;border-color: rgb(229, 229, 229) rgb(229, 229, 229) rgb(15, 76, 129) rgb(15, 76, 129);font-size: 16.8px;font-weight: bold;margin: 2em 8px 0.75em 0px;text-align: left;line-height: 1.2;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;padding-left: 12px;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__397 js_darkmode__text__893&quot;&gt;&lt;span class=&quot;js_darkmode__text__894&quot;&gt;Microsoft代理框架 - AI构建模块 第三部分 - .NET博客&lt;/span&gt;&lt;/h3&gt;&lt;p style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);margin: 1.5em 8px;text-align: justify;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;text-indent: 2em;letter-spacing: 0.1em;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__398 js_darkmode__text__895&quot;&gt;&lt;span class=&quot;js_darkmode__text__896&quot;&gt;https://devblogs.microsoft.com/dotnet/microsoft-agent-framework-building-blocks-for-ai-part-3/&lt;/span&gt;&lt;/p&gt;&lt;h3 style=&quot;box-sizing: border-box;border-width: 0px 0px 1px 4px;border-style: solid solid dashed;border-color: rgb(229, 229, 229) rgb(229, 229, 229) rgb(15, 76, 129) rgb(15, 76, 129);font-size: 16.8px;font-weight: bold;margin: 2em 8px 0.75em 0px;text-align: left;line-height: 1.2;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;padding-left: 12px;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__399 js_darkmode__text__897&quot;&gt;&lt;span class=&quot;js_darkmode__text__898&quot;&gt;绑定列举&lt;/span&gt;&lt;/h3&gt;&lt;p style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);margin: 1.5em 8px;text-align: justify;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;text-indent: 2em;letter-spacing: 0.1em;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__400 js_darkmode__text__899&quot;&gt;&lt;span class=&quot;js_darkmode__text__900&quot;&gt;https://zenn.dev/shinta0806/articles/enum-binding&lt;/span&gt;&lt;/p&gt;&lt;h3 style=&quot;box-sizing: border-box;border-width: 0px 0px 1px 4px;border-style: solid solid dashed;border-color: rgb(229, 229, 229) rgb(229, 229, 229) rgb(15, 76, 129) rgb(15, 76, 129);font-size: 16.8px;font-weight: bold;margin: 2em 8px 0.75em 0px;text-align: left;line-height: 1.2;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;padding-left: 12px;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__401 js_darkmode__text__901&quot;&gt;&lt;span class=&quot;js_darkmode__text__902&quot;&gt;用 Blazor WebAssembly 制作的工程师诊断应用 - 本地化、通用协议和 cookie 同意&lt;/span&gt;&lt;/h3&gt;&lt;p style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);margin: 1.5em 8px;text-align: justify;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;text-indent: 2em;letter-spacing: 0.1em;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__402 js_darkmode__text__903&quot;&gt;&lt;span class=&quot;js_darkmode__text__904&quot;&gt;https://zenn.dev/nekojoker/articles/c9f17b69690031&lt;/span&gt;&lt;/p&gt;&lt;h3 style=&quot;box-sizing: border-box;border-width: 0px 0px 1px 4px;border-style: solid solid dashed;border-color: rgb(229, 229, 229) rgb(229, 229, 229) rgb(15, 76, 129) rgb(15, 76, 129);font-size: 16.8px;font-weight: bold;margin: 2em 8px 0.75em 0px;text-align: left;line-height: 1.2;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;padding-left: 12px;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__403 js_darkmode__text__905&quot;&gt;&lt;span class=&quot;js_darkmode__text__906&quot;&gt;[C#] CSharpier 推荐&lt;/span&gt;&lt;/h3&gt;&lt;p style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);margin: 1.5em 8px;text-align: justify;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;text-indent: 2em;letter-spacing: 0.1em;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__404 js_darkmode__text__907&quot;&gt;&lt;span class=&quot;js_darkmode__text__908&quot;&gt;https://zenn.dev/nuskey/articles/csharpier-is-good&lt;/span&gt;&lt;/p&gt;&lt;h3 style=&quot;box-sizing: border-box;border-width: 0px 0px 1px 4px;border-style: solid solid dashed;border-color: rgb(229, 229, 229) rgb(229, 229, 229) rgb(15, 76, 129) rgb(15, 76, 129);font-size: 16.8px;font-weight: bold;margin: 2em 8px 0.75em 0px;text-align: left;line-height: 1.2;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;padding-left: 12px;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__405 js_darkmode__text__909&quot;&gt;&lt;span class=&quot;js_darkmode__text__910&quot;&gt;ASP.NET 生产中核心 Cookie 大小限制：原因与修复&lt;/span&gt;&lt;/h3&gt;&lt;p style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);margin: 1.5em 8px;text-align: justify;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;text-indent: 2em;letter-spacing: 0.1em;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__406 js_darkmode__text__911&quot;&gt;&lt;span class=&quot;js_darkmode__text__912&quot;&gt;https://duendesoftware.com/blog/20260429-aspnet-core-cookie-size-limits&lt;/span&gt;&lt;/p&gt;&lt;h3 style=&quot;box-sizing: border-box;border-width: 0px 0px 1px 4px;border-style: solid solid dashed;border-color: rgb(229, 229, 229) rgb(229, 229, 229) rgb(15, 76, 129) rgb(15, 76, 129);font-size: 16.8px;font-weight: bold;margin: 2em 8px 0.75em 0px;text-align: left;line-height: 1.2;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;padding-left: 12px;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__407 js_darkmode__text__913&quot;&gt;&lt;span class=&quot;js_darkmode__text__914&quot;&gt;渴望WPF界面，最终回归.NET MAUI Blazor Hybrid - Qiita的故事&lt;/span&gt;&lt;/h3&gt;&lt;p style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);margin: 1.5em 8px;text-align: justify;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;text-indent: 2em;letter-spacing: 0.1em;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__408 js_darkmode__text__915&quot;&gt;&lt;span class=&quot;js_darkmode__text__916&quot;&gt;https://qiita.com/maki_s/items/527469f0ff9fa94cefb2&lt;/span&gt;&lt;/p&gt;&lt;h3 style=&quot;box-sizing: border-box;border-width: 0px 0px 1px 4px;border-style: solid solid dashed;border-color: rgb(229, 229, 229) rgb(229, 229, 229) rgb(15, 76, 129) rgb(15, 76, 129);font-size: 16.8px;font-weight: bold;margin: 2em 8px 0.75em 0px;text-align: left;line-height: 1.2;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;padding-left: 12px;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__409 js_darkmode__text__917&quot;&gt;&lt;span class=&quot;js_darkmode__text__918&quot;&gt;. 如何在 .NET - Qiita 中使用 OpenAI API&lt;/span&gt;&lt;/h3&gt;&lt;p style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);margin: 1.5em 8px;text-align: justify;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;text-indent: 2em;letter-spacing: 0.1em;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__410 js_darkmode__text__919&quot;&gt;&lt;span class=&quot;js_darkmode__text__920&quot;&gt;https://qiita.com/qOpenDev/items/fc3ca29355956c1d0381&lt;/span&gt;&lt;/p&gt;&lt;h3 style=&quot;box-sizing: border-box;border-width: 0px 0px 1px 4px;border-style: solid solid dashed;border-color: rgb(229, 229, 229) rgb(229, 229, 229) rgb(15, 76, 129) rgb(15, 76, 129);font-size: 16.8px;font-weight: bold;margin: 2em 8px 0.75em 0px;text-align: left;line-height: 1.2;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;padding-left: 12px;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__411 js_darkmode__text__921&quot;&gt;&lt;span class=&quot;js_darkmode__text__922&quot;&gt;. 如何通过API将.NET包上传到NuGet&lt;/span&gt;&lt;/h3&gt;&lt;p style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);margin: 1.5em 8px;text-align: justify;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;text-indent: 2em;letter-spacing: 0.1em;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__412 js_darkmode__text__923&quot;&gt;&lt;span class=&quot;js_darkmode__text__924&quot;&gt;https://zenn.dev/loach/articles/upload-nuget&lt;/span&gt;&lt;/p&gt;&lt;h3 style=&quot;box-sizing: border-box;border-width: 0px 0px 1px 4px;border-style: solid solid dashed;border-color: rgb(229, 229, 229) rgb(229, 229, 229) rgb(15, 76, 129) rgb(15, 76, 129);font-size: 16.8px;font-weight: bold;margin: 2em 8px 0.75em 0px;text-align: left;line-height: 1.2;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;padding-left: 12px;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__413 js_darkmode__text__925&quot;&gt;&lt;span class=&quot;js_darkmode__text__926&quot;&gt;解释SQL和LINQ中的范畴论 - Qiita&lt;/span&gt;&lt;/h3&gt;&lt;p style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);margin: 1.5em 8px;text-align: justify;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;text-indent: 2em;letter-spacing: 0.1em;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__414 js_darkmode__text__927&quot;&gt;&lt;span class=&quot;js_darkmode__text__928&quot;&gt;https://qiita.com/yaju/items/38a283f4b1fba434f620&lt;/span&gt;&lt;/p&gt;&lt;h3 style=&quot;box-sizing: border-box;border-width: 0px 0px 1px 4px;border-style: solid solid dashed;border-color: rgb(229, 229, 229) rgb(229, 229, 229) rgb(15, 76, 129) rgb(15, 76, 129);font-size: 16.8px;font-weight: bold;margin: 2em 8px 0.75em 0px;text-align: left;line-height: 1.2;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;padding-left: 12px;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__415 js_darkmode__text__929&quot;&gt;&lt;span class=&quot;js_darkmode__text__930&quot;&gt;[Blazor + Syncfusion] 我在实现以SfGrid为中心的商业应用列表界面后——Qiita的感受&lt;/span&gt;&lt;/h3&gt;&lt;p style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);margin: 1.5em 8px;text-align: justify;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;text-indent: 2em;letter-spacing: 0.1em;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__416 js_darkmode__text__931&quot;&gt;&lt;span class=&quot;js_darkmode__text__932&quot;&gt;https://qiita.com/af-dev-hub/items/79eb00a4306a01a2a12f&lt;/span&gt;&lt;/p&gt;&lt;h3 style=&quot;box-sizing: border-box;border-width: 0px 0px 1px 4px;border-style: solid solid dashed;border-color: rgb(229, 229, 229) rgb(229, 229, 229) rgb(15, 76, 129) rgb(15, 76, 129);font-size: 16.8px;font-weight: bold;margin: 2em 8px 0.75em 0px;text-align: left;line-height: 1.2;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;padding-left: 12px;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__417 js_darkmode__text__933&quot;&gt;&lt;span class=&quot;js_darkmode__text__934&quot;&gt;[树莓派5] 从Antigravity远程SSH连接开发C#&lt;/span&gt;&lt;/h3&gt;&lt;p style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);margin: 1.5em 8px;text-align: justify;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;text-indent: 2em;letter-spacing: 0.1em;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__418 js_darkmode__text__935&quot;&gt;&lt;span class=&quot;js_darkmode__text__936&quot;&gt;https://zenn.dev/minenote/articles/2c93232bab8b61&lt;/span&gt;&lt;/p&gt;&lt;h3 style=&quot;box-sizing: border-box;border-width: 0px 0px 1px 4px;border-style: solid solid dashed;border-color: rgb(229, 229, 229) rgb(229, 229, 229) rgb(15, 76, 129) rgb(15, 76, 129);font-size: 16.8px;font-weight: bold;margin: 2em 8px 0.75em 0px;text-align: left;line-height: 1.2;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;padding-left: 12px;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__419 js_darkmode__text__937&quot;&gt;&lt;span class=&quot;js_darkmode__text__938&quot;&gt;现金策略深度比较&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;text-decoration:line-through;&quot;&gt;&lt;span class=&quot;js_darkmode__text__940&quot;&gt;专注于懒惰现金&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;js_darkmode__text__941&quot;&gt;&amp;nbsp;- Qiita&lt;/span&gt;&lt;/h3&gt;&lt;p style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);margin: 1.5em 8px;text-align: justify;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;text-indent: 2em;letter-spacing: 0.1em;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__421 js_darkmode__text__942&quot;&gt;&lt;span class=&quot;js_darkmode__text__943&quot;&gt;https://qiita.com/Mitsuki0003/items/260d0f64cdc580de181c&lt;/span&gt;&lt;/p&gt;&lt;h3 style=&quot;box-sizing: border-box;border-width: 0px 0px 1px 4px;border-style: solid solid dashed;border-color: rgb(229, 229, 229) rgb(229, 229, 229) rgb(15, 76, 129) rgb(15, 76, 129);font-size: 16.8px;font-weight: bold;margin: 2em 8px 0.75em 0px;text-align: left;line-height: 1.2;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;padding-left: 12px;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__422 js_darkmode__text__944&quot;&gt;&lt;span class=&quot;js_darkmode__text__945&quot;&gt;用.NET代码生成模板尝试的多个代理开发循环&lt;/span&gt;&lt;/h3&gt;&lt;p style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);margin: 1.5em 8px;text-align: justify;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;text-indent: 2em;letter-spacing: 0.1em;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__423 js_darkmode__text__946&quot;&gt;&lt;span class=&quot;js_darkmode__text__947&quot;&gt;https://zenn.dev/tomokusaba/articles/14f2373c51e1f2&lt;/span&gt;&lt;/p&gt;&lt;h3 style=&quot;box-sizing: border-box;border-width: 0px 0px 1px 4px;border-style: solid solid dashed;border-color: rgb(229, 229, 229) rgb(229, 229, 229) rgb(15, 76, 129) rgb(15, 76, 129);font-size: 16.8px;font-weight: bold;margin: 2em 8px 0.75em 0px;text-align: left;line-height: 1.2;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;padding-left: 12px;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__424 js_darkmode__text__948&quot;&gt;&lt;span class=&quot;js_darkmode__text__949&quot;&gt;在.NET中评估CRON和RRule表达式 - Gérald Barré&lt;/span&gt;&lt;/h3&gt;&lt;p style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);margin: 1.5em 8px;text-align: justify;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;text-indent: 2em;letter-spacing: 0.1em;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__425 js_darkmode__text__950&quot;&gt;&lt;span class=&quot;js_darkmode__text__951&quot;&gt;https://www.meziantou.net/evaluating-cron-and-rrule-expressions-in-dotnet.htm&lt;/span&gt;&lt;/p&gt;&lt;h3 style=&quot;box-sizing: border-box;border-width: 0px 0px 1px 4px;border-style: solid solid dashed;border-color: rgb(229, 229, 229) rgb(229, 229, 229) rgb(15, 76, 129) rgb(15, 76, 129);font-size: 16.8px;font-weight: bold;margin: 2em 8px 0.75em 0px;text-align: left;line-height: 1.2;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;padding-left: 12px;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__426 js_darkmode__text__952&quot;&gt;&lt;span class=&quot;js_darkmode__text__953&quot;&gt;在C&lt;a class=&quot;wx_topic_link js_darkmode__text__954&quot; style=&quot;color: #576B95 !important;&quot; data-topic=&quot;1&quot; data-recommend=&quot;&quot;&gt;#中用Facet&lt;/a&gt;&amp;nbsp;.NET：.NET的TypeScript工具类型&lt;/span&gt;&lt;/h3&gt;&lt;p style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);margin: 1.5em 8px;text-align: justify;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;text-indent: 2em;letter-spacing: 0.1em;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__427 js_darkmode__text__955&quot;&gt;&lt;span class=&quot;js_darkmode__text__956&quot;&gt;https://tim-maes.com/blog/2026/04/17/pick-and-omit-in-csharp-with-facet/&lt;/span&gt;&lt;/p&gt;&lt;h3 style=&quot;box-sizing: border-box;border-width: 0px 0px 1px 4px;border-style: solid solid dashed;border-color: rgb(229, 229, 229) rgb(229, 229, 229) rgb(15, 76, 129) rgb(15, 76, 129);font-size: 16.8px;font-weight: bold;margin: 2em 8px 0.75em 0px;text-align: left;line-height: 1.2;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;padding-left: 12px;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__428 js_darkmode__text__957&quot;&gt;&lt;span class=&quot;js_darkmode__text__958&quot;&gt;.NET 11 预览版3 基于文件的应用文件拆分&lt;/span&gt;&lt;/h3&gt;&lt;p style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);margin: 1.5em 8px;text-align: justify;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;text-indent: 2em;letter-spacing: 0.1em;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__429 js_darkmode__text__959&quot;&gt;&lt;span class=&quot;js_darkmode__text__960&quot;&gt;https://zenn.dev/prozolic/articles/a861cc1da6b0e1&lt;/span&gt;&lt;/p&gt;&lt;h3 style=&quot;box-sizing: border-box;border-width: 0px 0px 1px 4px;border-style: solid solid dashed;border-color: rgb(229, 229, 229) rgb(229, 229, 229) rgb(15, 76, 129) rgb(15, 76, 129);font-size: 16.8px;font-weight: bold;margin: 2em 8px 0.75em 0px;text-align: left;line-height: 1.2;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;padding-left: 12px;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__430 js_darkmode__text__961&quot;&gt;&lt;span class=&quot;js_darkmode__text__962&quot;&gt;让我们读ZString (4) 缓冲区 - Qiita&lt;/span&gt;&lt;/h3&gt;&lt;p style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);margin: 1.5em 8px;text-align: justify;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;text-indent: 2em;letter-spacing: 0.1em;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__431 js_darkmode__text__963&quot;&gt;&lt;span class=&quot;js_darkmode__text__964&quot;&gt;https://qiita.com/kuto110/items/75c0336a25c6d0afd1af&lt;/span&gt;&lt;/p&gt;&lt;h3 style=&quot;box-sizing: border-box;border-width: 0px 0px 1px 4px;border-style: solid solid dashed;border-color: rgb(229, 229, 229) rgb(229, 229, 229) rgb(15, 76, 129) rgb(15, 76, 129);font-size: 16.8px;font-weight: bold;margin: 2em 8px 0.75em 0px;text-align: left;line-height: 1.2;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;padding-left: 12px;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__432 js_darkmode__text__965&quot;&gt;&lt;span class=&quot;js_darkmode__text__966&quot;&gt;System.CommandLine 稳定版发布 - Qiita&lt;/span&gt;&lt;/h3&gt;&lt;p style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);margin: 1.5em 8px;text-align: justify;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;text-indent: 2em;letter-spacing: 0.1em;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__433 js_darkmode__text__967&quot;&gt;&lt;span class=&quot;js_darkmode__text__968&quot;&gt;https://qiita.com/KM_20005/items/94d1db2f49c7436d598b&lt;/span&gt;&lt;/p&gt;&lt;h3 style=&quot;box-sizing: border-box;border-width: 0px 0px 1px 4px;border-style: solid solid dashed;border-color: rgb(229, 229, 229) rgb(229, 229, 229) rgb(15, 76, 129) rgb(15, 76, 129);font-size: 16.8px;font-weight: bold;margin: 2em 8px 0.75em 0px;text-align: left;line-height: 1.2;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;padding-left: 12px;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__434 js_darkmode__text__969&quot;&gt;&lt;span class=&quot;js_darkmode__text__970&quot;&gt;C#：自动将只调用一次的动作集中&lt;/span&gt;&lt;/h3&gt;&lt;p style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);margin: 1.5em 8px;text-align: justify;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;text-indent: 2em;letter-spacing: 0.1em;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__435 js_darkmode__text__971&quot;&gt;&lt;span class=&quot;js_darkmode__text__972&quot;&gt;https://zenn.dev/ruccho/articles/csharp-pooled-actions&lt;/span&gt;&lt;/p&gt;&lt;h3 style=&quot;box-sizing: border-box;border-width: 0px 0px 1px 4px;border-style: solid solid dashed;border-color: rgb(229, 229, 229) rgb(229, 229, 229) rgb(15, 76, 129) rgb(15, 76, 129);font-size: 16.8px;font-weight: bold;margin: 2em 8px 0.75em 0px;text-align: left;line-height: 1.2;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;padding-left: 12px;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__436 js_darkmode__text__973&quot;&gt;&lt;span class=&quot;js_darkmode__text__974&quot;&gt;构建一个由 . NET的可组合AI协议栈——.NET博客&lt;/span&gt;&lt;/h3&gt;&lt;p style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);margin: 1.5em 8px;text-align: justify;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;text-indent: 2em;letter-spacing: 0.1em;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__437 js_darkmode__text__975&quot;&gt;&lt;span class=&quot;js_darkmode__text__976&quot;&gt;https://devblogs.microsoft.com/dotnet/building-ai-conference-app-dotnet-composable-stack/&lt;/span&gt;&lt;/p&gt;&lt;h3 style=&quot;box-sizing: border-box;border-width: 0px 0px 1px 4px;border-style: solid solid dashed;border-color: rgb(229, 229, 229) rgb(229, 229, 229) rgb(15, 76, 129) rgb(15, 76, 129);font-size: 16.8px;font-weight: bold;margin: 2em 8px 0.75em 0px;text-align: left;line-height: 1.2;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;padding-left: 12px;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__438 js_darkmode__text__977&quot;&gt;&lt;span class=&quot;js_darkmode__text__978&quot;&gt;试试带本地LLM的Microsoft代理框架第12部分(结构化输出)&lt;/span&gt;&lt;/h3&gt;&lt;p style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);margin: 1.5em 8px;text-align: justify;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;text-indent: 2em;letter-spacing: 0.1em;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__439 js_darkmode__text__979&quot;&gt;&lt;span class=&quot;js_darkmode__text__980&quot;&gt;https://zenn.dev/yy7613/articles/27d7ed3c97ff1a&lt;/span&gt;&lt;/p&gt;&lt;h3 style=&quot;box-sizing: border-box;border-width: 0px 0px 1px 4px;border-style: solid solid dashed;border-color: rgb(229, 229, 229) rgb(229, 229, 229) rgb(15, 76, 129) rgb(15, 76, 129);font-size: 16.8px;font-weight: bold;margin: 2em 8px 0.75em 0px;text-align: left;line-height: 1.2;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;padding-left: 12px;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__440 js_darkmode__text__981&quot;&gt;&lt;span class=&quot;js_darkmode__text__982&quot;&gt;联盟类型性能比较：非拳击定制联盟 [C&lt;a class=&quot;wx_topic_link js_darkmode__text__983&quot; style=&quot;color: #576B95 !important;&quot; data-topic=&quot;1&quot; data-recommend=&quot;&quot;&gt;#15预览&lt;/a&gt;]&lt;/span&gt;&lt;/h3&gt;&lt;p style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);margin: 1.5em 8px;text-align: justify;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;text-indent: 2em;letter-spacing: 0.1em;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__441 js_darkmode__text__984&quot;&gt;&lt;span class=&quot;js_darkmode__text__985&quot;&gt;https://zenn.dev/inuinu/articles/csharp-union-performance&lt;/span&gt;&lt;/p&gt;&lt;h3 style=&quot;box-sizing: border-box;border-width: 0px 0px 1px 4px;border-style: solid solid dashed;border-color: rgb(229, 229, 229) rgb(229, 229, 229) rgb(15, 76, 129) rgb(15, 76, 129);font-size: 16.8px;font-weight: bold;margin: 2em 8px 0.75em 0px;text-align: left;line-height: 1.2;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;padding-left: 12px;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__442 js_darkmode__text__986&quot;&gt;&lt;span class=&quot;js_darkmode__text__987&quot;&gt;尝试带本地LLM的Microsoft代理框架第11部分(带AIContextProvider的简化RAG)&lt;/span&gt;&lt;/h3&gt;&lt;p style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);margin: 1.5em 8px;text-align: justify;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;text-indent: 2em;letter-spacing: 0.1em;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__443 js_darkmode__text__988&quot;&gt;&lt;span class=&quot;js_darkmode__text__989&quot;&gt;https://zenn.dev/yy7613/articles/d5b22b11d40fca&lt;/span&gt;&lt;/p&gt;&lt;h3 style=&quot;box-sizing: border-box;border-width: 0px 0px 1px 4px;border-style: solid solid dashed;border-color: rgb(229, 229, 229) rgb(229, 229, 229) rgb(15, 76, 129) rgb(15, 76, 129);font-size: 16.8px;font-weight: bold;margin: 2em 8px 0.75em 0px;text-align: left;line-height: 1.2;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;padding-left: 12px;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__444 js_darkmode__text__990&quot;&gt;&lt;span class=&quot;js_darkmode__text__991&quot;&gt;Azure 上 .NET 和 Postgres 的高性能分布式缓存 - .NET 博客&lt;/span&gt;&lt;/h3&gt;&lt;p style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);margin: 1.5em 8px;text-align: justify;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;text-indent: 2em;letter-spacing: 0.1em;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__445 js_darkmode__text__992&quot;&gt;&lt;span class=&quot;js_darkmode__text__993&quot;&gt;https://devblogs.microsoft.com/dotnet/high-performance-distributed-caching-dotnet-postgres-azure/&lt;/span&gt;&lt;/p&gt;&lt;h3 style=&quot;box-sizing: border-box;border-width: 0px 0px 1px 4px;border-style: solid solid dashed;border-color: rgb(229, 229, 229) rgb(229, 229, 229) rgb(15, 76, 129) rgb(15, 76, 129);font-size: 16.8px;font-weight: bold;margin: 2em 8px 0.75em 0px;text-align: left;line-height: 1.2;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;padding-left: 12px;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__446 js_darkmode__text__994&quot;&gt;&lt;span class=&quot;js_darkmode__text__995&quot;&gt;尝试用 Windows Forms 做 MVVM，结果却陷入自满，且 。 NET 10 可以写出这样的故事——Qiita&lt;/span&gt;&lt;/h3&gt;&lt;p style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);margin: 1.5em 8px;text-align: justify;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;text-indent: 2em;letter-spacing: 0.1em;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__447 js_darkmode__text__996&quot;&gt;&lt;span class=&quot;js_darkmode__text__997&quot;&gt;https://qiita.com/inuta-one/items/4cb48340bdfe32b15592&lt;/span&gt;&lt;/p&gt;&lt;h3 style=&quot;box-sizing: border-box;border-width: 0px 0px 1px 4px;border-style: solid solid dashed;border-color: rgb(229, 229, 229) rgb(229, 229, 229) rgb(15, 76, 129) rgb(15, 76, 129);font-size: 16.8px;font-weight: bold;margin: 2em 8px 0.75em 0px;text-align: left;line-height: 1.2;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;padding-left: 12px;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__448 js_darkmode__text__998&quot;&gt;&lt;span class=&quot;js_darkmode__text__999&quot;&gt;在.NET 10应用中结合API版本管理与OpenAPI - .NET博客&lt;/span&gt;&lt;/h3&gt;&lt;p style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);margin: 1.5em 8px;text-align: justify;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;text-indent: 2em;letter-spacing: 0.1em;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__449 js_darkmode__text__1000&quot;&gt;&lt;span class=&quot;js_darkmode__text__1001&quot;&gt;https://devblogs.microsoft.com/dotnet/api-versioning-in-dotnet-10-applications/&lt;/span&gt;&lt;/p&gt;&lt;h3 style=&quot;box-sizing: border-box;border-width: 0px 0px 1px 4px;border-style: solid solid dashed;border-color: rgb(229, 229, 229) rgb(229, 229, 229) rgb(15, 76, 129) rgb(15, 76, 129);font-size: 16.8px;font-weight: bold;margin: 2em 8px 0.75em 0px;text-align: left;line-height: 1.2;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;padding-left: 12px;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__450 js_darkmode__text__1002&quot;&gt;&lt;span class=&quot;js_darkmode__text__1003&quot;&gt;你目前使用的GitHub Copilot CLI + .NET的自定义代理和技能&lt;/span&gt;&lt;/h3&gt;&lt;p style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);margin: 1.5em 8px;text-align: justify;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;text-indent: 2em;letter-spacing: 0.1em;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__451 js_darkmode__text__1004&quot;&gt;&lt;span class=&quot;js_darkmode__text__1005&quot;&gt;https://zenn.dev/microsoft/articles/github-copilot-dotnet-project&lt;/span&gt;&lt;/p&gt;&lt;h3 style=&quot;box-sizing: border-box;border-width: 0px 0px 1px 4px;border-style: solid solid dashed;border-color: rgb(229, 229, 229) rgb(229, 229, 229) rgb(15, 76, 129) rgb(15, 76, 129);font-size: 16.8px;font-weight: bold;margin: 2em 8px 0.75em 0px;text-align: left;line-height: 1.2;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;padding-left: 12px;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__452 js_darkmode__text__1006&quot;&gt;&lt;span class=&quot;js_darkmode__text__1007&quot;&gt;Entra 验证ID发行实现：含.NET样本的数字ID API&lt;/span&gt;&lt;/h3&gt;&lt;p style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);margin: 1.5em 8px;text-align: justify;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;text-indent: 2em;letter-spacing: 0.1em;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__453 js_darkmode__text__1008&quot;&gt;&lt;span class=&quot;js_darkmode__text__1009&quot;&gt;https://zenn.dev/kumaik/articles/entra-verified-id-dotnet-issuance&lt;/span&gt;&lt;/p&gt;&lt;h3 style=&quot;box-sizing: border-box;border-width: 0px 0px 1px 4px;border-style: solid solid dashed;border-color: rgb(229, 229, 229) rgb(229, 229, 229) rgb(15, 76, 129) rgb(15, 76, 129);font-size: 16.8px;font-weight: bold;margin: 2em 8px 0.75em 0px;text-align: left;line-height: 1.2;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;padding-left: 12px;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__454 js_darkmode__text__1010&quot;&gt;&lt;span class=&quot;js_darkmode__text__1011&quot;&gt;Windows 应用开发 CLI v0.3：新增运行命令和界面命令，以及对打包应用的 dotnet run 支持 -&amp;nbsp;&lt;a class=&quot;wx_topic_link js_darkmode__text__1012&quot; style=&quot;color: #576B95 !important;&quot; data-topic=&quot;1&quot; data-recommend=&quot;&quot;&gt;#ifdef&lt;/a&gt;&amp;nbsp;窗户&lt;/span&gt;&lt;/h3&gt;&lt;p style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);margin: 1.5em 8px;text-align: justify;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;text-indent: 2em;letter-spacing: 0.1em;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__455 js_darkmode__text__1013&quot;&gt;&lt;span class=&quot;js_darkmode__text__1014&quot;&gt;https://devblogs.microsoft.com/ifdef-windows/windows-app-development-cli-v0-3-new-run-and-ui-commands-plus-dotnet-run-support-for-packaged-apps/&lt;/span&gt;&lt;/p&gt;&lt;h3 style=&quot;box-sizing: border-box;border-width: 0px 0px 1px 4px;border-style: solid solid dashed;border-color: rgb(229, 229, 229) rgb(229, 229, 229) rgb(15, 76, 129) rgb(15, 76, 129);font-size: 16.8px;font-weight: bold;margin: 2em 8px 0.75em 0px;text-align: left;line-height: 1.2;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;padding-left: 12px;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__456 js_darkmode__text__1015&quot;&gt;&lt;span class=&quot;js_darkmode__text__1016&quot;&gt;首次使用Claude Design重新设计了Blazor应用的默认界面 - Qita&lt;/span&gt;&lt;/h3&gt;&lt;p style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);margin: 1.5em 8px;text-align: justify;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;text-indent: 2em;letter-spacing: 0.1em;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__457 js_darkmode__text__1017&quot;&gt;&lt;span class=&quot;js_darkmode__text__1018&quot;&gt;https://qiita.com/non-k/items/bcc3cf14e072b74ae730&lt;/span&gt;&lt;/p&gt;&lt;h3 style=&quot;box-sizing: border-box;border-width: 0px 0px 1px 4px;border-style: solid solid dashed;border-color: rgb(229, 229, 229) rgb(229, 229, 229) rgb(15, 76, 129) rgb(15, 76, 129);font-size: 16.8px;font-weight: bold;margin: 2em 8px 0.75em 0px;text-align: left;line-height: 1.2;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;padding-left: 12px;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__458 js_darkmode__text__1019&quot;&gt;&lt;span class=&quot;js_darkmode__text__1020&quot;&gt;[C#] 深入思考例外与日志：第一部分 例外类的完整解剖——Qiita。&lt;/span&gt;&lt;/h3&gt;&lt;p style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);margin: 1.5em 8px;text-align: justify;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;text-indent: 2em;letter-spacing: 0.1em;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__459 js_darkmode__text__1021&quot;&gt;&lt;span class=&quot;js_darkmode__text__1022&quot;&gt;https://qiita.com/KM_20005/items/eab8ab1db5ab28d9164e&lt;/span&gt;&lt;/p&gt;&lt;h3 style=&quot;box-sizing: border-box;border-width: 0px 0px 1px 4px;border-style: solid solid dashed;border-color: rgb(229, 229, 229) rgb(229, 229, 229) rgb(15, 76, 129) rgb(15, 76, 129);font-size: 16.8px;font-weight: bold;margin: 2em 8px 0.75em 0px;text-align: left;line-height: 1.2;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;padding-left: 12px;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__460 js_darkmode__text__1023&quot;&gt;&lt;span class=&quot;js_darkmode__text__1024&quot;&gt;[C#] 关于C&lt;a class=&quot;wx_topic_link js_darkmode__text__1025&quot; style=&quot;color: #576B95 !important;&quot; data-topic=&quot;1&quot; data-recommend=&quot;&quot;&gt;#开发工具包生成的&lt;/a&gt;.lscache文件&lt;/span&gt;&lt;/h3&gt;&lt;p style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);margin: 1.5em 8px;text-align: justify;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;text-indent: 2em;letter-spacing: 0.1em;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__461 js_darkmode__text__1026&quot;&gt;&lt;span class=&quot;js_darkmode__text__1027&quot;&gt;https://zenn.dev/nuskey/articles/csharp-lscache&lt;/span&gt;&lt;/p&gt;&lt;h3 style=&quot;box-sizing: border-box;border-width: 0px 0px 1px 4px;border-style: solid solid dashed;border-color: rgb(229, 229, 229) rgb(229, 229, 229) rgb(15, 76, 129) rgb(15, 76, 129);font-size: 16.8px;font-weight: bold;margin: 2em 8px 0.75em 0px;text-align: left;line-height: 1.2;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;padding-left: 12px;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__462 js_darkmode__text__1028&quot;&gt;&lt;span class=&quot;js_darkmode__text__1029&quot;&gt;使用 GitHub Copilot CLI 和 VS Code 代理模式供 C# 开发者使用&lt;/span&gt;&lt;/h3&gt;&lt;p style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);margin: 1.5em 8px;text-align: justify;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;text-indent: 2em;letter-spacing: 0.1em;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__463 js_darkmode__text__1030&quot;&gt;&lt;span class=&quot;js_darkmode__text__1031&quot;&gt;https://zenn.dev/tomokusaba/articles/838cdac8d71e52&lt;/span&gt;&lt;/p&gt;&lt;h3 style=&quot;box-sizing: border-box;border-width: 0px 0px 1px 4px;border-style: solid solid dashed;border-color: rgb(229, 229, 229) rgb(229, 229, 229) rgb(15, 76, 129) rgb(15, 76, 129);font-size: 16.8px;font-weight: bold;margin: 2em 8px 0.75em 0px;text-align: left;line-height: 1.2;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;padding-left: 12px;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__464 js_darkmode__text__1032&quot;&gt;&lt;span class=&quot;js_darkmode__text__1033&quot;&gt;使用 ReadOnlySpanT 移除 .NET Framework 中的字节[] 分配&lt;/span&gt;&lt;/h3&gt;&lt;p style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);margin: 1.5em 8px;text-align: justify;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;text-indent: 2em;letter-spacing: 0.1em;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__465 js_darkmode__text__1034&quot;&gt;&lt;span class=&quot;js_darkmode__text__1035&quot;&gt;https://andrewlock.net/removingbyte-array-allocations-in-dotnet-framework-using-readonlyspan-t/&lt;/span&gt;&lt;/p&gt;&lt;h3 style=&quot;box-sizing: border-box;border-width: 0px 0px 1px 4px;border-style: solid solid dashed;border-color: rgb(229, 229, 229) rgb(229, 229, 229) rgb(15, 76, 129) rgb(15, 76, 129);font-size: 16.8px;font-weight: bold;margin: 2em 8px 0.75em 0px;text-align: left;line-height: 1.2;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;padding-left: 12px;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__466 js_darkmode__text__1036&quot;&gt;&lt;span class=&quot;js_darkmode__text__1037&quot;&gt;如何在不继承 Microsoft 365 Agents SDK 的 AgentApplication 类的情况下编写&lt;/span&gt;&lt;/h3&gt;&lt;p style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);margin: 1.5em 8px;text-align: justify;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;text-indent: 2em;letter-spacing: 0.1em;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__467 js_darkmode__text__1038&quot;&gt;&lt;span class=&quot;js_darkmode__text__1039&quot;&gt;https://zenn.dev/karamem0/articles/2026_04_21_090000&lt;/span&gt;&lt;/p&gt;&lt;h3 style=&quot;box-sizing: border-box;border-width: 0px 0px 1px 4px;border-style: solid solid dashed;border-color: rgb(229, 229, 229) rgb(229, 229, 229) rgb(15, 76, 129) rgb(15, 76, 129);font-size: 16.8px;font-weight: bold;margin: 2em 8px 0.75em 0px;text-align: left;line-height: 1.2;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;padding-left: 12px;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__468 js_darkmode__text__1040&quot;&gt;&lt;span class=&quot;js_darkmode__text__1041&quot;&gt;mruby 在 C# 上：从虚拟机实现到游戏脚本(RubyKaigi 2026)&lt;/span&gt;&lt;/h3&gt;&lt;p style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);margin: 1.5em 8px;text-align: justify;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;text-indent: 2em;letter-spacing: 0.1em;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__469 js_darkmode__text__1042&quot;&gt;&lt;span class=&quot;js_darkmode__text__1043&quot;&gt;https://speakerdeck.com/hadashia/mruby-on-c-number-from-vm-implementation-to-game-scripting&lt;/span&gt;&lt;/p&gt;&lt;h2 style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-size: 18.2px;font-weight: bold;margin: 4em auto 2em;text-align: center;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;display: table;padding: 0.3em 1em;color: rgb(255, 255, 255);background: rgb(15, 76, 129);border-radius: 8px;box-shadow: rgba(0, 0, 0, 0.1) 0px 4px 6px;&quot; class=&quot;js_darkmode__470 js_darkmode__text__1044&quot;&gt;&lt;span class=&quot;js_darkmode__text__1045&quot;&gt;库、仓库、工具等&lt;/span&gt;&lt;/h2&gt;&lt;h3 style=&quot;box-sizing: border-box;border-width: 0px 0px 1px 4px;border-style: solid solid dashed;border-color: rgb(229, 229, 229) rgb(229, 229, 229) rgb(15, 76, 129) rgb(15, 76, 129);font-size: 16.8px;font-weight: bold;margin: 2em 8px 0.75em 0px;text-align: left;line-height: 1.2;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;padding-left: 12px;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__471 js_darkmode__text__1046&quot;&gt;&lt;span class=&quot;js_darkmode__text__1047&quot;&gt;r-dev95/OpRec&lt;/span&gt;&lt;/h3&gt;&lt;p style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);margin: 1.5em 8px;text-align: justify;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;text-indent: 2em;letter-spacing: 0.1em;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__472 js_darkmode__text__1048&quot;&gt;&lt;span class=&quot;js_darkmode__text__1049&quot;&gt;https://github.com/r-dev95/OpRec&lt;/span&gt;&lt;/p&gt;&lt;ul style=&quot;list-style-type: none;&quot; class=&quot;js_darkmode__473 js_darkmode__text__1050 list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;section class=&quot;js_darkmode__text__1052&quot;&gt;&lt;span class=&quot;js_darkmode__text__1053&quot;&gt;•&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;text-align: left;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;color: #576B95;&quot; class=&quot;js_darkmode__475 js_darkmode__text__1054&quot;&gt;&lt;span class=&quot;js_darkmode__text__1055&quot;&gt;开发了Windows屏幕录制应用OpRec&lt;/span&gt;&lt;sup style=&quot; box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-size: 10.5px;line-height: 0; vertical-align: baseline;top: -0.5em; &quot; class=&quot;js_darkmode__476 js_darkmode__text__1056&quot;&gt;&lt;span class=&quot;js_darkmode__text__1057&quot;&gt;[118]&lt;/span&gt;&lt;/sup&gt;&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3 style=&quot;box-sizing: border-box;border-width: 0px 0px 1px 4px;border-style: solid solid dashed;border-color: rgb(229, 229, 229) rgb(229, 229, 229) rgb(15, 76, 129) rgb(15, 76, 129);font-size: 16.8px;font-weight: bold;margin: 2em 8px 0.75em 0px;text-align: left;line-height: 1.2;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;padding-left: 12px;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__477 js_darkmode__text__1058&quot;&gt;&lt;span class=&quot;js_darkmode__text__1059&quot;&gt;ulex/windows_defender_performance_tool：实时Windows Defender扫描性能监控器&lt;/span&gt;&lt;/h3&gt;&lt;p style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);margin: 1.5em 8px;text-align: justify;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;text-indent: 2em;letter-spacing: 0.1em;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__478 js_darkmode__text__1060&quot;&gt;&lt;span class=&quot;js_darkmode__text__1061&quot;&gt;https://github.com/ulex/windows_defender_performance_tool&lt;/span&gt;&lt;/p&gt;&lt;h3 style=&quot;box-sizing: border-box;border-width: 0px 0px 1px 4px;border-style: solid solid dashed;border-color: rgb(229, 229, 229) rgb(229, 229, 229) rgb(15, 76, 129) rgb(15, 76, 129);font-size: 16.8px;font-weight: bold;margin: 2em 8px 0.75em 0px;text-align: left;line-height: 1.2;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;padding-left: 12px;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__479 js_darkmode__text__1062&quot;&gt;&lt;span class=&quot;js_darkmode__text__1063&quot;&gt;akeit0/Enaga：用于直接渲染html/css(及浏览器)或ReactNative的实验性C&lt;a class=&quot;wx_topic_link js_darkmode__text__1064&quot; style=&quot;color: #576B95 !important;&quot; data-topic=&quot;1&quot; data-recommend=&quot;&quot;&gt;#项目&lt;/a&gt;。&lt;/span&gt;&lt;/h3&gt;&lt;p style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);margin: 1.5em 8px;text-align: justify;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;text-indent: 2em;letter-spacing: 0.1em;color: rgb(63, 63, 63);&quot; class=&quot;js_darkmode__480 js_darkmode__text__1065&quot;&gt;&lt;span class=&quot;js_darkmode__text__1066&quot;&gt;https://github.com/akeit0/Enaga&lt;/span&gt;&lt;/p&gt;&lt;ul style=&quot;list-style-type: none;&quot; class=&quot;js_darkmode__481 js_darkmode__text__1067 list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;section class=&quot;js_darkmode__text__1069&quot;&gt;&lt;span class=&quot;js_darkmode__text__1070&quot;&gt;•&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box;border-width: 0px;border-style: solid;border-color: #E5E5E5;text-align: left;line-height: 1.75;font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace;font-size: 14px;color: #576B95;&quot; class=&quot;js_darkmode__483 js_darkmode__text__1071&quot;&gt;&lt;span class=&quot;js_darkmode__text__1072&quot;&gt;我用C&lt;a class=&quot;wx_topic_link js_darkmode__text__1073&quot; style=&quot;color: #576B95 !important;&quot; data-topic=&quot;1&quot; data-recommend=&quot;&quot;&gt;#创建了自己的JavaScriptEngine&lt;/a&gt;&amp;nbsp;+ 浏览器&lt;/span&gt;&lt;sup style=&quot; box-sizing: border-box;border-width: 0px;border-style: solid;border-color: rgb(229, 229, 229);font-size: 10.5px;line-height: 0; vertical-align: baseline;top: -0.5em; &quot; class=&quot;js_darkmode__484 js_darkmode__text__1074&quot;&gt;&lt;span class=&quot;js_darkmode__text__1075&quot;&gt;[119]&lt;/span&gt;&lt;/sup&gt;&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Sun, 12 Jul 2026 22:53:59 +0800</pubDate></item><item><title>Windows Server 2025安装指南 新手必看！</title><link>https://www.codepub.top/post/622.html</link><description>&lt;p style=&quot;margin: 8px 0;letter-spacing: 0px;color: #3f3f3f;text-align: justify;&quot; class=&quot;js_darkmode__2 js_darkmode__text__4&quot;&gt;&lt;span class=&quot;js_darkmode__text__5&quot;&gt;在工作中，我们可能涉及到部署Windows Server服务器环境。本篇文章，将为你详细讲解。&lt;/span&gt;&lt;/p&gt;&lt;h1 data-heading=&quot;true&quot; style=&quot;background: transparent;margin-top: 30px;margin-bottom: 15px;font-weight: bold;font-size: 20px;text-align: center;display: flex;align-items: center;justify-content: center;border: none;color: #3891fd;&quot; class=&quot;js_darkmode__text__6&quot;&gt;&lt;img data-src=&quot;https://mmbiz.qpic.cn/sz_mmbiz_gif/1N1JeeKBorfObhJicLgfScJphkYewWyq6F6d5H64VYicImEcYD5vIXarcYicMJfSq8ibZqOQZTSuxxaIA9icJdQuE36oCTrw3icHGUsrtmNrd85QY/640?wx_fmt=gif&amp;amp;from=appmsg#imgIndex=0&quot; class=&quot;rich_pages wxw-img js_darkmode__3 __bg_gif&quot; data-ratio=&quot;1.0178571428571428&quot; data-type=&quot;gif&quot; data-w=&quot;112&quot; style=&quot;border-radius: 6px; display: block; margin: 0px 8px 0px auto; max-width: 100%; vertical-align: middle; box-shadow: rgb(160, 160, 160) 0px 0px 0px; width: 35px !important; height: auto !important; visibility: visible !important;&quot; data-imgfileid=&quot;100035661&quot; data-aistatus=&quot;1&quot; data-original-style=&quot;border-radius: 6px;display: block;margin: 0px 8px 0px auto;max-width: 100%;vertical-align: middle;box-shadow: rgb(160, 160, 160) 0px 0px 0px;width: 35px;height: 35px;&quot; data-index=&quot;0&quot; src=&quot;https://mmbiz.qpic.cn/sz_mmbiz_gif/1N1JeeKBorfObhJicLgfScJphkYewWyq6F6d5H64VYicImEcYD5vIXarcYicMJfSq8ibZqOQZTSuxxaIA9icJdQuE36oCTrw3icHGUsrtmNrd85QY/640?wx_fmt=gif&amp;from=appmsg&amp;wxfrom=13&amp;tp=wxpic#imgIndex=0&quot; _width=&quot;35px&quot; __sec_open_place_holder__=&quot;true&quot; data-sec-load-status=&quot;2&quot; data-report-img-idx=&quot;4&quot; data-order=&quot;0&quot; alt=&quot;图片&quot;/&gt;&lt;span style=&quot;display: inline-block;&quot; class=&quot;js_darkmode__text__7&quot;&gt;&lt;span class=&quot;js_darkmode__text__8&quot;&gt;创建虚拟机&lt;/span&gt;&lt;/span&gt;&lt;img data-src=&quot;https://mmbiz.qpic.cn/sz_mmbiz_gif/1N1JeeKBoreiaAibtsfpymzXFDZb2fatJThTKKItW8SHr89Mn7hydN3s0BfNDTzPcmBLAZL1xFgerD8jrKLibNt3LOOGWELFbPMevsMXajue1A/640?wx_fmt=gif&amp;amp;from=appmsg#imgIndex=1&quot; class=&quot;rich_pages wxw-img js_darkmode__4 __bg_gif&quot; data-ratio=&quot;0.9565217391304348&quot; data-type=&quot;gif&quot; data-w=&quot;92&quot; style=&quot;border-radius: 6px; display: block; margin: 0px auto 0px 8px; max-width: 100%; transform: translate(-5px, -15px); vertical-align: top; box-shadow: rgb(160, 160, 160) 0px 0px 0px; width: 15px !important; height: auto !important; visibility: visible !important;&quot; data-imgfileid=&quot;100035663&quot; data-aistatus=&quot;1&quot; data-original-style=&quot;border-radius: 6px;display: block;margin: 0px auto 0px 8px;max-width: 100%;transform: translate(-5px, -15px);vertical-align: top;box-shadow: rgb(160, 160, 160) 0px 0px 0px;width: 15px;height: 15px;&quot; data-index=&quot;1&quot; src=&quot;https://mmbiz.qpic.cn/sz_mmbiz_gif/1N1JeeKBoreiaAibtsfpymzXFDZb2fatJThTKKItW8SHr89Mn7hydN3s0BfNDTzPcmBLAZL1xFgerD8jrKLibNt3LOOGWELFbPMevsMXajue1A/640?wx_fmt=gif&amp;from=appmsg&amp;wxfrom=13&amp;tp=wxpic#imgIndex=1&quot; _width=&quot;15px&quot; __sec_open_place_holder__=&quot;true&quot; data-sec-load-status=&quot;2&quot; data-report-img-idx=&quot;2&quot; data-order=&quot;1&quot; alt=&quot;图片&quot;/&gt;&lt;/h1&gt;&lt;p style=&quot;margin: 8px 0;letter-spacing: 0px;color: #3f3f3f;text-align: justify;&quot; class=&quot;js_darkmode__5 js_darkmode__text__9&quot;&gt;&lt;span class=&quot;js_darkmode__text__10&quot;&gt;本文以VM为例，创建虚拟机。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;figure style=&quot;margin: 1em 0 0.5em;color: #3f3f3f;&quot; class=&quot;js_darkmode__6&quot;&gt;&lt;img data-src=&quot;https://mmbiz.qpic.cn/mmbiz_png/1N1JeeKBorft4LhmqCauopFNVS2KvhuJng77XFZA5tYicw8LKq5I438ibd3m7Kib0AzHFyajFQtiaFyEVf2icFqP1GqWiaAWEnO8G3Rgbuz2TBl0U/640?wx_fmt=png&amp;amp;from=appmsg&amp;amp;watermark=1#imgIndex=2&quot; class=&quot;rich_pages wxw-img js_darkmode__7&quot; data-ratio=&quot;0.7243460764587525&quot; data-type=&quot;png&quot; data-w=&quot;497&quot; style=&quot;box-shadow: rgb(160, 160, 160) 1.2px 1.2px 4px; border-radius: 6px; display: block; margin: 0px auto; max-width: 100%; height: auto !important; visibility: visible !important; width: 497px !important;&quot; data-imgfileid=&quot;100035665&quot; data-aistatus=&quot;1&quot; data-original-style=&quot;box-shadow: rgb(160, 160, 160) 1.2px 1.2px 4px;border-radius: 6px;display: block;margin: 0 auto;max-width: 100%;&quot; data-index=&quot;2&quot; src=&quot;https://mmbiz.qpic.cn/mmbiz_png/1N1JeeKBorft4LhmqCauopFNVS2KvhuJng77XFZA5tYicw8LKq5I438ibd3m7Kib0AzHFyajFQtiaFyEVf2icFqP1GqWiaAWEnO8G3Rgbuz2TBl0U/640?wx_fmt=png&amp;from=appmsg&amp;wxfrom=13&amp;tp=wxpic&amp;watermark=1#imgIndex=2&quot; _width=&quot;497px&quot; __sec_open_place_holder__=&quot;true&quot; data-sec-load-status=&quot;2&quot; data-report-img-idx=&quot;0&quot; alt=&quot;图片&quot;/&gt;&lt;/figure&gt;&lt;figure style=&quot;margin: 1em 0 0.5em;color: #3f3f3f;&quot; class=&quot;js_darkmode__8 js_darkmode__text__11&quot;&gt;&lt;img data-src=&quot;https://mmbiz.qpic.cn/sz_mmbiz_png/1N1JeeKBoreS8eWc745A6obLG6OxJHNqsiaE9QQEMf3Jx4KxlibyMd15V59UhASiclicibC91A560ibRWG0icxRY6R2uFvCwosVYib88Wb7scs7UHFw/640?wx_fmt=png&amp;amp;from=appmsg&amp;amp;watermark=1#imgIndex=3&quot; alt=&quot;选择镜像&quot; class=&quot;rich_pages wxw-img js_darkmode__9&quot; data-ratio=&quot;0.7243460764587525&quot; data-type=&quot;png&quot; data-w=&quot;497&quot; style=&quot;box-shadow: rgb(160, 160, 160) 1.2px 1.2px 4px; border-radius: 6px; display: block; margin: 0px auto; max-width: 100%; height: auto !important; visibility: visible !important; width: 497px !important;&quot; data-imgfileid=&quot;100035664&quot; data-aistatus=&quot;1&quot; data-original-style=&quot;box-shadow: rgb(160, 160, 160) 1.2px 1.2px 4px;border-radius: 6px;display: block;margin: 0 auto;max-width: 100%;&quot; data-index=&quot;3&quot; src=&quot;https://mmbiz.qpic.cn/sz_mmbiz_png/1N1JeeKBoreS8eWc745A6obLG6OxJHNqsiaE9QQEMf3Jx4KxlibyMd15V59UhASiclicibC91A560ibRWG0icxRY6R2uFvCwosVYib88Wb7scs7UHFw/640?wx_fmt=png&amp;from=appmsg&amp;wxfrom=13&amp;tp=wxpic&amp;watermark=1#imgIndex=3&quot; _width=&quot;497px&quot; __sec_open_place_holder__=&quot;true&quot; data-sec-load-status=&quot;2&quot; data-report-img-idx=&quot;1&quot;/&gt;&lt;figcaption style=&quot;text-align: center;color: #888;font-size: 0.8em;&quot; class=&quot;js_darkmode__text__12&quot;&gt;&lt;span class=&quot;js_darkmode__text__13&quot;&gt;选择镜像&lt;/span&gt;&lt;/figcaption&gt;&lt;/figure&gt;&lt;figure style=&quot;margin: 1em 0 0.5em;color: #3f3f3f;&quot; class=&quot;js_darkmode__10 js_darkmode__text__14&quot;&gt;&lt;img data-src=&quot;https://mmbiz.qpic.cn/mmbiz_png/1N1JeeKBorcPFhUBXIWdkzGBtv5lQu5tYzCq4saKxtK8z3uJk8F1ck82NA4RZIRmoatVV0FkHFL977t1Kht5v8BYAaLtiamtvK5fOncdUU8k/640?wx_fmt=png&amp;amp;from=appmsg&amp;amp;watermark=1#imgIndex=4&quot; alt=&quot;引导方式为Bios&quot; class=&quot;rich_pages wxw-img js_darkmode__11&quot; data-ratio=&quot;0.7243460764587525&quot; data-type=&quot;png&quot; data-w=&quot;497&quot; style=&quot;box-shadow: rgb(160, 160, 160) 1.2px 1.2px 4px; border-radius: 6px; display: block; margin: 0px auto; max-width: 100%; height: auto !important; visibility: visible !important; width: 497px !important;&quot; data-imgfileid=&quot;100035662&quot; data-aistatus=&quot;1&quot; data-original-style=&quot;box-shadow: rgb(160, 160, 160) 1.2px 1.2px 4px;border-radius: 6px;display: block;margin: 0 auto;max-width: 100%;&quot; data-index=&quot;4&quot; src=&quot;https://mmbiz.qpic.cn/mmbiz_png/1N1JeeKBorcPFhUBXIWdkzGBtv5lQu5tYzCq4saKxtK8z3uJk8F1ck82NA4RZIRmoatVV0FkHFL977t1Kht5v8BYAaLtiamtvK5fOncdUU8k/640?wx_fmt=png&amp;from=appmsg&amp;wxfrom=13&amp;tp=wxpic&amp;watermark=1#imgIndex=4&quot; _width=&quot;497px&quot; __sec_open_place_holder__=&quot;true&quot; data-sec-load-status=&quot;2&quot; data-report-img-idx=&quot;3&quot;/&gt;&lt;figcaption style=&quot;text-align: center;color: #888;font-size: 0.8em;&quot; class=&quot;js_darkmode__text__15&quot;&gt;&lt;span class=&quot;js_darkmode__text__16&quot;&gt;引导方式为Bios&lt;/span&gt;&lt;/figcaption&gt;&lt;/figure&gt;&lt;figure style=&quot;margin: 1em 0 0.5em;color: #3f3f3f;&quot; class=&quot;js_darkmode__12&quot;&gt;&lt;img data-src=&quot;https://mmbiz.qpic.cn/mmbiz_png/1N1JeeKBorcXUbQNDMySj1edvF6TibM7R40libGTyicQoxHtqvlric99ObjxWvO0SOsMPfydrtRha8LxTjFic9QhFbJHdHWsY5uoWughvuiaouEvQ/640?wx_fmt=png&amp;amp;from=appmsg&amp;amp;watermark=1#imgIndex=5&quot; class=&quot;rich_pages wxw-img js_darkmode__13&quot; data-ratio=&quot;0.7243460764587525&quot; data-type=&quot;png&quot; data-w=&quot;497&quot; style=&quot;box-shadow: rgb(160, 160, 160) 1.2px 1.2px 4px; border-radius: 6px; display: block; margin: 0px auto; max-width: 100%; height: auto !important; visibility: visible !important; width: 497px !important;&quot; data-imgfileid=&quot;100035667&quot; data-aistatus=&quot;1&quot; data-original-style=&quot;box-shadow: rgb(160, 160, 160) 1.2px 1.2px 4px;border-radius: 6px;display: block;margin: 0 auto;max-width: 100%;&quot; data-index=&quot;5&quot; src=&quot;https://mmbiz.qpic.cn/mmbiz_png/1N1JeeKBorcXUbQNDMySj1edvF6TibM7R40libGTyicQoxHtqvlric99ObjxWvO0SOsMPfydrtRha8LxTjFic9QhFbJHdHWsY5uoWughvuiaouEvQ/640?wx_fmt=png&amp;from=appmsg&amp;tp=wxpic&amp;wxfrom=5&amp;wx_lazy=1&amp;watermark=1#imgIndex=5&quot; _width=&quot;497px&quot; __sec_open_place_holder__=&quot;true&quot; alt=&quot;图片&quot; data-before-load-time=&quot;1783647105392&quot; data-report-img-idx=&quot;5&quot; data-fail=&quot;0&quot;/&gt;&lt;/figure&gt;&lt;br/&gt;&lt;span class=&quot;js_darkmode__text__17&quot;&gt;CPU和内存大小可以根据自己电脑的性能调整，完成后启动虚拟机。&lt;/span&gt;&lt;/p&gt;&lt;h1 data-heading=&quot;true&quot; style=&quot;background: transparent;margin-top: 30px;margin-bottom: 15px;font-weight: bold;font-size: 20px;text-align: center;display: flex;align-items: center;justify-content: center;border: none;color: #3891fd;&quot; class=&quot;js_darkmode__text__18&quot;&gt;&lt;img data-src=&quot;https://mmbiz.qpic.cn/sz_mmbiz_gif/1N1JeeKBorfDAtNJ4Kb4kzbh0lqXuOfMiazaK4vffj3L1HPWia7QrbEsSHFiasmb6BIic4FPlh6YRZWPJBuehUucZF8ibYSqay9nyBZa1vzJxEwA/640?wx_fmt=gif&amp;amp;from=appmsg#imgIndex=6&quot; class=&quot;rich_pages wxw-img js_darkmode__14 __bg_gif&quot; data-ratio=&quot;1.0178571428571428&quot; data-type=&quot;gif&quot; data-w=&quot;112&quot; style=&quot;border-radius: 6px; display: block; margin: 0px 8px 0px auto; max-width: 100%; vertical-align: middle; box-shadow: rgb(160, 160, 160) 0px 0px 0px; width: 35px !important; height: auto !important; visibility: visible !important;&quot; data-imgfileid=&quot;100035669&quot; data-aistatus=&quot;1&quot; data-original-style=&quot;border-radius: 6px;display: block;margin: 0px 8px 0px auto;max-width: 100%;vertical-align: middle;box-shadow: rgb(160, 160, 160) 0px 0px 0px;width: 35px;height: 35px;&quot; data-index=&quot;6&quot; src=&quot;https://mmbiz.qpic.cn/sz_mmbiz_gif/1N1JeeKBorfDAtNJ4Kb4kzbh0lqXuOfMiazaK4vffj3L1HPWia7QrbEsSHFiasmb6BIic4FPlh6YRZWPJBuehUucZF8ibYSqay9nyBZa1vzJxEwA/640?wx_fmt=gif&amp;from=appmsg&amp;tp=wxpic&amp;wxfrom=5&amp;wx_lazy=1#imgIndex=6&quot; _width=&quot;35px&quot; __sec_open_place_holder__=&quot;true&quot; data-order=&quot;2&quot; alt=&quot;图片&quot; data-before-load-time=&quot;1783647105584&quot; data-report-img-idx=&quot;6&quot; data-fail=&quot;0&quot;/&gt;&lt;span style=&quot;display: inline-block;&quot; class=&quot;js_darkmode__text__19&quot;&gt;&lt;span class=&quot;js_darkmode__text__20&quot;&gt;系统安装&lt;/span&gt;&lt;/span&gt;&lt;img data-src=&quot;https://mmbiz.qpic.cn/mmbiz_gif/1N1JeeKBorfkBJNpnKeEWBTb3kia4bSNIicKJibqqV7EwmphrkEJH2z2R56tvPUxeczrOKu5v1eDZiaurBHLbFG71KywYbE5CHmXYMpiauRlDops/640?wx_fmt=gif&amp;amp;from=appmsg#imgIndex=7&quot; class=&quot;rich_pages wxw-img js_darkmode__15 __bg_gif&quot; data-ratio=&quot;0.9565217391304348&quot; data-type=&quot;gif&quot; data-w=&quot;92&quot; style=&quot;border-radius: 6px; display: block; margin: 0px auto 0px 8px; max-width: 100%; transform: translate(-5px, -15px); vertical-align: top; box-shadow: rgb(160, 160, 160) 0px 0px 0px; width: 15px !important; height: auto !important; visibility: visible !important;&quot; data-imgfileid=&quot;100035666&quot; data-aistatus=&quot;1&quot; data-original-style=&quot;border-radius: 6px;display: block;margin: 0px auto 0px 8px;max-width: 100%;transform: translate(-5px, -15px);vertical-align: top;box-shadow: rgb(160, 160, 160) 0px 0px 0px;width: 15px;height: 15px;&quot; data-index=&quot;7&quot; src=&quot;https://mmbiz.qpic.cn/mmbiz_gif/1N1JeeKBorfkBJNpnKeEWBTb3kia4bSNIicKJibqqV7EwmphrkEJH2z2R56tvPUxeczrOKu5v1eDZiaurBHLbFG71KywYbE5CHmXYMpiauRlDops/640?wx_fmt=gif&amp;from=appmsg&amp;tp=wxpic&amp;wxfrom=5&amp;wx_lazy=1#imgIndex=7&quot; _width=&quot;15px&quot; __sec_open_place_holder__=&quot;true&quot; data-order=&quot;3&quot; alt=&quot;图片&quot; data-before-load-time=&quot;1783647105565&quot; data-report-img-idx=&quot;7&quot; data-fail=&quot;0&quot;/&gt;&lt;/h1&gt;&lt;p&gt;&lt;span class=&quot;js_darkmode__text__21&quot;&gt;接下来，接入安装界面。和安装Windows系统一样，很丝滑！&lt;/span&gt;&lt;br/&gt;&lt;figure style=&quot;margin: 1em 0 0.5em;color: #3f3f3f;&quot; class=&quot;js_darkmode__16&quot;&gt;&lt;img data-src=&quot;https://mmbiz.qpic.cn/sz_mmbiz_png/1N1JeeKBordXVHGCswLRpqP9nOAibicHmakAvyqqGOBdnWlIbWibicPyh8oVjyQubTQMc73jV6PocZAbgQDrQj1tAOxBnqz7AMwOEpGCFe6uCqI/640?wx_fmt=png&amp;amp;from=appmsg&amp;amp;watermark=1#imgIndex=8&quot; class=&quot;rich_pages wxw-img js_darkmode__17&quot; data-ratio=&quot;0.6854754440961337&quot; data-type=&quot;png&quot; data-w=&quot;957&quot; style=&quot;box-shadow: rgb(160, 160, 160) 1.2px 1.2px 4px; border-radius: 6px; display: block; margin: 0px auto; max-width: 100%; height: auto !important; visibility: visible !important; width: 661px !important;&quot; data-imgfileid=&quot;100035670&quot; data-aistatus=&quot;1&quot; data-original-style=&quot;box-shadow: rgb(160, 160, 160) 1.2px 1.2px 4px;border-radius: 6px;display: block;margin: 0 auto;max-width: 100%;&quot; data-index=&quot;8&quot; src=&quot;https://mmbiz.qpic.cn/sz_mmbiz_png/1N1JeeKBordXVHGCswLRpqP9nOAibicHmakAvyqqGOBdnWlIbWibicPyh8oVjyQubTQMc73jV6PocZAbgQDrQj1tAOxBnqz7AMwOEpGCFe6uCqI/640?wx_fmt=png&amp;from=appmsg&amp;tp=wxpic&amp;wxfrom=5&amp;wx_lazy=1&amp;watermark=1#imgIndex=8&quot; _width=&quot;677px&quot; __sec_open_place_holder__=&quot;true&quot; alt=&quot;图片&quot; data-before-load-time=&quot;1783647106941&quot; data-report-img-idx=&quot;8&quot; data-fail=&quot;0&quot;/&gt;&lt;/figure&gt;&lt;figure style=&quot;margin: 1em 0 0.5em;color: #3f3f3f;&quot; class=&quot;js_darkmode__18&quot;&gt;&lt;img data-src=&quot;https://mmbiz.qpic.cn/mmbiz_png/1N1JeeKBordCqcVxhVb7BasGibM14iaaGuM0VVrssLKgoy4pAicmDS59icYuhoAaH7wWfulqFjiciaaDck6bHyQ5t7xJ7IG3hg7uhpiaHoC4KHicYYM/640?wx_fmt=png&amp;amp;from=appmsg&amp;amp;watermark=1#imgIndex=9&quot; class=&quot;rich_pages wxw-img js_darkmode__19&quot; data-ratio=&quot;0.7386018237082067&quot; data-type=&quot;png&quot; data-w=&quot;987&quot; style=&quot;box-shadow: rgb(160, 160, 160) 1.2px 1.2px 4px; border-radius: 6px; display: block; margin: 0px auto; max-width: 100%; height: auto !important; visibility: visible !important; width: 661px !important;&quot; data-imgfileid=&quot;100035668&quot; data-aistatus=&quot;1&quot; data-original-style=&quot;box-shadow: rgb(160, 160, 160) 1.2px 1.2px 4px;border-radius: 6px;display: block;margin: 0 auto;max-width: 100%;&quot; data-index=&quot;9&quot; src=&quot;https://mmbiz.qpic.cn/mmbiz_png/1N1JeeKBordCqcVxhVb7BasGibM14iaaGuM0VVrssLKgoy4pAicmDS59icYuhoAaH7wWfulqFjiciaaDck6bHyQ5t7xJ7IG3hg7uhpiaHoC4KHicYYM/640?wx_fmt=png&amp;from=appmsg&amp;tp=wxpic&amp;wxfrom=5&amp;wx_lazy=1&amp;watermark=1#imgIndex=9&quot; _width=&quot;677px&quot; __sec_open_place_holder__=&quot;true&quot; alt=&quot;图片&quot; data-before-load-time=&quot;1783647107046&quot; data-report-img-idx=&quot;9&quot; data-fail=&quot;0&quot;/&gt;&lt;/figure&gt;&lt;figure style=&quot;margin: 1em 0 0.5em;color: #3f3f3f;&quot; class=&quot;js_darkmode__20&quot;&gt;&lt;img data-src=&quot;https://mmbiz.qpic.cn/sz_mmbiz_png/1N1JeeKBorcrHPicJm5yA7rfCicr2RnHC6dUYPzPrY8D2MCAeiceMEDNUL1CIKlFrQHRnGbfPAIQt9J8PHlAk8mXO9d2043JKLTMGpUShTEr0g/640?wx_fmt=png&amp;amp;from=appmsg&amp;amp;watermark=1#imgIndex=10&quot; class=&quot;rich_pages wxw-img js_darkmode__21&quot; data-ratio=&quot;0.7303030303030303&quot; data-type=&quot;png&quot; data-w=&quot;990&quot; style=&quot;box-shadow: rgb(160, 160, 160) 1.2px 1.2px 4px; border-radius: 6px; display: block; margin: 0px auto; max-width: 100%; height: auto !important; visibility: visible !important; width: 661px !important;&quot; data-imgfileid=&quot;100035674&quot; data-aistatus=&quot;1&quot; data-original-style=&quot;box-shadow: rgb(160, 160, 160) 1.2px 1.2px 4px;border-radius: 6px;display: block;margin: 0 auto;max-width: 100%;&quot; data-index=&quot;10&quot; src=&quot;https://mmbiz.qpic.cn/sz_mmbiz_png/1N1JeeKBorcrHPicJm5yA7rfCicr2RnHC6dUYPzPrY8D2MCAeiceMEDNUL1CIKlFrQHRnGbfPAIQt9J8PHlAk8mXO9d2043JKLTMGpUShTEr0g/640?wx_fmt=png&amp;from=appmsg&amp;tp=wxpic&amp;wxfrom=5&amp;wx_lazy=1&amp;watermark=1#imgIndex=10&quot; _width=&quot;677px&quot; __sec_open_place_holder__=&quot;true&quot; alt=&quot;图片&quot; data-before-load-time=&quot;1783647107130&quot; data-report-img-idx=&quot;10&quot; data-fail=&quot;0&quot;/&gt;&lt;/figure&gt;&lt;figure style=&quot;margin: 1em 0 0.5em;color: #3f3f3f;&quot; class=&quot;js_darkmode__22&quot;&gt;&lt;img data-src=&quot;https://mmbiz.qpic.cn/mmbiz_png/1N1JeeKBorft9EvtHejALfbeMx2aUmJWk9ONWaP6k5YU7ExQB7uN0TCtibhAXWKQ9bJ7bOYo633yBynttYA41Nu2cR6695gphbNQd3OAdn8k/640?wx_fmt=png&amp;amp;from=appmsg&amp;amp;watermark=1#imgIndex=11&quot; class=&quot;rich_pages wxw-img js_darkmode__23&quot; data-ratio=&quot;0.729483282674772&quot; data-type=&quot;png&quot; data-w=&quot;987&quot; style=&quot;box-shadow: rgb(160, 160, 160) 1.2px 1.2px 4px; border-radius: 6px; display: block; margin: 0px auto; max-width: 100%; height: auto !important; visibility: visible !important; width: 661px !important;&quot; data-imgfileid=&quot;100035672&quot; data-aistatus=&quot;1&quot; data-original-style=&quot;box-shadow: rgb(160, 160, 160) 1.2px 1.2px 4px;border-radius: 6px;display: block;margin: 0 auto;max-width: 100%;&quot; data-index=&quot;11&quot; src=&quot;https://mmbiz.qpic.cn/mmbiz_png/1N1JeeKBorft9EvtHejALfbeMx2aUmJWk9ONWaP6k5YU7ExQB7uN0TCtibhAXWKQ9bJ7bOYo633yBynttYA41Nu2cR6695gphbNQd3OAdn8k/640?wx_fmt=png&amp;from=appmsg&amp;tp=wxpic&amp;wxfrom=5&amp;wx_lazy=1&amp;watermark=1#imgIndex=11&quot; _width=&quot;677px&quot; __sec_open_place_holder__=&quot;true&quot; alt=&quot;图片&quot; data-before-load-time=&quot;1783647107231&quot; data-report-img-idx=&quot;11&quot; data-fail=&quot;0&quot;/&gt;&lt;/figure&gt;&lt;figure style=&quot;margin: 1em 0 0.5em;color: #3f3f3f;&quot; class=&quot;js_darkmode__24&quot;&gt;&lt;img data-src=&quot;https://mmbiz.qpic.cn/mmbiz_png/1N1JeeKBordTg6SIibyxIQxOm6B94CU46h2SAQ2KOSHUpdpqD33QHo339veg2n2DxInz1Kiav6XYRh7RtVjAWBQgyFkGgUnbkUnAiaQpRibUPYw/640?wx_fmt=png&amp;amp;from=appmsg&amp;amp;watermark=1#imgIndex=12&quot; class=&quot;rich_pages wxw-img js_darkmode__25&quot; data-ratio=&quot;0.7658227848101266&quot; data-type=&quot;png&quot; data-w=&quot;948&quot; style=&quot;box-shadow: rgb(160, 160, 160) 1.2px 1.2px 4px; border-radius: 6px; display: block; margin: 0px auto; max-width: 100%; height: auto !important; visibility: visible !important; width: 661px !important;&quot; data-imgfileid=&quot;100035673&quot; data-aistatus=&quot;1&quot; data-original-style=&quot;box-shadow: rgb(160, 160, 160) 1.2px 1.2px 4px;border-radius: 6px;display: block;margin: 0 auto;max-width: 100%;&quot; data-index=&quot;12&quot; src=&quot;https://mmbiz.qpic.cn/mmbiz_png/1N1JeeKBordTg6SIibyxIQxOm6B94CU46h2SAQ2KOSHUpdpqD33QHo339veg2n2DxInz1Kiav6XYRh7RtVjAWBQgyFkGgUnbkUnAiaQpRibUPYw/640?wx_fmt=png&amp;from=appmsg&amp;tp=wxpic&amp;wxfrom=5&amp;wx_lazy=1&amp;watermark=1#imgIndex=12&quot; _width=&quot;677px&quot; __sec_open_place_holder__=&quot;true&quot; alt=&quot;图片&quot; data-before-load-time=&quot;1783647107300&quot; data-report-img-idx=&quot;12&quot; data-fail=&quot;0&quot;/&gt;&lt;/figure&gt;&lt;figure style=&quot;margin: 1em 0 0.5em;color: #3f3f3f;&quot; class=&quot;js_darkmode__26&quot;&gt;&lt;img data-src=&quot;https://mmbiz.qpic.cn/sz_mmbiz_png/1N1JeeKBordfbu8Dd78JQC3wkVacnicSaculSrxmdEibnJCb2MrW3dRAOMzRO9jlYGkmU41XtNlbQvkhEOthd8Jn196N7aiciaB2RZ9aMsBvDro/640?wx_fmt=png&amp;amp;from=appmsg&amp;amp;watermark=1#imgIndex=13&quot; class=&quot;rich_pages wxw-img js_darkmode__27&quot; data-ratio=&quot;0.7357357357357357&quot; data-type=&quot;png&quot; data-w=&quot;999&quot; style=&quot;box-shadow: rgb(160, 160, 160) 1.2px 1.2px 4px; border-radius: 6px; display: block; margin: 0px auto; max-width: 100%; height: auto !important; visibility: visible !important; width: 661px !important;&quot; data-imgfileid=&quot;100035671&quot; data-aistatus=&quot;1&quot; data-original-style=&quot;box-shadow: rgb(160, 160, 160) 1.2px 1.2px 4px;border-radius: 6px;display: block;margin: 0 auto;max-width: 100%;&quot; data-index=&quot;13&quot; src=&quot;https://mmbiz.qpic.cn/sz_mmbiz_png/1N1JeeKBordfbu8Dd78JQC3wkVacnicSaculSrxmdEibnJCb2MrW3dRAOMzRO9jlYGkmU41XtNlbQvkhEOthd8Jn196N7aiciaB2RZ9aMsBvDro/640?wx_fmt=png&amp;from=appmsg&amp;tp=wxpic&amp;wxfrom=5&amp;wx_lazy=1&amp;watermark=1#imgIndex=13&quot; _width=&quot;677px&quot; __sec_open_place_holder__=&quot;true&quot; alt=&quot;图片&quot; data-before-load-time=&quot;1783647107422&quot; data-report-img-idx=&quot;13&quot; data-fail=&quot;0&quot;/&gt;&lt;/figure&gt;&lt;figure style=&quot;margin: 1em 0 0.5em;color: #3f3f3f;&quot; class=&quot;js_darkmode__28&quot;&gt;&lt;img data-src=&quot;https://mmbiz.qpic.cn/mmbiz_png/1N1JeeKBoreKfUNomUdz0pnaovrEOfibBK7VwWWByMgd0xCerwNvFFBWqwVDA1iagNJ0951ejGfLurs2GicfwKShN9TGDcW8xKibiboxJnta5yK8/640?wx_fmt=png&amp;amp;from=appmsg&amp;amp;watermark=1#imgIndex=14&quot; class=&quot;rich_pages wxw-img js_darkmode__29&quot; data-ratio=&quot;0.712166172106825&quot; data-type=&quot;png&quot; data-w=&quot;1011&quot; style=&quot;box-shadow: rgb(160, 160, 160) 1.2px 1.2px 4px; border-radius: 6px; display: block; margin: 0px auto; max-width: 100%; height: auto !important; visibility: visible !important; width: 661px !important;&quot; data-imgfileid=&quot;100035675&quot; data-aistatus=&quot;1&quot; data-original-style=&quot;box-shadow: rgb(160, 160, 160) 1.2px 1.2px 4px;border-radius: 6px;display: block;margin: 0 auto;max-width: 100%;&quot; data-index=&quot;14&quot; src=&quot;https://mmbiz.qpic.cn/mmbiz_png/1N1JeeKBoreKfUNomUdz0pnaovrEOfibBK7VwWWByMgd0xCerwNvFFBWqwVDA1iagNJ0951ejGfLurs2GicfwKShN9TGDcW8xKibiboxJnta5yK8/640?wx_fmt=png&amp;from=appmsg&amp;tp=wxpic&amp;wxfrom=5&amp;wx_lazy=1&amp;watermark=1#imgIndex=14&quot; _width=&quot;677px&quot; __sec_open_place_holder__=&quot;true&quot; alt=&quot;图片&quot; data-before-load-time=&quot;1783647107537&quot; data-report-img-idx=&quot;14&quot; data-fail=&quot;0&quot;/&gt;&lt;/figure&gt;&lt;figure style=&quot;margin: 1em 0 0.5em;color: #3f3f3f;&quot; class=&quot;js_darkmode__30&quot;&gt;&lt;img data-src=&quot;https://mmbiz.qpic.cn/mmbiz_png/1N1JeeKBorcicNuI6aicI07rOK1erArAbjvh6ef6Vsj5O3JWFOLEqD8kAc1RxpXXFfibWxZvgKWjU86MDdvUJettj3oJprmFJqZYL4NFYt7wE4/640?wx_fmt=png&amp;amp;from=appmsg&amp;amp;watermark=1#imgIndex=15&quot; class=&quot;rich_pages wxw-img js_darkmode__31&quot; data-ratio=&quot;0.7049689440993789&quot; data-type=&quot;png&quot; data-w=&quot;966&quot; style=&quot;box-shadow: rgb(160, 160, 160) 1.2px 1.2px 4px; border-radius: 6px; display: block; margin: 0px auto; max-width: 100%; height: auto !important; visibility: visible !important; width: 661px !important;&quot; data-imgfileid=&quot;100035676&quot; data-aistatus=&quot;1&quot; data-original-style=&quot;box-shadow: rgb(160, 160, 160) 1.2px 1.2px 4px;border-radius: 6px;display: block;margin: 0 auto;max-width: 100%;&quot; data-index=&quot;15&quot; src=&quot;https://mmbiz.qpic.cn/mmbiz_png/1N1JeeKBorcicNuI6aicI07rOK1erArAbjvh6ef6Vsj5O3JWFOLEqD8kAc1RxpXXFfibWxZvgKWjU86MDdvUJettj3oJprmFJqZYL4NFYt7wE4/640?wx_fmt=png&amp;from=appmsg&amp;tp=wxpic&amp;wxfrom=5&amp;wx_lazy=1&amp;watermark=1#imgIndex=15&quot; _width=&quot;677px&quot; __sec_open_place_holder__=&quot;true&quot; alt=&quot;图片&quot; data-before-load-time=&quot;1783647107680&quot; data-report-img-idx=&quot;15&quot; data-fail=&quot;0&quot;/&gt;&lt;/figure&gt;&lt;figure style=&quot;margin: 1em 0 0.5em;color: #3f3f3f;&quot; class=&quot;js_darkmode__32&quot;&gt;&lt;img data-src=&quot;https://mmbiz.qpic.cn/mmbiz_png/1N1JeeKBorc7unTnaaPAES7P2EMnPIYhPKcN6L3OP5NypRVhjwDPAJqiacOpSUxnBNXMtbGLuSIFmM2CkGWVotbm7v4OiafjHk66jvnYf6hN0/640?wx_fmt=png&amp;amp;from=appmsg&amp;amp;watermark=1#imgIndex=16&quot; class=&quot;rich_pages wxw-img js_darkmode__33&quot; data-ratio=&quot;0.7260138476755688&quot; data-type=&quot;png&quot; data-w=&quot;1011&quot; style=&quot;box-shadow: rgb(160, 160, 160) 1.2px 1.2px 4px; border-radius: 6px; display: block; margin: 0px auto; max-width: 100%; height: auto !important; visibility: visible !important; width: 661px !important;&quot; data-imgfileid=&quot;100035677&quot; data-aistatus=&quot;1&quot; data-original-style=&quot;box-shadow: rgb(160, 160, 160) 1.2px 1.2px 4px;border-radius: 6px;display: block;margin: 0 auto;max-width: 100%;&quot; data-index=&quot;16&quot; src=&quot;https://mmbiz.qpic.cn/mmbiz_png/1N1JeeKBorc7unTnaaPAES7P2EMnPIYhPKcN6L3OP5NypRVhjwDPAJqiacOpSUxnBNXMtbGLuSIFmM2CkGWVotbm7v4OiafjHk66jvnYf6hN0/640?wx_fmt=png&amp;from=appmsg&amp;tp=wxpic&amp;wxfrom=5&amp;wx_lazy=1&amp;watermark=1#imgIndex=16&quot; _width=&quot;677px&quot; __sec_open_place_holder__=&quot;true&quot; alt=&quot;图片&quot; data-before-load-time=&quot;1783647107950&quot; data-report-img-idx=&quot;16&quot; data-fail=&quot;0&quot;/&gt;&lt;/figure&gt;&lt;figure style=&quot;margin: 1em 0 0.5em;color: #3f3f3f;&quot; class=&quot;js_darkmode__34&quot;&gt;&lt;img data-src=&quot;https://mmbiz.qpic.cn/sz_mmbiz_png/1N1JeeKBorfxCHFLP3VWaEwLfoSdiboibpzYPSXvyHUuupSHz1lwKicflZWMbX2hsJicFEoDNokjZhTGd6psge4OMEH9exib8fqq5yo58nKF5sXc/640?wx_fmt=png&amp;amp;from=appmsg&amp;amp;watermark=1#imgIndex=17&quot; class=&quot;rich_pages wxw-img js_darkmode__35&quot; data-ratio=&quot;0.7522477522477522&quot; data-type=&quot;png&quot; data-w=&quot;1001&quot; style=&quot;box-shadow: rgb(160, 160, 160) 1.2px 1.2px 4px; border-radius: 6px; display: block; margin: 0px auto; max-width: 100%; height: auto !important; visibility: visible !important; width: 661px !important;&quot; data-imgfileid=&quot;100035679&quot; data-aistatus=&quot;1&quot; data-original-style=&quot;box-shadow: rgb(160, 160, 160) 1.2px 1.2px 4px;border-radius: 6px;display: block;margin: 0 auto;max-width: 100%;&quot; data-index=&quot;17&quot; src=&quot;https://mmbiz.qpic.cn/sz_mmbiz_png/1N1JeeKBorfxCHFLP3VWaEwLfoSdiboibpzYPSXvyHUuupSHz1lwKicflZWMbX2hsJicFEoDNokjZhTGd6psge4OMEH9exib8fqq5yo58nKF5sXc/640?wx_fmt=png&amp;from=appmsg&amp;tp=wxpic&amp;wxfrom=5&amp;wx_lazy=1&amp;watermark=1#imgIndex=17&quot; _width=&quot;677px&quot; __sec_open_place_holder__=&quot;true&quot; alt=&quot;图片&quot; data-before-load-time=&quot;1783647109115&quot; data-report-img-idx=&quot;17&quot; data-fail=&quot;0&quot;/&gt;&lt;/figure&gt;&lt;figure style=&quot;margin: 1em 0 0.5em;color: #3f3f3f;&quot; class=&quot;js_darkmode__36&quot;&gt;&lt;img data-src=&quot;https://mmbiz.qpic.cn/mmbiz_png/1N1JeeKBorcpicfKT7ic1nSms5QkDRfeWPhxMCbF9K2aPmp6tAuHG8lDMB08Du9BODuSeTP0BtPTHOrAhlLkh4icvxu6ZKHeaykuL0pVeiaPejc/640?wx_fmt=png&amp;amp;from=appmsg&amp;amp;watermark=1#imgIndex=18&quot; class=&quot;rich_pages wxw-img js_darkmode__37&quot; data-ratio=&quot;0.6994047619047619&quot; data-type=&quot;png&quot; data-w=&quot;1008&quot; style=&quot;box-shadow: rgb(160, 160, 160) 1.2px 1.2px 4px; border-radius: 6px; display: block; margin: 0px auto; max-width: 100%; height: auto !important; visibility: visible !important; width: 661px !important;&quot; data-imgfileid=&quot;100035678&quot; data-aistatus=&quot;1&quot; data-original-style=&quot;box-shadow: rgb(160, 160, 160) 1.2px 1.2px 4px;border-radius: 6px;display: block;margin: 0 auto;max-width: 100%;&quot; data-index=&quot;18&quot; src=&quot;https://mmbiz.qpic.cn/mmbiz_png/1N1JeeKBorcpicfKT7ic1nSms5QkDRfeWPhxMCbF9K2aPmp6tAuHG8lDMB08Du9BODuSeTP0BtPTHOrAhlLkh4icvxu6ZKHeaykuL0pVeiaPejc/640?wx_fmt=png&amp;from=appmsg&amp;tp=wxpic&amp;wxfrom=5&amp;wx_lazy=1&amp;watermark=1#imgIndex=18&quot; _width=&quot;677px&quot; __sec_open_place_holder__=&quot;true&quot; alt=&quot;图片&quot; data-before-load-time=&quot;1783647109115&quot; data-report-img-idx=&quot;18&quot; data-fail=&quot;0&quot;/&gt;&lt;/figure&gt;&lt;span class=&quot;js_darkmode__text__22&quot;&gt;至此，虚拟机安装Windows Server教程到此结束了。需要部署什么业务，可以自行部署了。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Fri, 10 Jul 2026 09:32:06 +0800</pubDate></item><item><title>一文讲透 .NET 中的 AOP：什么是面向切面编程？原理是什么？</title><link>https://www.codepub.top/post/621.html</link><description>&lt;h1 style=&quot;font-weight: 700;line-height: 1.4em;margin: 1em 0 .5em;color: #222;font-size: 1.25em;&quot; class=&quot;js_darkmode__0 js_darkmode__text__1&quot;&gt;&lt;span class=&quot;js_darkmode__text__2&quot;&gt;AOP&lt;/span&gt;&lt;/h1&gt;&lt;h2 style=&quot;font-weight: 700;line-height: 1.4em;margin: 1em 0 .5em;color: #222;font-size: 1.125em;&quot; class=&quot;js_darkmode__1 js_darkmode__text__3&quot;&gt;&lt;span class=&quot;js_darkmode__text__4&quot;&gt;什么是AOP&lt;/span&gt;&lt;/h2&gt;&lt;p style=&quot;color: #333;font-size: 15px;line-height: 1.75em;margin: 0 0 1em;word-wrap: break-word;&quot; class=&quot;js_darkmode__2 js_darkmode__text__5&quot;&gt;&lt;span class=&quot;js_darkmode__text__6&quot;&gt;AOP (Aspect-Oriented Programing ，面向切面编程)是一种编程模式(思想)，它的核心目的是&lt;/span&gt;&lt;strong style=&quot;font-weight: bolder;&quot; class=&quot;js_darkmode__text__7&quot;&gt;&lt;span class=&quot;js_darkmode__text__8&quot;&gt;将&amp;quot;横切关注点(Cross-Cutting Concerns)&amp;quot; 从核心业务逻辑中分离出来&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;ol style=&quot;margin: 1em 0;padding-left: 2em;&quot; class=&quot;js_darkmode__text__9 list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p style=&quot;color: #333;font-size: 15px;line-height: 1.75em;word-wrap: break-word;margin: 0;&quot; class=&quot;js_darkmode__3 js_darkmode__text__11&quot;&gt;&lt;strong style=&quot;font-weight: bolder;&quot; class=&quot;js_darkmode__text__12&quot;&gt;&lt;span class=&quot;js_darkmode__text__13&quot;&gt;什么是&amp;quot;横切关注点&amp;quot;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p style=&quot;color: #333;font-size: 15px;line-height: 1.75em;word-wrap: break-word;margin: 0;&quot; class=&quot;js_darkmode__4 js_darkmode__text__14&quot;&gt;&lt;span class=&quot;js_darkmode__text__15&quot;&gt;在软件开发中，有些逻辑与业务逻辑无关，但却分散在系统的各个角落。比如：日志记录、权限校验、事务管理、异常处理等。&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;ul style=&quot;margin: 1em 0;padding-left: 2em;&quot; class=&quot;js_darkmode__text__16 list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;section class=&quot;js_darkmode__text__18&quot;&gt;&lt;span class=&quot;js_darkmode__text__19&quot;&gt;传统的&lt;span class=&quot;&quot;&gt;OOP&lt;/span&gt;(面向对象)的痛点：如果你要在10个业务方法中加上日志，你就得在这10个方法里都写一遍日志代码。这导致了严重的代码重复和高耦合。如果以后想改变日志格式，你需要修改19个地方&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section class=&quot;js_darkmode__text__21&quot;&gt;&lt;span class=&quot;js_darkmode__text__22&quot;&gt;AOP 的解决思路：将这些散落的、重复的逻辑抽取出来，封装成一个独立的模块(称为**“切面Aspect”**)。然后在运行时，由框架自动将这些逻辑&amp;quot;织入(Weave)&amp;quot;到目标方法中。&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;p style=&quot;color: #333;font-size: 15px;line-height: 1.75em;word-wrap: break-word;margin: 0;&quot; class=&quot;js_darkmode__5 js_darkmode__text__24&quot;&gt;&lt;strong style=&quot;font-weight: bolder;&quot; class=&quot;js_darkmode__text__25&quot;&gt;&lt;span class=&quot;js_darkmode__text__26&quot;&gt;AOP的核心术语&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;&lt;ul style=&quot;margin: 1em 0;padding-left: 2em;&quot; class=&quot;js_darkmode__text__27 list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;section class=&quot;js_darkmode__text__29&quot;&gt;&lt;span class=&quot;js_darkmode__text__30&quot;&gt;Before(前置)：目标方法执行前&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section class=&quot;js_darkmode__text__32&quot;&gt;&lt;span class=&quot;js_darkmode__text__33&quot;&gt;After(后置)：目标方法执行后(无论是否成功)&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section class=&quot;js_darkmode__text__35&quot;&gt;&lt;span class=&quot;js_darkmode__text__36&quot;&gt;&lt;span class=&quot;&quot;&gt;AfterReturning&lt;/span&gt;(返回后)：目标方法执行成功返回后&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section class=&quot;js_darkmode__text__38&quot;&gt;&lt;span class=&quot;js_darkmode__text__39&quot;&gt;AfterThrowing(异常后)：目标方法执行异常返回后&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section class=&quot;js_darkmode__text__41&quot;&gt;&lt;span class=&quot;js_darkmode__text__42&quot;&gt;Around(环绕)：最强大的通知，包裹目标方法，可以控制是否执行目标方法，修改参数和返回值。&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul style=&quot;margin: 1em 0;padding-left: 2em;&quot; class=&quot;js_darkmode__text__43 list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;section class=&quot;js_darkmode__text__45&quot;&gt;&lt;span class=&quot;js_darkmode__text__46&quot;&gt;&lt;span class=&quot;&quot;&gt;切面&lt;/span&gt;(Aspect)：横切关注点的模块化封装(例如一个日志处理类)&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section class=&quot;js_darkmode__text__48&quot;&gt;&lt;span class=&quot;js_darkmode__text__49&quot;&gt;连接点(Join Point)：程序执行过程中的某个特定位置，通常是方法的调用或者异常的抛出&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section class=&quot;js_darkmode__text__51&quot;&gt;&lt;span class=&quot;js_darkmode__text__52&quot;&gt;切入点(Pointcut)：定义切面到底要“织入”到哪些连接点上(例如：匹配所有以&lt;/span&gt;&lt;code style=&quot;font-family: monospace;background: #f5f5f5;padding: .1em .3em;border-radius: 3px;font-size: .9em;&quot; class=&quot;js_darkmode__6 js_darkmode__text__53&quot;&gt;&lt;span class=&quot;js_darkmode__text__54&quot;&gt;service&lt;/span&gt;&lt;/code&gt;&lt;span class=&quot;js_darkmode__text__55&quot;&gt;结尾的类的方法)&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section class=&quot;js_darkmode__text__57&quot;&gt;&lt;span class=&quot;js_darkmode__text__58&quot;&gt;通知(Advice)：切面在特定连接点上执行具体动作，分为：&amp;nbsp;&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/ol&gt;&lt;h2 style=&quot;font-weight: 700;line-height: 1.4em;margin: 1em 0 .5em;color: #222;font-size: 1.125em;&quot; class=&quot;js_darkmode__7 js_darkmode__text__59&quot;&gt;&lt;span class=&quot;js_darkmode__text__60&quot;&gt;AOP 实现原理&lt;/span&gt;&lt;/h2&gt;&lt;p style=&quot;color: #333;font-size: 15px;line-height: 1.75em;margin: 0 0 1em;word-wrap: break-word;&quot; class=&quot;js_darkmode__8 js_darkmode__text__61&quot;&gt;&lt;span class=&quot;js_darkmode__text__62&quot;&gt;AOP的本质是&lt;/span&gt;&lt;strong style=&quot;font-weight: bolder;&quot; class=&quot;js_darkmode__text__63&quot;&gt;&lt;span class=&quot;js_darkmode__text__64&quot;&gt;动态代理&lt;/span&gt;&lt;/strong&gt;&lt;span class=&quot;js_darkmode__text__65&quot;&gt;。它在不修改源码的情况下，在内存中为目标方法生成一个“代理对象&amp;quot;。当调用该方法时，实际上是调用了代理对象的方法，代理对象会在调用真实的方法前后插入切面逻辑。&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;color: #333;font-size: 15px;line-height: 1.75em;margin: 0 0 1em;word-wrap: break-word;&quot; class=&quot;js_darkmode__9 js_darkmode__text__66&quot;&gt;&lt;span class=&quot;js_darkmode__text__67&quot;&gt;在.NET生态中，AOP 的实现原理主要分为以下几种流派：&lt;/span&gt;&lt;/p&gt;&lt;ol style=&quot;margin: 1em 0;padding-left: 2em;&quot; class=&quot;js_darkmode__text__68 list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p style=&quot;color: #333;font-size: 15px;line-height: 1.75em;word-wrap: break-word;margin: 0;&quot; class=&quot;js_darkmode__10 js_darkmode__text__70&quot;&gt;&lt;strong style=&quot;font-weight: bolder;&quot; class=&quot;js_darkmode__text__71&quot;&gt;&lt;span class=&quot;js_darkmode__text__72&quot;&gt;运行时动态代理(runtime dynamic Proxy)&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p style=&quot;color: #333;font-size: 15px;line-height: 1.75em;word-wrap: break-word;margin: 0;&quot; class=&quot;js_darkmode__11 js_darkmode__text__73&quot;&gt;&lt;span class=&quot;js_darkmode__text__74&quot;&gt;这是.NET中最主流的AOP 实现方法如(Castle.Core、AspnetCore、ABP等框架都基于此)&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;ul style=&quot;margin: 1em 0;padding-left: 2em;&quot; class=&quot;js_darkmode__text__75 list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;section class=&quot;js_darkmode__text__77&quot;&gt;&lt;span class=&quot;js_darkmode__text__78&quot;&gt;开发者在DI(依赖注入)容器中注册服务，指定需要AOP拦截&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section class=&quot;js_darkmode__text__80&quot;&gt;&lt;span class=&quot;js_darkmode__text__81&quot;&gt;DI容器在解析服务时，不直接实例化真实类，而是调用&lt;span class=&quot;&quot;&gt;Castle&lt;/span&gt;等库生成代理类&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section class=&quot;js_darkmode__text__83&quot;&gt;&lt;span class=&quot;js_darkmode__text__84&quot;&gt;外部调用方法时，触发代理类的&lt;/span&gt;&lt;code style=&quot;font-family: monospace;background: #f5f5f5;padding: .1em .3em;border-radius: 3px;font-size: .9em;&quot; class=&quot;js_darkmode__12 js_darkmode__text__85&quot;&gt;&lt;span class=&quot;js_darkmode__text__86&quot;&gt;Intercept(IInvcation invcation)&lt;/span&gt;&lt;/code&gt;&lt;span class=&quot;js_darkmode__text__87&quot;&gt;方法&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section class=&quot;js_darkmode__text__89&quot;&gt;&lt;span class=&quot;js_darkmode__text__90&quot;&gt;在&lt;/span&gt;&lt;code style=&quot;font-family: monospace;background: #f5f5f5;padding: .1em .3em;border-radius: 3px;font-size: .9em;&quot; class=&quot;js_darkmode__13 js_darkmode__text__91&quot;&gt;&lt;span class=&quot;js_darkmode__text__92&quot;&gt;Intercept&lt;/span&gt;&lt;/code&gt;&lt;span class=&quot;js_darkmode__text__93&quot;&gt;中执行前置逻辑-&amp;gt;调用&lt;/span&gt;&lt;code style=&quot;font-family: monospace;background: #f5f5f5;padding: .1em .3em;border-radius: 3px;font-size: .9em;&quot; class=&quot;js_darkmode__14 js_darkmode__text__94&quot;&gt;&lt;span class=&quot;js_darkmode__text__95&quot;&gt;invcation.Proceed()&lt;/span&gt;&lt;/code&gt;&lt;span class=&quot;js_darkmode__text__96&quot;&gt;执行真实的方法-&amp;gt;执行后置逻辑。&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul style=&quot;margin: 1em 0;padding-left: 2em;&quot; class=&quot;js_darkmode__text__97 list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;section class=&quot;js_darkmode__text__99&quot;&gt;&lt;span class=&quot;js_darkmode__text__100&quot;&gt;基于接口代理(Interface-based)：如果目标类实现了接口，代理类会继承该接口，并在内部持有一个真实对象的引用。在调用接口方法时，代理类先执行拦截器(Interceptor)，再调用真实的对象方法&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section class=&quot;js_darkmode__text__102&quot;&gt;&lt;span class=&quot;js_darkmode__text__103&quot;&gt;基于类继承代理(Class-based)：如果目标类没有接口，代理类会继承目标类。注意，这种方式要求目标类必须是virtual(虚方法)，因为代理类是通过override 虚方法来插入逻辑的。&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul style=&quot;margin: 1em 0;padding-left: 2em;&quot; class=&quot;js_darkmode__text__104 list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;section class=&quot;js_darkmode__text__106&quot;&gt;&lt;span class=&quot;js_darkmode__text__107&quot;&gt;原理：利用.NET的反射和&lt;/span&gt;&lt;code style=&quot;font-family: monospace;background: #f5f5f5;padding: .1em .3em;border-radius: 3px;font-size: .9em;&quot; class=&quot;js_darkmode__15 js_darkmode__text__108&quot;&gt;&lt;span class=&quot;js_darkmode__text__109&quot;&gt;System.Reflection.Emit&lt;/span&gt;&lt;/code&gt;&lt;span class=&quot;js_darkmode__text__110&quot;&gt;命名空间，在程序运行时动态生成一个新的类(代理类)&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section class=&quot;js_darkmode__text__112&quot;&gt;&lt;span class=&quot;js_darkmode__text__113&quot;&gt;两种代理模式：&amp;nbsp;&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section class=&quot;js_darkmode__text__115&quot;&gt;&lt;span class=&quot;js_darkmode__text__116&quot;&gt;工作流程：&amp;nbsp;&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;p style=&quot;color: #333;font-size: 15px;line-height: 1.75em;word-wrap: break-word;margin: 0;&quot; class=&quot;js_darkmode__16 js_darkmode__text__118&quot;&gt;&lt;strong style=&quot;font-weight: bolder;&quot; class=&quot;js_darkmode__text__119&quot;&gt;&lt;span class=&quot;js_darkmode__text__120&quot;&gt;编译时/构建时织入(Compile-time/Build-time Weaving)&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p style=&quot;color: #333;font-size: 15px;line-height: 1.75em;word-wrap: break-word;margin: 0;&quot; class=&quot;js_darkmode__17 js_darkmode__text__121&quot;&gt;&lt;span class=&quot;js_darkmode__text__122&quot;&gt;这种方式在代码编译阶段就修改了IL(中间语言)代码。&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;ul style=&quot;margin: 1em 0;padding-left: 2em;&quot; class=&quot;js_darkmode__text__123 list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;section class=&quot;js_darkmode__text__125&quot;&gt;&lt;span class=&quot;js_darkmode__text__126&quot;&gt;原理：利用Mono.Cecil或Roslyn等工具，在编译后读取DLL，直接在IL代码中注入切面逻辑，然后重新保存DLL&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section class=&quot;js_darkmode__text__128&quot;&gt;&lt;span class=&quot;js_darkmode__text__129&quot;&gt;代表工具：&lt;/span&gt;&lt;strong style=&quot;font-weight: bolder;&quot; class=&quot;js_darkmode__text__130&quot;&gt;&lt;span class=&quot;js_darkmode__text__131&quot;&gt;Fody&lt;/span&gt;&lt;/strong&gt;&lt;span class=&quot;js_darkmode__text__132&quot;&gt;&amp;nbsp;(如 PropertyChanged.Fody, MethodTimer.Fody)。&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section class=&quot;js_darkmode__text__134&quot;&gt;&lt;span class=&quot;js_darkmode__text__135&quot;&gt;特点：没有运行时动态生成代理类的开销，性能极高；但调试相对困难，因为生成的代码在源码中看不到&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;p style=&quot;color: #333;font-size: 15px;line-height: 1.75em;word-wrap: break-word;margin: 0;&quot; class=&quot;js_darkmode__18 js_darkmode__text__137&quot;&gt;&lt;strong style=&quot;font-weight: bolder;&quot; class=&quot;js_darkmode__text__138&quot;&gt;&lt;span class=&quot;js_darkmode__text__139&quot;&gt;.NET官方原生方案：Source Generators（源码生成器）&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p style=&quot;color: #333;font-size: 15px;line-height: 1.75em;word-wrap: break-word;margin: 0;&quot; class=&quot;js_darkmode__19 js_darkmode__text__140&quot;&gt;&lt;span class=&quot;js_darkmode__text__141&quot;&gt;随着C# 9.0引入了source Generators,这是目前.NET社区最推崇的现代AOP 实现方式(如Razor、Blazor底层都在用。)&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;ul style=&quot;margin: 1em 0;padding-left: 2em;&quot; class=&quot;js_darkmode__text__142 list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;section class=&quot;js_darkmode__text__144&quot;&gt;&lt;span class=&quot;js_darkmode__text__145&quot;&gt;原理：在编译阶段，编译器将源码解析成语法树(Syntax Tree)，Source Generator 分析语法树，动态生成额外的C#代码文件，并将他们一起编译&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section class=&quot;js_darkmode__text__147&quot;&gt;&lt;span class=&quot;js_darkmode__text__148&quot;&gt;代表工具：&lt;/span&gt;&lt;strong style=&quot;font-weight: bolder;&quot; class=&quot;js_darkmode__text__149&quot;&gt;&lt;span class=&quot;js_darkmode__text__150&quot;&gt;&lt;span class=&quot;&quot;&gt;AspectInjector&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;span class=&quot;js_darkmode__text__151&quot;&gt;、&lt;/span&gt;&lt;strong style=&quot;font-weight: bolder;&quot; class=&quot;js_darkmode__text__152&quot;&gt;&lt;span class=&quot;js_darkmode__text__153&quot;&gt;Meziantou.Framework&lt;/span&gt;&lt;/strong&gt;&lt;span class=&quot;js_darkmode__text__154&quot;&gt;。&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section class=&quot;js_darkmode__text__156&quot;&gt;&lt;span class=&quot;js_darkmode__text__157&quot;&gt;特点：性能等同于手写代码(因为在编译期生成了真实代码)，完全支持IDE智能提示和调试，且不需要依赖第三方动态代理库&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;p style=&quot;color: #333;font-size: 15px;line-height: 1.75em;word-wrap: break-word;margin: 0;&quot; class=&quot;js_darkmode__20 js_darkmode__text__159&quot;&gt;&lt;strong style=&quot;font-weight: bolder;&quot; class=&quot;js_darkmode__text__160&quot;&gt;&lt;span class=&quot;js_darkmode__text__161&quot;&gt;声明式/框架级AOP(如：Asp.NET Core Filters)&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p style=&quot;color: #333;font-size: 15px;line-height: 1.75em;word-wrap: break-word;margin: 0;&quot; class=&quot;js_darkmode__21 js_darkmode__text__162&quot;&gt;&lt;span class=&quot;js_darkmode__text__163&quot;&gt;在ASP.NET Core 中Fliters 也是一种AOP，但它不是通过代理来实现的，而是通过&lt;/span&gt;&lt;strong style=&quot;font-weight: bolder;&quot; class=&quot;js_darkmode__text__164&quot;&gt;&lt;span class=&quot;js_darkmode__text__165&quot;&gt;管道模式&lt;/span&gt;&lt;/strong&gt;&lt;span class=&quot;js_darkmode__text__166&quot;&gt;来实现的。&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;ul style=&quot;margin: 1em 0;padding-left: 2em;&quot; class=&quot;js_darkmode__text__167 list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;section class=&quot;js_darkmode__text__169&quot;&gt;&lt;span class=&quot;js_darkmode__text__170&quot;&gt;原理：MVC框架在内部维护了一个过滤器列表，当HTTP请求进入时，框架按照顺序执行过滤器链，最后才执行Controller中的Action。它只作用于Web层的特定生命周期。&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/ol&gt;&lt;h2 style=&quot;font-weight: 700;line-height: 1.4em;margin: 1em 0 .5em;color: #222;font-size: 1.125em;&quot; class=&quot;js_darkmode__22 js_darkmode__text__171&quot;&gt;&lt;span class=&quot;js_darkmode__text__172&quot;&gt;总结&lt;/span&gt;&lt;/h2&gt;&lt;ul style=&quot;margin: 1em 0;padding-left: 2em;&quot; class=&quot;js_darkmode__text__173 list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;section class=&quot;js_darkmode__text__175&quot;&gt;&lt;span class=&quot;js_darkmode__text__176&quot;&gt;AOP是思想：把重复、非业务的逻辑抽离出来，统一处理&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section class=&quot;js_darkmode__text__178&quot;&gt;&lt;span class=&quot;js_darkmode__text__179&quot;&gt;动态代理是手段，在.NET中，绝大多数AOP框架(如Castle)都是通过运行时设工程子类或者接口实现类来拦截方法调用的&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section class=&quot;js_darkmode__text__181&quot;&gt;&lt;span class=&quot;js_darkmode__text__182&quot;&gt;现代趋势：.NET开发者正逐渐从传统的运行时动态代理(castle)向编译时源码生成(Source Generators)迁移，以获取更好的性能和开发体验。&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Fri, 10 Jul 2026 09:27:16 +0800</pubDate></item><item><title>[开源]一套开源企业级在线文档编辑与免费协作解决方案，永久开源 · 可私有部署 · 可二次开发</title><link>https://www.codepub.top/post/620.html</link><description>&lt;h1 data-track=&quot;16&quot; style=&quot;margin: 20px 0px;padding: 0px;border: 0px;width: 328px;font-weight: 700;vertical-align: middle;color: rgb(34, 34, 34);font-size: 1.059em;line-height: 1.71;font-family: -apple-system, helvetica, sans-serif;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: justify;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;&quot; class=&quot;js_darkmode__0 js_darkmode__text__3&quot;&gt;&lt;span class=&quot;js_darkmode__text__4&quot;&gt;一、开源项目简介&lt;/span&gt;&lt;/h1&gt;&lt;h1 data-track=&quot;17&quot; style=&quot;margin: 20px 0px;padding: 0px;border: 0px;width: 328px;font-weight: 700;vertical-align: middle;color: rgb(34, 34, 34);font-size: 1.059em;line-height: 1.71;font-family: -apple-system, helvetica, sans-serif;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: justify;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;&quot; class=&quot;js_darkmode__1 js_darkmode__text__5&quot;&gt;&lt;span class=&quot;js_darkmode__text__6&quot;&gt;VerveDocs - 玉衡云文档&lt;/span&gt;&lt;/h1&gt;&lt;p data-track=&quot;29&quot; style=&quot;margin: 20px 0px;padding: 0px;border: 0px;color: rgb(34, 34, 34);font-family: -apple-system, helvetica, sans-serif;font-size: 17px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: justify;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;&quot; class=&quot;js_darkmode__2 js_darkmode__text__7&quot;&gt;&lt;span class=&quot;js_darkmode__text__8&quot;&gt;一套基于 Vue 3 + TypeScript 的企业级在线文档编辑解决方案，支持 Word、Excel、PPT 等多种文档格式的在线编辑与协作。&lt;/span&gt;&lt;/p&gt;&lt;h1 data-track=&quot;18&quot; style=&quot;margin: 20px 0px;padding: 0px;border: 0px;width: 328px;font-weight: 700;vertical-align: middle;color: rgb(34, 34, 34);font-size: 1.059em;line-height: 1.71;font-family: -apple-system, helvetica, sans-serif;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: justify;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;&quot; class=&quot;js_darkmode__3 js_darkmode__text__9&quot;&gt;&lt;span class=&quot;js_darkmode__text__10&quot;&gt;二、开源协议&lt;/span&gt;&lt;/h1&gt;&lt;p data-track=&quot;19&quot; style=&quot;margin: 20px 0px;padding: 0px;border: 0px;color: rgb(34, 34, 34);font-family: -apple-system, helvetica, sans-serif;font-size: 17px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: justify;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;&quot; class=&quot;js_darkmode__4 js_darkmode__text__11&quot;&gt;&lt;span class=&quot;js_darkmode__text__12&quot;&gt;使用MIT开源协议&lt;/span&gt;&lt;/p&gt;&lt;h1 data-track=&quot;20&quot; style=&quot;margin: 20px 0px;padding: 0px;border: 0px;width: 328px;font-weight: 700;vertical-align: middle;color: rgb(34, 34, 34);font-size: 1.059em;line-height: 1.71;font-family: -apple-system, helvetica, sans-serif;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: justify;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;&quot; class=&quot;js_darkmode__5 js_darkmode__text__13&quot;&gt;&lt;span class=&quot;js_darkmode__text__14&quot;&gt;三、界面展示&lt;/span&gt;&lt;/h1&gt;&lt;p&gt;&lt;section style=&quot;text-align: center;&quot;&gt;&lt;img data-src=&quot;https://mmbiz.qpic.cn/mmbiz_png/rvbNscYfLzbicib915UHmSACpNbqhbl6auZicHzjicFibI1cicaeMEAuQwUia0RA9T9uY4KtrjlBxeXqbQBloLH3CUe6vYL8icUnnlicDUPpDuL7ia5J4/640?wx_fmt=png&amp;amp;from=appmsg&amp;amp;watermark=1#imgIndex=0&quot; class=&quot;rich_pages wxw-img js_insertlocalimg&quot; data-ratio=&quot;1.7101851851851853&quot; data-s=&quot;300,640&quot; data-type=&quot;png&quot; data-w=&quot;1080&quot; type=&quot;block&quot; data-imgfileid=&quot;100025608&quot; data-aistatus=&quot;1&quot; data-original-style=&quot;null&quot; data-index=&quot;0&quot; src=&quot;https://mmbiz.qpic.cn/mmbiz_png/rvbNscYfLzbicib915UHmSACpNbqhbl6auZicHzjicFibI1cicaeMEAuQwUia0RA9T9uY4KtrjlBxeXqbQBloLH3CUe6vYL8icUnnlicDUPpDuL7ia5J4/640?wx_fmt=png&amp;from=appmsg&amp;wxfrom=13&amp;tp=wxpic&amp;watermark=1#imgIndex=0&quot; _width=&quot;677px&quot; __sec_open_place_holder__=&quot;true&quot; data-sec-load-status=&quot;2&quot; style=&quot;height: auto !important; visibility: visible !important; width: 677px !important;&quot; data-report-img-idx=&quot;0&quot; alt=&quot;图片&quot;/&gt;&lt;/section&gt;&lt;section style=&quot;text-align: center;&quot;&gt;&lt;img data-src=&quot;https://mmbiz.qpic.cn/mmbiz_png/rvbNscYfLzZlbdib4HqLcVt3YoRBFj8cLzwRv8uicuRVKkoRUyZLxzDeqIXmiaTCwLMoo9FJP3c8qbRuYvwUKSTaUPTmz8dTVEWoWp9hV6QXNE/640?wx_fmt=png&amp;amp;from=appmsg&amp;amp;watermark=1#imgIndex=1&quot; class=&quot;rich_pages wxw-img js_insertlocalimg&quot; data-ratio=&quot;0.512962962962963&quot; data-s=&quot;300,640&quot; data-type=&quot;png&quot; data-w=&quot;1080&quot; type=&quot;block&quot; data-imgfileid=&quot;100025606&quot; data-aistatus=&quot;1&quot; data-original-style=&quot;null&quot; data-index=&quot;1&quot; src=&quot;https://mmbiz.qpic.cn/mmbiz_png/rvbNscYfLzZlbdib4HqLcVt3YoRBFj8cLzwRv8uicuRVKkoRUyZLxzDeqIXmiaTCwLMoo9FJP3c8qbRuYvwUKSTaUPTmz8dTVEWoWp9hV6QXNE/640?wx_fmt=png&amp;from=appmsg&amp;tp=wxpic&amp;wxfrom=5&amp;wx_lazy=1&amp;watermark=1#imgIndex=1&quot; _width=&quot;677px&quot; __sec_open_place_holder__=&quot;true&quot; style=&quot;height: auto !important; visibility: visible !important; width: 677px !important;&quot; alt=&quot;图片&quot; data-before-load-time=&quot;1783606197328&quot; data-report-img-idx=&quot;1&quot; data-fail=&quot;0&quot;/&gt;&lt;/section&gt;&lt;section style=&quot;text-align: center;&quot;&gt;&lt;img data-src=&quot;https://mmbiz.qpic.cn/mmbiz_png/rvbNscYfLza17gSwsQ0jJwTYZc1MUubguOTpQJLbhEHplaR6qC8QQDZxBEq5bGKcgb1UU0Mpic9ibEKJ1EUibgLOab9pLOfJ6S8yVp9h83C9Ug/640?wx_fmt=png&amp;amp;from=appmsg&amp;amp;watermark=1#imgIndex=2&quot; class=&quot;rich_pages wxw-img js_insertlocalimg&quot; data-ratio=&quot;0.512962962962963&quot; data-s=&quot;300,640&quot; data-type=&quot;png&quot; data-w=&quot;1080&quot; type=&quot;block&quot; data-imgfileid=&quot;100025607&quot; data-aistatus=&quot;1&quot; data-original-style=&quot;null&quot; data-index=&quot;2&quot; src=&quot;https://mmbiz.qpic.cn/mmbiz_png/rvbNscYfLza17gSwsQ0jJwTYZc1MUubguOTpQJLbhEHplaR6qC8QQDZxBEq5bGKcgb1UU0Mpic9ibEKJ1EUibgLOab9pLOfJ6S8yVp9h83C9Ug/640?wx_fmt=png&amp;from=appmsg&amp;tp=wxpic&amp;wxfrom=5&amp;wx_lazy=1&amp;watermark=1#imgIndex=2&quot; _width=&quot;677px&quot; __sec_open_place_holder__=&quot;true&quot; style=&quot;height: auto !important; visibility: visible !important; width: 677px !important;&quot; alt=&quot;图片&quot; data-before-load-time=&quot;1783606197626&quot; data-report-img-idx=&quot;2&quot; data-fail=&quot;0&quot;/&gt;&lt;/section&gt;&lt;section style=&quot;text-align: center;&quot;&gt;&lt;img data-src=&quot;https://mmbiz.qpic.cn/mmbiz_png/rvbNscYfLzb5fAnwn0hiblGMuibDfBGudIA6jxt2L3wwiauXtu71NHEBM5DVCSeQtUvfACX7L04r1IssE08jc1pETyAa2qwbP4GGJf4ia77icaGY/640?wx_fmt=png&amp;amp;from=appmsg&amp;amp;watermark=1#imgIndex=3&quot; class=&quot;rich_pages wxw-img js_insertlocalimg&quot; data-ratio=&quot;0.512962962962963&quot; data-s=&quot;300,640&quot; data-type=&quot;png&quot; data-w=&quot;1080&quot; type=&quot;block&quot; data-imgfileid=&quot;100025610&quot; data-aistatus=&quot;1&quot; data-original-style=&quot;null&quot; data-index=&quot;3&quot; src=&quot;https://mmbiz.qpic.cn/mmbiz_png/rvbNscYfLzb5fAnwn0hiblGMuibDfBGudIA6jxt2L3wwiauXtu71NHEBM5DVCSeQtUvfACX7L04r1IssE08jc1pETyAa2qwbP4GGJf4ia77icaGY/640?wx_fmt=png&amp;from=appmsg&amp;tp=wxpic&amp;wxfrom=5&amp;wx_lazy=1&amp;watermark=1#imgIndex=3&quot; _width=&quot;677px&quot; __sec_open_place_holder__=&quot;true&quot; style=&quot;height: auto !important; visibility: visible !important; width: 677px !important;&quot; alt=&quot;图片&quot; data-before-load-time=&quot;1783606198442&quot; data-report-img-idx=&quot;3&quot; data-fail=&quot;0&quot;/&gt;&lt;/section&gt;&lt;section style=&quot;text-align: center;&quot;&gt;&lt;img data-src=&quot;https://mmbiz.qpic.cn/sz_mmbiz_png/rvbNscYfLzboNDONXoXw0WJBWetaXnlP7orZ7jjD5Qua10GXKZYRHjsNPOibdQN3Kwm4xtU1icOEGpu8IT2gicCaDlYIibnF3PmbsaxRDmOKeEg/640?wx_fmt=png&amp;amp;from=appmsg&amp;amp;watermark=1#imgIndex=4&quot; class=&quot;rich_pages wxw-img js_insertlocalimg&quot; data-ratio=&quot;0.512962962962963&quot; data-s=&quot;300,640&quot; data-type=&quot;png&quot; data-w=&quot;1080&quot; type=&quot;block&quot; data-imgfileid=&quot;100025609&quot; data-aistatus=&quot;1&quot; data-original-style=&quot;null&quot; data-index=&quot;4&quot; src=&quot;https://mmbiz.qpic.cn/sz_mmbiz_png/rvbNscYfLzboNDONXoXw0WJBWetaXnlP7orZ7jjD5Qua10GXKZYRHjsNPOibdQN3Kwm4xtU1icOEGpu8IT2gicCaDlYIibnF3PmbsaxRDmOKeEg/640?wx_fmt=png&amp;from=appmsg&amp;tp=wxpic&amp;wxfrom=5&amp;wx_lazy=1&amp;watermark=1#imgIndex=4&quot; _width=&quot;677px&quot; __sec_open_place_holder__=&quot;true&quot; style=&quot;height: auto !important; visibility: visible !important; width: 677px !important;&quot; alt=&quot;图片&quot; data-before-load-time=&quot;1783606198511&quot; data-report-img-idx=&quot;4&quot; data-fail=&quot;0&quot;/&gt;&lt;/section&gt;&lt;/p&gt;&lt;h1 data-track=&quot;22&quot; style=&quot;margin: 20px 0px;padding: 0px;border: 0px;width: 328px;font-weight: 700;vertical-align: middle;color: rgb(34, 34, 34);font-size: 1.059em;line-height: 1.71;font-family: -apple-system, helvetica, sans-serif;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: justify;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;&quot; data-pm-slice=&quot;0 0 []&quot; class=&quot;js_darkmode__6 js_darkmode__text__15&quot;&gt;&lt;span class=&quot;js_darkmode__text__16&quot;&gt;四、功能概述&lt;/span&gt;&lt;/h1&gt;&lt;h1 data-track=&quot;89&quot; style=&quot;margin: 20px 0px;padding: 0px;border: 0px;width: 328px;font-weight: 700;vertical-align: middle;color: rgb(34, 34, 34);font-size: 1.059em;line-height: 1.71;font-family: -apple-system, helvetica, sans-serif;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: justify;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;&quot; class=&quot;js_darkmode__7 js_darkmode__text__17&quot;&gt;&lt;span class=&quot;js_darkmode__text__18&quot;&gt;在线文档编辑与免费协作产品&lt;/span&gt;&lt;/h1&gt;&lt;p data-track=&quot;90&quot; style=&quot;margin: 20px 0px;padding: 0px;border: 0px;color: rgb(34, 34, 34);font-family: -apple-system, helvetica, sans-serif;font-size: 17px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: justify;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;&quot; class=&quot;js_darkmode__8 js_darkmode__text__19&quot;&gt;&lt;span class=&quot;js_darkmode__text__20&quot;&gt;永久开源 · 可私有部署 · 可二次开发&lt;/span&gt;&lt;/p&gt;&lt;p data-track=&quot;91&quot; style=&quot;margin: 20px 0px;padding: 0px;border: 0px;color: rgb(34, 34, 34);font-family: -apple-system, helvetica, sans-serif;font-size: 17px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: justify;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;&quot; class=&quot;js_darkmode__9 js_darkmode__text__21&quot;&gt;&lt;span class=&quot;js_darkmode__text__22&quot;&gt;VerveDocs 是一套开源在线文档编辑与协作解决方案；提供开箱即用的在线文档编辑器（兼容 Word）、轻量版文档编辑器、在线电子表格编辑器（兼容 Excel）和在线演示文稿编辑器（兼容 PowerPoint）。&lt;/span&gt;&lt;/p&gt;&lt;h1 style=&quot;margin: 20px 0px;padding: 0px;border: 0px;width: 328px;font-weight: 700;vertical-align: middle;color: rgb(34, 34, 34);font-size: 1.059em;line-height: 1.71;font-family: -apple-system, helvetica, sans-serif;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: justify;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;&quot; data-pm-slice=&quot;0 0 []&quot; class=&quot;js_darkmode__10 js_darkmode__text__23&quot;&gt;&lt;span class=&quot;js_darkmode__text__24&quot;&gt;在线文档&lt;/span&gt;&lt;/h1&gt;&lt;p data-track=&quot;124&quot; style=&quot;margin: 20px 0px;padding: 0px;border: 0px;color: rgb(34, 34, 34);font-family: -apple-system, helvetica, sans-serif;font-size: 17px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: justify;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;&quot; class=&quot;js_darkmode__11 js_darkmode__text__25&quot;&gt;&lt;span class=&quot;js_darkmode__text__26&quot;&gt;在线文档编辑器(兼容Microsoft Word格式)&lt;/span&gt;&lt;/p&gt;&lt;h1 style=&quot;margin: 20px 0px;padding: 0px;border: 0px;width: 328px;font-weight: 700;vertical-align: middle;color: rgb(34, 34, 34);font-size: 1.059em;line-height: 1.71;font-family: -apple-system, helvetica, sans-serif;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: justify;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;&quot; class=&quot;js_darkmode__12 js_darkmode__text__27&quot;&gt;&lt;span class=&quot;js_darkmode__text__28&quot;&gt;轻量版 Lite&lt;/span&gt;&lt;/h1&gt;&lt;p data-track=&quot;127&quot; style=&quot;margin: 20px 0px;padding: 0px;border: 0px;color: rgb(34, 34, 34);font-family: -apple-system, helvetica, sans-serif;font-size: 17px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: justify;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;&quot; class=&quot;js_darkmode__13 js_darkmode__text__29&quot;&gt;&lt;span class=&quot;js_darkmode__text__30&quot;&gt;轻量级在线文档编辑器(兼容Microsoft Word格式)&lt;/span&gt;&lt;/p&gt;&lt;h1 style=&quot;margin: 20px 0px;padding: 0px;border: 0px;width: 328px;font-weight: 700;vertical-align: middle;color: rgb(34, 34, 34);font-size: 1.059em;line-height: 1.71;font-family: -apple-system, helvetica, sans-serif;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: justify;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;&quot; class=&quot;js_darkmode__14 js_darkmode__text__31&quot;&gt;&lt;span class=&quot;js_darkmode__text__32&quot;&gt;在线表格&lt;/span&gt;&lt;/h1&gt;&lt;p data-track=&quot;128&quot; style=&quot;margin: 20px 0px;padding: 0px;border: 0px;color: rgb(34, 34, 34);font-family: -apple-system, helvetica, sans-serif;font-size: 17px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: justify;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;&quot; class=&quot;js_darkmode__15 js_darkmode__text__33&quot;&gt;&lt;span class=&quot;js_darkmode__text__34&quot;&gt;在线电子表格编辑器，(兼容Microsoft Excel格式)&lt;/span&gt;&lt;/p&gt;&lt;h1 style=&quot;margin: 20px 0px;padding: 0px;border: 0px;width: 328px;font-weight: 700;vertical-align: middle;color: rgb(34, 34, 34);font-size: 1.059em;line-height: 1.71;font-family: -apple-system, helvetica, sans-serif;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: justify;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;&quot; class=&quot;js_darkmode__16 js_darkmode__text__35&quot;&gt;&lt;span class=&quot;js_darkmode__text__36&quot;&gt;在线演示&lt;/span&gt;&lt;/h1&gt;&lt;p data-track=&quot;129&quot; style=&quot;margin: 20px 0px;padding: 0px;border: 0px;color: rgb(34, 34, 34);font-family: -apple-system, helvetica, sans-serif;font-size: 17px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: justify;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;&quot; class=&quot;js_darkmode__17 js_darkmode__text__37&quot;&gt;&lt;span class=&quot;js_darkmode__text__38&quot;&gt;在线演示文稿编辑器(兼容Microsoft PowerPoint格式)&lt;/span&gt;&lt;/p&gt;&lt;h1 data-track=&quot;23&quot; style=&quot;margin: 20px 0px;padding: 0px;border: 0px;width: 328px;font-weight: 700;vertical-align: middle;color: rgb(34, 34, 34);font-size: 1.059em;line-height: 1.71;font-family: -apple-system, helvetica, sans-serif;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: justify;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;&quot; class=&quot;js_darkmode__18 js_darkmode__text__39&quot;&gt;&lt;span class=&quot;js_darkmode__text__40&quot;&gt;特性&lt;/span&gt;&lt;/h1&gt;&lt;ul style=&quot;list-style-type: disc;&quot; class=&quot;js_darkmode__text__41 list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;section class=&quot;js_darkmode__text__43&quot;&gt;&lt;span class=&quot;js_darkmode__text__44&quot;&gt;多格式支持：Word 文档、Excel 表格、PPT 演示文稿&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section class=&quot;js_darkmode__text__46&quot;&gt;&lt;span class=&quot;js_darkmode__text__47&quot;&gt;富文本编辑：文本格式化、表格、图片、列表、页眉页脚、水印等&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section class=&quot;js_darkmode__text__49&quot;&gt;&lt;span class=&quot;js_darkmode__text__50&quot;&gt;实时协作：多人在线协同编辑&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section class=&quot;js_darkmode__text__52&quot;&gt;&lt;span class=&quot;js_darkmode__text__53&quot;&gt;插件系统：可扩展的功能插件机制&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section class=&quot;js_darkmode__text__55&quot;&gt;&lt;span class=&quot;js_darkmode__text__56&quot;&gt;TypeScript 支持：完整的类型定义&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section class=&quot;js_darkmode__text__58&quot;&gt;&lt;span class=&quot;js_darkmode__text__59&quot;&gt;响应式设计：适配多种屏幕尺寸&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h1 data-track=&quot;97&quot; style=&quot;margin: 20px 0px;padding: 0px;border: 0px;width: 328px;font-weight: 700;vertical-align: middle;color: rgb(34, 34, 34);font-size: 1.059em;line-height: 1.71;font-family: -apple-system, helvetica, sans-serif;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: justify;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;&quot; class=&quot;js_darkmode__19 js_darkmode__text__60&quot;&gt;&lt;span class=&quot;js_darkmode__text__61&quot;&gt;核心引擎能力&lt;/span&gt;&lt;/h1&gt;&lt;p data-track=&quot;98&quot; style=&quot;margin: 20px 0px;padding: 0px;border: 0px;color: rgb(34, 34, 34);font-family: -apple-system, helvetica, sans-serif;font-size: 17px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: justify;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;&quot; class=&quot;js_darkmode__20 js_darkmode__text__62&quot;&gt;&lt;strong style=&quot;margin: 0px;padding: 0px;border: 0px;font-weight: 700;&quot; class=&quot;js_darkmode__text__63&quot;&gt;&lt;span class=&quot;js_darkmode__text__64&quot;&gt;分页模式&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p data-track=&quot;99&quot; style=&quot;margin: 20px 0px;padding: 0px;border: 0px;color: rgb(34, 34, 34);font-family: -apple-system, helvetica, sans-serif;font-size: 17px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: justify;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;&quot; class=&quot;js_darkmode__21 js_darkmode__text__65&quot;&gt;&lt;span class=&quot;js_darkmode__text__66&quot;&gt;分页渲染与纸张设置,支持缩放、边距、页眉页脚与页码。&lt;/span&gt;&lt;/p&gt;&lt;p data-track=&quot;100&quot; style=&quot;margin: 20px 0px;padding: 0px;border: 0px;color: rgb(34, 34, 34);font-family: -apple-system, helvetica, sans-serif;font-size: 17px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: justify;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;&quot; class=&quot;js_darkmode__22 js_darkmode__text__67&quot;&gt;&lt;strong style=&quot;margin: 0px;padding: 0px;border: 0px;font-weight: 700;&quot; class=&quot;js_darkmode__text__68&quot;&gt;&lt;span class=&quot;js_darkmode__text__69&quot;&gt;文本编辑&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p data-track=&quot;101&quot; style=&quot;margin: 20px 0px;padding: 0px;border: 0px;color: rgb(34, 34, 34);font-family: -apple-system, helvetica, sans-serif;font-size: 17px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: justify;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;&quot; class=&quot;js_darkmode__23 js_darkmode__text__70&quot;&gt;&lt;span class=&quot;js_darkmode__text__71&quot;&gt;字体、字号、加粗/斜体/下划线、颜色、高亮、标题与列表。&lt;/span&gt;&lt;/p&gt;&lt;p data-track=&quot;102&quot; style=&quot;margin: 20px 0px;padding: 0px;border: 0px;color: rgb(34, 34, 34);font-family: -apple-system, helvetica, sans-serif;font-size: 17px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: justify;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;&quot; class=&quot;js_darkmode__24 js_darkmode__text__72&quot;&gt;&lt;strong style=&quot;margin: 0px;padding: 0px;border: 0px;font-weight: 700;&quot; class=&quot;js_darkmode__text__73&quot;&gt;&lt;span class=&quot;js_darkmode__text__74&quot;&gt;表格与图片&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p data-track=&quot;103&quot; style=&quot;margin: 20px 0px;padding: 0px;border: 0px;color: rgb(34, 34, 34);font-family: -apple-system, helvetica, sans-serif;font-size: 17px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: justify;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;&quot; class=&quot;js_darkmode__25 js_darkmode__text__75&quot;&gt;&lt;span class=&quot;js_darkmode__text__76&quot;&gt;插入/删除行列、合并拆分单元格,图片浮动/环绕与导出。&lt;/span&gt;&lt;/p&gt;&lt;p data-track=&quot;104&quot; style=&quot;margin: 20px 0px;padding: 0px;border: 0px;color: rgb(34, 34, 34);font-family: -apple-system, helvetica, sans-serif;font-size: 17px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: justify;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;&quot; class=&quot;js_darkmode__26 js_darkmode__text__77&quot;&gt;&lt;strong style=&quot;margin: 0px;padding: 0px;border: 0px;font-weight: 700;&quot; class=&quot;js_darkmode__text__78&quot;&gt;&lt;span class=&quot;js_darkmode__text__79&quot;&gt;控件与表单&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p data-track=&quot;105&quot; style=&quot;margin: 20px 0px;padding: 0px;border: 0px;color: rgb(34, 34, 34);font-family: -apple-system, helvetica, sans-serif;font-size: 17px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: justify;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;&quot; class=&quot;js_darkmode__27 js_darkmode__text__80&quot;&gt;&lt;span class=&quot;js_darkmode__text__81&quot;&gt;文本框、选择、日期、复选/单选等控件,支持取值与批量赋值。&lt;/span&gt;&lt;/p&gt;&lt;p data-track=&quot;106&quot; style=&quot;margin: 20px 0px;padding: 0px;border: 0px;color: rgb(34, 34, 34);font-family: -apple-system, helvetica, sans-serif;font-size: 17px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: justify;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;&quot; class=&quot;js_darkmode__28 js_darkmode__text__82&quot;&gt;&lt;strong style=&quot;margin: 0px;padding: 0px;border: 0px;font-weight: 700;&quot; class=&quot;js_darkmode__text__83&quot;&gt;&lt;span class=&quot;js_darkmode__text__84&quot;&gt;事件与监听&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p data-track=&quot;107&quot; style=&quot;margin: 20px 0px;padding: 0px;border: 0px;color: rgb(34, 34, 34);font-family: -apple-system, helvetica, sans-serif;font-size: 17px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: justify;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;&quot; class=&quot;js_darkmode__29 js_darkmode__text__85&quot;&gt;&lt;span class=&quot;js_darkmode__text__86&quot;&gt;通过 eventBus 订阅内容变化、选区样式、鼠标事件、保存等事件。&lt;/span&gt;&lt;/p&gt;&lt;p data-track=&quot;108&quot; style=&quot;margin: 20px 0px;padding: 0px;border: 0px;color: rgb(34, 34, 34);font-family: -apple-system, helvetica, sans-serif;font-size: 17px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: justify;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;&quot; class=&quot;js_darkmode__30 js_darkmode__text__87&quot;&gt;&lt;strong style=&quot;margin: 0px;padding: 0px;border: 0px;font-weight: 700;&quot; class=&quot;js_darkmode__text__88&quot;&gt;&lt;span class=&quot;js_darkmode__text__89&quot;&gt;插件扩展&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p data-track=&quot;109&quot; style=&quot;margin: 20px 0px;padding: 0px;border: 0px;color: rgb(34, 34, 34);font-family: -apple-system, helvetica, sans-serif;font-size: 17px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: justify;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;&quot; class=&quot;js_darkmode__31 js_darkmode__text__90&quot;&gt;&lt;span class=&quot;js_darkmode__text__91&quot;&gt;提供 use(plugin) 扩展能力,可注入图表渲染器等高级功能。&lt;/span&gt;&lt;/p&gt;&lt;h1 data-track=&quot;37&quot; style=&quot;margin: 20px 0px;padding: 0px;border: 0px;width: 328px;font-weight: 700;vertical-align: middle;color: rgb(34, 34, 34);font-size: 1.059em;line-height: 1.71;font-family: -apple-system, helvetica, sans-serif;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: justify;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;&quot; class=&quot;js_darkmode__32 js_darkmode__text__92&quot;&gt;&lt;span class=&quot;js_darkmode__text__93&quot;&gt;为什么选择开源?&lt;/span&gt;&lt;/h1&gt;&lt;p data-track=&quot;92&quot; style=&quot;margin: 20px 0px;padding: 0px;border: 0px;color: rgb(34, 34, 34);font-family: -apple-system, helvetica, sans-serif;font-size: 17px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: justify;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;&quot; class=&quot;js_darkmode__33 js_darkmode__text__94&quot;&gt;&lt;strong style=&quot;margin: 0px;padding: 0px;border: 0px;font-weight: 700;&quot; class=&quot;js_darkmode__text__95&quot;&gt;&lt;span class=&quot;js_darkmode__text__96&quot;&gt;自主可控&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p data-track=&quot;93&quot; style=&quot;margin: 20px 0px;padding: 0px;border: 0px;color: rgb(34, 34, 34);font-family: -apple-system, helvetica, sans-serif;font-size: 17px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: justify;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;&quot; class=&quot;js_darkmode__34 js_darkmode__text__97&quot;&gt;&lt;span class=&quot;js_darkmode__text__98&quot;&gt;核心能力完全开源,支持内网部署,便于安全审计与深度定制。&lt;/span&gt;&lt;/p&gt;&lt;p data-track=&quot;94&quot; style=&quot;margin: 20px 0px;padding: 0px;border: 0px;color: rgb(34, 34, 34);font-family: -apple-system, helvetica, sans-serif;font-size: 17px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: justify;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;&quot; class=&quot;js_darkmode__35 js_darkmode__text__99&quot;&gt;&lt;strong style=&quot;margin: 0px;padding: 0px;border: 0px;font-weight: 700;&quot; class=&quot;js_darkmode__text__100&quot;&gt;&lt;span class=&quot;js_darkmode__text__101&quot;&gt;工程化 API&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p data-track=&quot;95&quot; style=&quot;margin: 20px 0px;padding: 0px;border: 0px;color: rgb(34, 34, 34);font-family: -apple-system, helvetica, sans-serif;font-size: 17px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: justify;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;&quot; class=&quot;js_darkmode__36 js_darkmode__text__102&quot;&gt;&lt;span class=&quot;js_darkmode__text__103&quot;&gt;面向二次开发的 API 文档与类型定义,便于在复杂业务中落地。&lt;/span&gt;&lt;/p&gt;&lt;h1 data-track=&quot;24&quot; style=&quot;margin: 20px 0px;padding: 0px;border: 0px;width: 328px;font-weight: 700;vertical-align: middle;color: rgb(34, 34, 34);font-size: 1.059em;line-height: 1.71;font-family: -apple-system, helvetica, sans-serif;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: justify;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;&quot; class=&quot;js_darkmode__37 js_darkmode__text__104&quot;&gt;&lt;span class=&quot;js_darkmode__text__105&quot;&gt;五、技术选型&lt;/span&gt;&lt;/h1&gt;&lt;h1 data-track=&quot;25&quot; style=&quot;margin: 20px 0px;padding: 0px;border: 0px;width: 328px;font-weight: 700;vertical-align: middle;color: rgb(34, 34, 34);font-size: 1.059em;line-height: 1.71;font-family: -apple-system, helvetica, sans-serif;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: justify;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;&quot; class=&quot;js_darkmode__38 js_darkmode__text__106&quot;&gt;&lt;span class=&quot;js_darkmode__text__107&quot;&gt;技术栈&lt;/span&gt;&lt;/h1&gt;&lt;ul style=&quot;list-style-type: disc;&quot; class=&quot;js_darkmode__text__108 list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;section class=&quot;js_darkmode__text__110&quot;&gt;&lt;span class=&quot;js_darkmode__text__111&quot;&gt;Vue 3 - 渐进式 JavaScript 框架&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section class=&quot;js_darkmode__text__113&quot;&gt;&lt;span class=&quot;js_darkmode__text__114&quot;&gt;TypeScript - JavaScript 的超集&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section class=&quot;js_darkmode__text__116&quot;&gt;&lt;span class=&quot;js_darkmode__text__117&quot;&gt;Element Plus - Vue 3 UI 组件库&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section class=&quot;js_darkmode__text__119&quot;&gt;&lt;span class=&quot;js_darkmode__text__120&quot;&gt;ECharts - 数据可视化图表库&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section class=&quot;js_darkmode__text__122&quot;&gt;&lt;span class=&quot;js_darkmode__text__123&quot;&gt;Vite - 下一代前端构建工具&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section class=&quot;js_darkmode__text__125&quot;&gt;&lt;span class=&quot;js_darkmode__text__126&quot;&gt;docx - Word 文档生成库&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section class=&quot;js_darkmode__text__128&quot;&gt;&lt;span class=&quot;js_darkmode__text__129&quot;&gt;exceljs - Excel 文件处理库&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section class=&quot;js_darkmode__text__131&quot;&gt;&lt;span class=&quot;js_darkmode__text__132&quot;&gt;pptxgenjs - PPT 生成库&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h1 data-track=&quot;46&quot; style=&quot;margin: 20px 0px;padding: 0px;border: 0px;width: 328px;font-weight: 700;vertical-align: middle;color: rgb(34, 34, 34);font-size: 1.059em;line-height: 1.71;font-family: -apple-system, helvetica, sans-serif;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: justify;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;&quot; class=&quot;js_darkmode__39 js_darkmode__text__133&quot;&gt;&lt;span class=&quot;js_darkmode__text__134&quot;&gt;项目结构&lt;/span&gt;&lt;/h1&gt;&lt;p&gt;&lt;img class=&quot;ue-image&quot; src=&quot;https://www.codepub.top/zb_users/upload/2026/07/202607091783606334621253.jpg&quot; title=&quot;ScreenShot_2026-07-09_221149_112.jpg&quot; alt=&quot;ScreenShot_2026-07-09_221149_112.jpg&quot;/&gt;&lt;/p&gt;&lt;h1 data-track=&quot;48&quot; style=&quot;margin: 20px 0px;padding: 0px;border: 0px;width: 328px;font-weight: 700;vertical-align: middle;color: rgb(34, 34, 34);font-size: 1.059em;line-height: 1.71;font-family: -apple-system, helvetica, sans-serif;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: justify;text-indent: 0px;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255)&quot; class=&quot;js_darkmode__40 js_darkmode__text__194&quot;&gt;模块介绍&lt;/h1&gt;&lt;h1 data-track=&quot;49&quot; style=&quot;margin: 20px 0px;padding: 0px;border: 0px;width: 328px;font-weight: 700;vertical-align: middle;color: rgb(34, 34, 34);font-size: 1.059em;line-height: 1.71;font-family: -apple-system, helvetica, sans-serif;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: justify;text-indent: 0px;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255)&quot; class=&quot;js_darkmode__41 js_darkmode__text__196&quot;&gt;@vervedoc/core&lt;/h1&gt;&lt;p data-track=&quot;50&quot; style=&quot;margin: 20px 0px;padding: 0px;border: 0px;color: rgb(34, 34, 34);font-family: -apple-system, helvetica, sans-serif;font-size: 17px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: justify;text-indent: 0px;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255)&quot; class=&quot;js_darkmode__42 js_darkmode__text__198&quot;&gt;核心编辑器库，提供基础的富文本编辑功能。&lt;/p&gt;&lt;p&gt;&lt;section class=&quot;code-snippet__fix code-snippet__js js_darkmode__text__200&quot;&gt;&lt;ul class=&quot;code-snippet__line-index code-snippet__js list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;pre class=&quot;code-snippet__js js_darkmode__text__201&quot; data-lang=&quot;nginx&quot;&gt;npm&amp;nbsp;install&amp;nbsp;@vervedoc/core&lt;/pre&gt;&lt;/section&gt;&lt;/p&gt;&lt;p data-track=&quot;52&quot; style=&quot;margin: 20px 0px;padding: 0px;border: 0px;color: rgb(34, 34, 34);font-family: -apple-system, helvetica, sans-serif;font-size: 17px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: justify;text-indent: 0px;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255)&quot; class=&quot;js_darkmode__43 js_darkmode__text__206&quot;&gt;主要功能：&lt;/p&gt;&lt;ul style=&quot;list-style-type: disc;&quot; class=&quot;js_darkmode__text__208 list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;section&gt;富文本编辑（加粗、斜体、下划线、删除线、高亮等）&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section&gt;表格操作（插入、合并、拆分、边框设置）&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section&gt;图片处理（插入、缩放、拖拽）&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section&gt;列表功能（有序、无序、多级列表）&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section&gt;页面布局（页眉、页脚、页码、水印、页边距）&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section&gt;控件系统（文本控件、日期控件、下拉选择）&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section&gt;历史记录（撤销/重做）&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section&gt;搜索替换&lt;/section&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h1 data-track=&quot;61&quot; style=&quot;margin: 20px 0px;padding: 0px;border: 0px;width: 328px;font-weight: 700;vertical-align: middle;color: rgb(34, 34, 34);font-size: 1.059em;line-height: 1.71;font-family: -apple-system, helvetica, sans-serif;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: justify;text-indent: 0px;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255)&quot; class=&quot;js_darkmode__44 js_darkmode__text__233&quot;&gt;@vervedoc/docx&lt;/h1&gt;&lt;p data-track=&quot;62&quot; style=&quot;margin: 20px 0px;padding: 0px;border: 0px;color: rgb(34, 34, 34);font-family: -apple-system, helvetica, sans-serif;font-size: 17px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: justify;text-indent: 0px;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255)&quot; class=&quot;js_darkmode__45 js_darkmode__text__235&quot;&gt;Word 文档编辑器完整版，提供完整的 UI 界面和交互。&lt;/p&gt;&lt;p&gt;&lt;section class=&quot;code-snippet__fix code-snippet__js js_darkmode__text__237&quot;&gt;&lt;ul class=&quot;code-snippet__line-index code-snippet__js list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;pre class=&quot;code-snippet__js js_darkmode__text__238&quot; data-lang=&quot;nginx&quot;&gt;npm&amp;nbsp;install&amp;nbsp;@vervedoc/docx&lt;/pre&gt;&lt;/section&gt;&lt;/p&gt;&lt;h1 data-track=&quot;64&quot; style=&quot;margin: 20px 0px;padding: 0px;border: 0px;width: 328px;font-weight: 700;vertical-align: middle;color: rgb(34, 34, 34);font-size: 1.059em;line-height: 1.71;font-family: -apple-system, helvetica, sans-serif;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: justify;text-indent: 0px;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255)&quot; class=&quot;js_darkmode__46 js_darkmode__text__243&quot;&gt;@vervedoc/excel&lt;/h1&gt;&lt;p data-track=&quot;65&quot; style=&quot;margin: 20px 0px;padding: 0px;border: 0px;color: rgb(34, 34, 34);font-family: -apple-system, helvetica, sans-serif;font-size: 17px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: justify;text-indent: 0px;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255)&quot; class=&quot;js_darkmode__47 js_darkmode__text__245&quot;&gt;Excel 表格编辑器，支持电子表格的在线编辑。&lt;/p&gt;&lt;p&gt;&lt;section class=&quot;code-snippet__fix code-snippet__js js_darkmode__text__247&quot;&gt;&lt;ul class=&quot;code-snippet__line-index code-snippet__js list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;pre class=&quot;code-snippet__js js_darkmode__text__248&quot; data-lang=&quot;nginx&quot;&gt;npm&amp;nbsp;install&amp;nbsp;@vervedoc/excel&lt;/pre&gt;&lt;/section&gt;&lt;/p&gt;&lt;h1 data-track=&quot;67&quot; style=&quot;margin: 20px 0px;padding: 0px;border: 0px;width: 328px;font-weight: 700;vertical-align: middle;color: rgb(34, 34, 34);font-size: 1.059em;line-height: 1.71;font-family: -apple-system, helvetica, sans-serif;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: justify;text-indent: 0px;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255)&quot; class=&quot;js_darkmode__48 js_darkmode__text__253&quot;&gt;@vervedoc/ppt&lt;/h1&gt;&lt;p data-track=&quot;68&quot; style=&quot;margin: 20px 0px;padding: 0px;border: 0px;color: rgb(34, 34, 34);font-family: -apple-system, helvetica, sans-serif;font-size: 17px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: justify;text-indent: 0px;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255)&quot; class=&quot;js_darkmode__49 js_darkmode__text__255&quot;&gt;PPT 演示文稿编辑器，支持幻灯片的在线制作。&lt;/p&gt;&lt;p&gt;&lt;section class=&quot;code-snippet__fix code-snippet__js js_darkmode__text__257&quot;&gt;&lt;ul class=&quot;code-snippet__line-index code-snippet__js list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;pre class=&quot;code-snippet__js js_darkmode__text__258&quot; data-lang=&quot;nginx&quot;&gt;npm&amp;nbsp;install&amp;nbsp;@vervedoc/ppt&lt;/pre&gt;&lt;/section&gt;&lt;/p&gt;&lt;p data-track=&quot;68&quot; style=&quot;margin: 20px 0px;padding: 0px;border: 0px;color: rgb(34, 34, 34);font-family: -apple-system, helvetica, sans-serif;font-size: 17px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: justify;text-indent: 0px;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255)&quot; class=&quot;js_darkmode__50 js_darkmode__text__263&quot;&gt;快速开始&lt;/p&gt;&lt;h1 data-track=&quot;71&quot; style=&quot;margin: 20px 0px;padding: 0px;border: 0px;width: 328px;font-weight: 700;vertical-align: middle;color: rgb(34, 34, 34);font-size: 1.059em;line-height: 1.71;font-family: -apple-system, helvetica, sans-serif;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: justify;text-indent: 0px;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255)&quot; class=&quot;js_darkmode__51 js_darkmode__text__265&quot;&gt;安装依赖&lt;/h1&gt;&lt;p&gt;&lt;img class=&quot;ue-image&quot; src=&quot;https://www.codepub.top/zb_users/upload/2026/07/202607091783606369480687.jpg&quot; title=&quot;ScreenShot_2026-07-09_221227_895.jpg&quot; alt=&quot;ScreenShot_2026-07-09_221227_895.jpg&quot;/&gt;&lt;/p&gt;&lt;h1 data-track=&quot;76&quot; style=&quot;margin: 20px 0px;padding: 0px;border: 0px;width: 328px;font-weight: 700;vertical-align: middle;color: rgb(34, 34, 34);font-size: 1.059em;line-height: 1.71;font-family: -apple-system, helvetica, sans-serif;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: justify;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;&quot; class=&quot;js_darkmode__54 js_darkmode__text__343&quot;&gt;&lt;span class=&quot;js_darkmode__text__344&quot;&gt;开发指南&lt;/span&gt;&lt;/h1&gt;&lt;h1 data-track=&quot;77&quot; style=&quot;margin: 20px 0px;padding: 0px;border: 0px;width: 328px;font-weight: 700;vertical-align: middle;color: rgb(34, 34, 34);font-size: 1.059em;line-height: 1.71;font-family: -apple-system, helvetica, sans-serif;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: justify;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;&quot; class=&quot;js_darkmode__55 js_darkmode__text__345&quot;&gt;&lt;span class=&quot;js_darkmode__text__346&quot;&gt;环境要求&lt;/span&gt;&lt;/h1&gt;&lt;ul style=&quot;list-style-type: disc;&quot; class=&quot;js_darkmode__text__347 list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;section class=&quot;js_darkmode__text__349&quot;&gt;&lt;span class=&quot;js_darkmode__text__350&quot;&gt;Node.js &amp;gt;= 16.0.0&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section class=&quot;js_darkmode__text__352&quot;&gt;&lt;span class=&quot;js_darkmode__text__353&quot;&gt;npm &amp;gt;= 7.0.0&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h1 data-track=&quot;80&quot; style=&quot;margin: 20px 0px;padding: 0px;border: 0px;width: 328px;font-weight: 700;vertical-align: middle;color: rgb(34, 34, 34);font-size: 1.059em;line-height: 1.71;font-family: -apple-system, helvetica, sans-serif;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: justify;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;&quot; class=&quot;js_darkmode__56 js_darkmode__text__354&quot;&gt;&lt;span class=&quot;js_darkmode__text__355&quot;&gt;本地开发&lt;/span&gt;&lt;/h1&gt;&lt;p&gt;&lt;img class=&quot;ue-image&quot; src=&quot;https://www.codepub.top/zb_users/upload/2026/07/202607091783606414419223.jpg&quot; title=&quot;ScreenShot_2026-07-09_221306_226.jpg&quot; alt=&quot;ScreenShot_2026-07-09_221306_226.jpg&quot;/&gt;&lt;/p&gt;&lt;p&gt;构建所有模块&lt;/p&gt;&lt;p&gt;&lt;img class=&quot;ue-image&quot; src=&quot;https://www.codepub.top/zb_users/upload/2026/07/202607091783606450547097.jpg&quot; title=&quot;ScreenShot_2026-07-09_221349_106.jpg&quot; alt=&quot;ScreenShot_2026-07-09_221349_106.jpg&quot;/&gt;&lt;/p&gt;&lt;h1 data-track=&quot;84&quot; style=&quot;margin: 20px 0px;padding: 0px;border: 0px;width: 328px;font-weight: 700;vertical-align: middle;color: rgb(34, 34, 34);font-size: 1.059em;line-height: 1.71;font-family: -apple-system, helvetica, sans-serif;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: justify;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;&quot; class=&quot;js_darkmode__58 js_darkmode__text__416&quot;&gt;&lt;span class=&quot;js_darkmode__text__417&quot;&gt;浏览器兼容性&lt;/span&gt;&lt;/h1&gt;&lt;ul style=&quot;list-style-type: disc;&quot; class=&quot;js_darkmode__text__418 list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;section class=&quot;js_darkmode__text__420&quot;&gt;&lt;span class=&quot;js_darkmode__text__421&quot;&gt;Chrome 80+&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section class=&quot;js_darkmode__text__423&quot;&gt;&lt;span class=&quot;js_darkmode__text__424&quot;&gt;Firefox 75+&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section class=&quot;js_darkmode__text__426&quot;&gt;&lt;span class=&quot;js_darkmode__text__427&quot;&gt;Safari 13.1+&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section class=&quot;js_darkmode__text__429&quot;&gt;&lt;span class=&quot;js_darkmode__text__430&quot;&gt;Edge 80+&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h1 data-track=&quot;26&quot; style=&quot;margin: 20px 0px;padding: 0px;border: 0px;width: 328px;font-weight: 700;vertical-align: middle;color: rgb(34, 34, 34);font-size: 1.059em;line-height: 1.71;font-family: -apple-system, helvetica, sans-serif;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: justify;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;&quot; class=&quot;js_darkmode__59 js_darkmode__text__431&quot;&gt;&lt;span class=&quot;js_darkmode__text__432&quot;&gt;六、源码地址&lt;/span&gt;&lt;/h1&gt;&lt;p data-track=&quot;27&quot; style=&quot;margin-top: 20px;margin-right: 0px;margin-bottom: 0px !important;margin-left: 0px;padding: 0px;border: 0px;color: rgb(34, 34, 34);font-family: -apple-system, helvetica, sans-serif;font-size: 17px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: justify;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;&quot; class=&quot;js_darkmode__60 js_darkmode__text__433&quot;&gt;&lt;span class=&quot;js_darkmode__text__434&quot;&gt;开源项目地址：&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;js_darkmode__text__435&quot;&gt;&lt;span class=&quot;js_darkmode__text__436&quot;&gt;https://gitee.com/wanghe520/vervedocs&lt;/span&gt;&lt;/p&gt;&lt;p data-track=&quot;27&quot; style=&quot;margin-top: 20px;margin-right: 0px;margin-bottom: 0px !important;margin-left: 0px;padding: 0px;border: 0px;color: rgb(34, 34, 34);font-family: -apple-system, helvetica, sans-serif;font-size: 17px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: justify;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;&quot; class=&quot;js_darkmode__61 js_darkmode__text__437&quot;&gt;&lt;span class=&quot;js_darkmode__text__438&quot;&gt;访问一飞开源：https://code.exmay.com/&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Thu, 09 Jul 2026 22:10:52 +0800</pubDate></item><item><title>TypeScript 7.0 发布：用 Go 重写的原生编译器，快 10 倍</title><link>https://www.codepub.top/post/619.html</link><description>&lt;p style=&quot;margin: 0.7em 0;&quot; class=&quot;js_darkmode__text__1&quot;&gt;TypeScript 7.0 正式发布了，这是一个用 Go 重写的原生版本。官方给出的数字是：完整构建普遍快 8 到 12 倍。这不是又一个加几个类型特性的小版本，而是把整个工具链从 TypeScript 自举实现换成原生编译代码的一次大改造，团队为此投入了一年多。&lt;/p&gt;&lt;p style=&quot;margin: 0.7em 0;&quot; class=&quot;js_darkmode__text__2&quot;&gt;如果你在大型代码库上被 &lt;code style=&quot;padding: 0.15em 0.38em;border-radius: 4px;background: #eef2f7;color: #c0392b;font-family: &amp;quot;SFMono-Regular&amp;quot;, Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, monospace;font-size: 0.89em;word-break: break-all;&quot; class=&quot;js_darkmode__1 js_darkmode__text__3&quot;&gt;tsc&lt;/code&gt; 或编辑器的卡顿折磨过，这个版本值得认真看一下。这篇讲清楚它到底快在哪、怎么装、和现有 6.0 怎么并存、有哪些会咬人的默认变更，以及哪些场景现在还不能用。&lt;/p&gt;&lt;h2 style=&quot;margin: 1.3em 0 0.65em;font-size: 22px;line-height: 1.35;font-weight: 700;color: #1a202c;border-bottom: 2px solid #e2e8f0;padding-bottom: 0.35em;&quot; class=&quot;js_darkmode__2 js_darkmode__text__4&quot;&gt;快是怎么来的&lt;/h2&gt;&lt;p style=&quot;margin: 0.7em 0;&quot; class=&quot;js_darkmode__text__5&quot;&gt;去年 TypeScript 团队公布过原生移植计划：用 Go 重写一个能吃满现代硬件的原生编译器。移植做得尽量忠实——在保持原代码库结构和逻辑的前提下写新代码，好让两个编译器结果一致、行为兼容。区别在于新代码库带来了原生代码速度、共享内存多线程，以及一批新优化，在完整构建上通常能拿到 8-12 倍的提速。&lt;/p&gt;&lt;p style=&quot;margin: 0.7em 0;&quot; class=&quot;js_darkmode__text__6&quot;&gt;安装方式和往常一样，通过 npm：&lt;/p&gt;&lt;pre style=&quot;margin: 1.4em 0;padding: 1.2em 1.5em;border-radius: 12px;overflow-x: auto;-webkit-overflow-scrolling: touch;background: #111827;color: #f3f4f6;font-size: 13.5px;line-height: 1.65;white-space: pre;word-break: normal;word-wrap: normal;overflow-wrap: normal;tab-size: 4;-moz-tab-size: 4;&quot; class=&quot;js_darkmode__3 js_darkmode__text__7&quot;&gt;npm&amp;nbsp;install&amp;nbsp;-D&amp;nbsp;typescript&lt;/pre&gt;&lt;p style=&quot;margin: 0.7em 0;&quot; class=&quot;js_darkmode__text__9&quot;&gt;这会给你工作区里新的 &lt;code style=&quot;padding: 0.15em 0.38em;border-radius: 4px;background: #eef2f7;color: #c0392b;font-family: &amp;quot;SFMono-Regular&amp;quot;, Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, monospace;font-size: 0.89em;word-break: break-all;&quot; class=&quot;js_darkmode__4 js_darkmode__text__10&quot;&gt;tsc&lt;/code&gt; 可执行文件（用 &lt;code style=&quot;padding: 0.15em 0.38em;border-radius: 4px;background: #eef2f7;color: #c0392b;font-family: &amp;quot;SFMono-Regular&amp;quot;, Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, monospace;font-size: 0.89em;word-break: break-all;&quot; class=&quot;js_darkmode__5 js_darkmode__text__11&quot;&gt;npx tsc&lt;/code&gt; 运行）。编辑器支持也一起跟上了，新基础建立在语言服务器协议（LSP）之上，VS Code、Visual Studio、WebStorm 等现代编辑器都能用。VS Code 有一个专门的 TypeScript 7 扩展现在就能装，Visual Studio 会根据工作区自动启用。&lt;/p&gt;&lt;h2 style=&quot;margin: 1.3em 0 0.65em;font-size: 22px;line-height: 1.35;font-weight: 700;color: #1a202c;border-bottom: 2px solid #e2e8f0;padding-bottom: 0.35em;&quot; class=&quot;js_darkmode__6 js_darkmode__text__12&quot;&gt;快了之后实际是什么体验&lt;/h2&gt;&lt;p style=&quot;margin: 0.7em 0;&quot; class=&quot;js_darkmode__text__13&quot;&gt;纸面上快听着好，落到日常是什么感觉？想想 TypeScript 在开发每个环节里出现的地方：打开编辑器、打开一个 TS 文件、跨项目跑一次 find-all-references；开始改代码时期待自动补全弹出、改错了实时看到红波浪线；准备构建时跑 &lt;code style=&quot;padding: 0.15em 0.38em;border-radius: 4px;background: #eef2f7;color: #c0392b;font-family: &amp;quot;SFMono-Regular&amp;quot;, Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, monospace;font-size: 0.89em;word-break: break-all;&quot; class=&quot;js_darkmode__7 js_darkmode__text__14&quot;&gt;tsc&lt;/code&gt; 看有没有报错，再运行生成的代码。&lt;/p&gt;&lt;p style=&quot;margin: 0.7em 0;&quot; class=&quot;js_darkmode__text__15&quot;&gt;TypeScript 变快意味着上面每一步都被理顺。等编辑器加载完整个项目会感觉近乎瞬时；find-all-references、自动补全、诊断的延迟只剩过去的零头；跑 &lt;code style=&quot;padding: 0.15em 0.38em;border-radius: 4px;background: #eef2f7;color: #c0392b;font-family: &amp;quot;SFMono-Regular&amp;quot;, Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, monospace;font-size: 0.89em;word-break: break-all;&quot; class=&quot;js_darkmode__8 js_darkmode__text__16&quot;&gt;tsc&lt;/code&gt;（尤其是 &lt;code style=&quot;padding: 0.15em 0.38em;border-radius: 4px;background: #eef2f7;color: #c0392b;font-family: &amp;quot;SFMono-Regular&amp;quot;, Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, monospace;font-size: 0.89em;word-break: break-all;&quot; class=&quot;js_darkmode__9 js_darkmode__text__17&quot;&gt;--watch&lt;/code&gt; 模式）时反馈循环收得更紧，迭代比以前快得多。&lt;/p&gt;&lt;p style=&quot;margin: 0.7em 0;&quot; class=&quot;js_darkmode__text__18&quot;&gt;在真实项目上能直接看到这个差距。下面是几个较大的开源代码库在 TypeScript 6 和 7 上的构建时间：&lt;/p&gt;&lt;table class=&quot;js_darkmode__text__19&quot; width=&quot;100&quot;&gt;&lt;thead class=&quot;js_darkmode__text__20&quot;&gt;&lt;tr class=&quot;js_darkmode__text__21 firstRow&quot;&gt;&lt;th style=&quot;padding: 0.75em;border: 1px solid #d9e0ea;background: #edf2fb;text-align: left;font-weight: 700;&quot; class=&quot;js_darkmode__10 js_darkmode__text__22&quot;&gt;代码库&lt;/th&gt;&lt;th style=&quot;padding: 0.75em;border: 1px solid #d9e0ea;background: #edf2fb;text-align: left;font-weight: 700;&quot; class=&quot;js_darkmode__11 js_darkmode__text__23&quot;&gt;TypeScript 6&lt;/th&gt;&lt;th style=&quot;padding: 0.75em;border: 1px solid #d9e0ea;background: #edf2fb;text-align: left;font-weight: 700;&quot; class=&quot;js_darkmode__12 js_darkmode__text__24&quot;&gt;TypeScript 7&lt;/th&gt;&lt;th style=&quot;padding: 0.75em;border: 1px solid #d9e0ea;background: #edf2fb;text-align: left;font-weight: 700;&quot; class=&quot;js_darkmode__13 js_darkmode__text__25&quot;&gt;提速&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody class=&quot;js_darkmode__text__26&quot;&gt;&lt;tr class=&quot;js_darkmode__text__27&quot;&gt;&lt;td style=&quot;padding: 0.75em;border: 1px solid #d9e0ea;text-align: left;vertical-align: top;&quot; class=&quot;js_darkmode__14 js_darkmode__text__28&quot;&gt;vscode&lt;/td&gt;&lt;td style=&quot;padding: 0.75em;border: 1px solid #d9e0ea;text-align: left;vertical-align: top;&quot; class=&quot;js_darkmode__15 js_darkmode__text__29&quot;&gt;125.7s&lt;/td&gt;&lt;td style=&quot;padding: 0.75em;border: 1px solid #d9e0ea;text-align: left;vertical-align: top;&quot; class=&quot;js_darkmode__16 js_darkmode__text__30&quot;&gt;10.6s&lt;/td&gt;&lt;td style=&quot;padding: 0.75em;border: 1px solid #d9e0ea;text-align: left;vertical-align: top;&quot; class=&quot;js_darkmode__17 js_darkmode__text__31&quot;&gt;11.9x&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;js_darkmode__text__32&quot;&gt;&lt;td style=&quot;padding: 0.75em;border: 1px solid #d9e0ea;text-align: left;vertical-align: top;&quot; class=&quot;js_darkmode__18 js_darkmode__text__33&quot;&gt;sentry&lt;/td&gt;&lt;td style=&quot;padding: 0.75em;border: 1px solid #d9e0ea;text-align: left;vertical-align: top;&quot; class=&quot;js_darkmode__19 js_darkmode__text__34&quot;&gt;139.8s&lt;/td&gt;&lt;td style=&quot;padding: 0.75em;border: 1px solid #d9e0ea;text-align: left;vertical-align: top;&quot; class=&quot;js_darkmode__20 js_darkmode__text__35&quot;&gt;15.7s&lt;/td&gt;&lt;td style=&quot;padding: 0.75em;border: 1px solid #d9e0ea;text-align: left;vertical-align: top;&quot; class=&quot;js_darkmode__21 js_darkmode__text__36&quot;&gt;8.9x&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;js_darkmode__text__37&quot;&gt;&lt;td style=&quot;padding: 0.75em;border: 1px solid #d9e0ea;text-align: left;vertical-align: top;&quot; class=&quot;js_darkmode__22 js_darkmode__text__38&quot;&gt;bluesky&lt;/td&gt;&lt;td style=&quot;padding: 0.75em;border: 1px solid #d9e0ea;text-align: left;vertical-align: top;&quot; class=&quot;js_darkmode__23 js_darkmode__text__39&quot;&gt;24.3s&lt;/td&gt;&lt;td style=&quot;padding: 0.75em;border: 1px solid #d9e0ea;text-align: left;vertical-align: top;&quot; class=&quot;js_darkmode__24 js_darkmode__text__40&quot;&gt;2.8s&lt;/td&gt;&lt;td style=&quot;padding: 0.75em;border: 1px solid #d9e0ea;text-align: left;vertical-align: top;&quot; class=&quot;js_darkmode__25 js_darkmode__text__41&quot;&gt;8.7x&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;js_darkmode__text__42&quot;&gt;&lt;td style=&quot;padding: 0.75em;border: 1px solid #d9e0ea;text-align: left;vertical-align: top;&quot; class=&quot;js_darkmode__26 js_darkmode__text__43&quot;&gt;playwright&lt;/td&gt;&lt;td style=&quot;padding: 0.75em;border: 1px solid #d9e0ea;text-align: left;vertical-align: top;&quot; class=&quot;js_darkmode__27 js_darkmode__text__44&quot;&gt;12.8s&lt;/td&gt;&lt;td style=&quot;padding: 0.75em;border: 1px solid #d9e0ea;text-align: left;vertical-align: top;&quot; class=&quot;js_darkmode__28 js_darkmode__text__45&quot;&gt;1.47s&lt;/td&gt;&lt;td style=&quot;padding: 0.75em;border: 1px solid #d9e0ea;text-align: left;vertical-align: top;&quot; class=&quot;js_darkmode__29 js_darkmode__text__46&quot;&gt;8.7x&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;js_darkmode__text__47&quot;&gt;&lt;td style=&quot;padding: 0.75em;border: 1px solid #d9e0ea;text-align: left;vertical-align: top;&quot; class=&quot;js_darkmode__30 js_darkmode__text__48&quot;&gt;tldraw&lt;/td&gt;&lt;td style=&quot;padding: 0.75em;border: 1px solid #d9e0ea;text-align: left;vertical-align: top;&quot; class=&quot;js_darkmode__31 js_darkmode__text__49&quot;&gt;11.2s&lt;/td&gt;&lt;td style=&quot;padding: 0.75em;border: 1px solid #d9e0ea;text-align: left;vertical-align: top;&quot; class=&quot;js_darkmode__32 js_darkmode__text__50&quot;&gt;1.46s&lt;/td&gt;&lt;td style=&quot;padding: 0.75em;border: 1px solid #d9e0ea;text-align: left;vertical-align: top;&quot; class=&quot;js_darkmode__33 js_darkmode__text__51&quot;&gt;7.7x&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p style=&quot;margin: 0.7em 0;&quot; class=&quot;js_darkmode__text__52&quot;&gt;内存占用同样更省，同一批项目在整个构建过程里的聚合内存下降了 6% 到 26%：&lt;/p&gt;&lt;table class=&quot;js_darkmode__text__53&quot; width=&quot;100&quot;&gt;&lt;thead class=&quot;js_darkmode__text__54&quot;&gt;&lt;tr class=&quot;js_darkmode__text__55 firstRow&quot;&gt;&lt;th style=&quot;padding: 0.75em;border: 1px solid #d9e0ea;background: #edf2fb;text-align: left;font-weight: 700;&quot; class=&quot;js_darkmode__34 js_darkmode__text__56&quot;&gt;代码库&lt;/th&gt;&lt;th style=&quot;padding: 0.75em;border: 1px solid #d9e0ea;background: #edf2fb;text-align: left;font-weight: 700;&quot; class=&quot;js_darkmode__35 js_darkmode__text__57&quot;&gt;TypeScript 6&lt;/th&gt;&lt;th style=&quot;padding: 0.75em;border: 1px solid #d9e0ea;background: #edf2fb;text-align: left;font-weight: 700;&quot; class=&quot;js_darkmode__36 js_darkmode__text__58&quot;&gt;TypeScript 7&lt;/th&gt;&lt;th style=&quot;padding: 0.75em;border: 1px solid #d9e0ea;background: #edf2fb;text-align: left;font-weight: 700;&quot; class=&quot;js_darkmode__37 js_darkmode__text__59&quot;&gt;内存变化&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody class=&quot;js_darkmode__text__60&quot;&gt;&lt;tr class=&quot;js_darkmode__text__61&quot;&gt;&lt;td style=&quot;padding: 0.75em;border: 1px solid #d9e0ea;text-align: left;vertical-align: top;&quot; class=&quot;js_darkmode__38 js_darkmode__text__62&quot;&gt;vscode&lt;/td&gt;&lt;td style=&quot;padding: 0.75em;border: 1px solid #d9e0ea;text-align: left;vertical-align: top;&quot; class=&quot;js_darkmode__39 js_darkmode__text__63&quot;&gt;5.2GB&lt;/td&gt;&lt;td style=&quot;padding: 0.75em;border: 1px solid #d9e0ea;text-align: left;vertical-align: top;&quot; class=&quot;js_darkmode__40 js_darkmode__text__64&quot;&gt;4.2GB&lt;/td&gt;&lt;td style=&quot;padding: 0.75em;border: 1px solid #d9e0ea;text-align: left;vertical-align: top;&quot; class=&quot;js_darkmode__41 js_darkmode__text__65&quot;&gt;-18%&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;js_darkmode__text__66&quot;&gt;&lt;td style=&quot;padding: 0.75em;border: 1px solid #d9e0ea;text-align: left;vertical-align: top;&quot; class=&quot;js_darkmode__42 js_darkmode__text__67&quot;&gt;sentry&lt;/td&gt;&lt;td style=&quot;padding: 0.75em;border: 1px solid #d9e0ea;text-align: left;vertical-align: top;&quot; class=&quot;js_darkmode__43 js_darkmode__text__68&quot;&gt;4.9GB&lt;/td&gt;&lt;td style=&quot;padding: 0.75em;border: 1px solid #d9e0ea;text-align: left;vertical-align: top;&quot; class=&quot;js_darkmode__44 js_darkmode__text__69&quot;&gt;4.6GB&lt;/td&gt;&lt;td style=&quot;padding: 0.75em;border: 1px solid #d9e0ea;text-align: left;vertical-align: top;&quot; class=&quot;js_darkmode__45 js_darkmode__text__70&quot;&gt;-6%&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;js_darkmode__text__71&quot;&gt;&lt;td style=&quot;padding: 0.75em;border: 1px solid #d9e0ea;text-align: left;vertical-align: top;&quot; class=&quot;js_darkmode__46 js_darkmode__text__72&quot;&gt;bluesky&lt;/td&gt;&lt;td style=&quot;padding: 0.75em;border: 1px solid #d9e0ea;text-align: left;vertical-align: top;&quot; class=&quot;js_darkmode__47 js_darkmode__text__73&quot;&gt;1.8GB&lt;/td&gt;&lt;td style=&quot;padding: 0.75em;border: 1px solid #d9e0ea;text-align: left;vertical-align: top;&quot; class=&quot;js_darkmode__48 js_darkmode__text__74&quot;&gt;1.3GB&lt;/td&gt;&lt;td style=&quot;padding: 0.75em;border: 1px solid #d9e0ea;text-align: left;vertical-align: top;&quot; class=&quot;js_darkmode__49 js_darkmode__text__75&quot;&gt;-26%&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;js_darkmode__text__76&quot;&gt;&lt;td style=&quot;padding: 0.75em;border: 1px solid #d9e0ea;text-align: left;vertical-align: top;&quot; class=&quot;js_darkmode__50 js_darkmode__text__77&quot;&gt;playwright&lt;/td&gt;&lt;td style=&quot;padding: 0.75em;border: 1px solid #d9e0ea;text-align: left;vertical-align: top;&quot; class=&quot;js_darkmode__51 js_darkmode__text__78&quot;&gt;1.0GB&lt;/td&gt;&lt;td style=&quot;padding: 0.75em;border: 1px solid #d9e0ea;text-align: left;vertical-align: top;&quot; class=&quot;js_darkmode__52 js_darkmode__text__79&quot;&gt;0.9GB&lt;/td&gt;&lt;td style=&quot;padding: 0.75em;border: 1px solid #d9e0ea;text-align: left;vertical-align: top;&quot; class=&quot;js_darkmode__53 js_darkmode__text__80&quot;&gt;-11%&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;js_darkmode__text__81&quot;&gt;&lt;td style=&quot;padding: 0.75em;border: 1px solid #d9e0ea;text-align: left;vertical-align: top;&quot; class=&quot;js_darkmode__54 js_darkmode__text__82&quot;&gt;tldraw&lt;/td&gt;&lt;td style=&quot;padding: 0.75em;border: 1px solid #d9e0ea;text-align: left;vertical-align: top;&quot; class=&quot;js_darkmode__55 js_darkmode__text__83&quot;&gt;0.6GB&lt;/td&gt;&lt;td style=&quot;padding: 0.75em;border: 1px solid #d9e0ea;text-align: left;vertical-align: top;&quot; class=&quot;js_darkmode__56 js_darkmode__text__84&quot;&gt;0.5GB&lt;/td&gt;&lt;td style=&quot;padding: 0.75em;border: 1px solid #d9e0ea;text-align: left;vertical-align: top;&quot; class=&quot;js_darkmode__57 js_darkmode__text__85&quot;&gt;-15%&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p style=&quot;margin: 0.7em 0;&quot; class=&quot;js_darkmode__text__86&quot;&gt;编辑器里的体验不止完整构建这一项。同一台机器上，在 VS Code 代码库里打开一个有错的文件，从打开编辑器到看到第一个错误，以前要约 17.5 秒，TypeScript 7 下不到 1.3 秒，快了 13 倍以上。&lt;/p&gt;&lt;h2 style=&quot;margin: 1.3em 0 0.65em;font-size: 22px;line-height: 1.35;font-weight: 700;color: #1a202c;border-bottom: 2px solid #e2e8f0;padding-bottom: 0.35em;&quot; class=&quot;js_darkmode__58 js_darkmode__text__87&quot;&gt;已经在生产里验证过&lt;/h2&gt;&lt;p style=&quot;margin: 0.7em 0;&quot; class=&quot;js_darkmode__text__88&quot;&gt;TypeScript 项目十多年积累了数万个测试，每次 &lt;code style=&quot;padding: 0.15em 0.38em;border-radius: 4px;background: #eef2f7;color: #c0392b;font-family: &amp;quot;SFMono-Regular&amp;quot;, Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, monospace;font-size: 0.89em;word-break: break-all;&quot; class=&quot;js_darkmode__59 js_darkmode__text__89&quot;&gt;main&lt;/code&gt; 分支提交都跑。但 7.0 不是普通版本，团队在测试套件之外还动用了很多资源确认它能上生产。&lt;/p&gt;&lt;p style=&quot;margin: 0.7em 0;&quot; class=&quot;js_darkmode__text__90&quot;&gt;过去一年，团队和许多内部及外部大团队一起在真实代码库上测 TypeScript 7，反馈压倒性地正面。微软的 Loop、Office、PowerBI、Teams、Xbox 等团队参与了超大代码库的验证；Bloomberg、Canva、Figma、Google、Linear、Miro、Notion、Sentry、Slack、Vercel 等公司也在自己代码库上测过并给了反馈。&lt;/p&gt;&lt;p style=&quot;margin: 0.7em 0;&quot; class=&quot;js_darkmode__text__91&quot;&gt;数据上也能看出质量变化：TypeScript 7.0 的新语言服务器把失败的语言服务命令减少了 80% 以上，服务器崩溃减少了 60% 以上（相较 6.0）。一些规模化团队的反馈很直接：&lt;/p&gt;&lt;p style=&quot;margin: 0.35em 0;&quot; class=&quot;js_darkmode__text__92&quot;&gt;• Slack 工程师说 TypeScript 7 砍掉了他们 40% 的合并队列时间，CI 里的类型检查从约 7.5 分钟降到 1.25 分钟。本地编辑器体验以前因为语言服务器加载慢几乎&amp;quot;不可用&amp;quot;，现在几秒就能加载同一个代码库，本地类型检查重新变得可行。&lt;/p&gt;&lt;p style=&quot;margin: 0.35em 0;&quot; class=&quot;js_darkmode__text__93&quot;&gt;• Vanta 的构建在他们最大的项目之一上提速最高 9 倍。&lt;/p&gt;&lt;p style=&quot;margin: 0.35em 0;&quot; class=&quot;js_darkmode__text__94&quot;&gt;• 微软 News Services 团队说采用 TypeScript 7 每月省下 400 小时的 CI 构建等待。&lt;/p&gt;&lt;p style=&quot;margin: 0.35em 0;&quot; class=&quot;js_darkmode__text__95&quot;&gt;• Canva 说语言服务从约 58 秒看到第一个错误降到约 4.8 秒。&lt;/p&gt;&lt;h2 style=&quot;margin: 1.3em 0 0.65em;font-size: 22px;line-height: 1.35;font-weight: 700;color: #1a202c;border-bottom: 2px solid #e2e8f0;padding-bottom: 0.35em;&quot; class=&quot;js_darkmode__60 js_darkmode__text__96&quot;&gt;和 TypeScript 6.0 并存运行&lt;/h2&gt;&lt;p style=&quot;margin: 0.7em 0;&quot; class=&quot;js_darkmode__text__97&quot;&gt;TypeScript 7.0 目前&lt;strong style=&quot;font-weight: 700;color: #18202a;&quot; class=&quot;js_darkmode__61 js_darkmode__text__98&quot;&gt;不带 API&lt;/strong&gt;。7.1 预计会带一个新的（且不同的）API，但在那之前，团队优先保证 7.0 能和 6.0 并存，供那些仍需要编程式访问编译器的工具使用（比如 typescript-eslint）。&lt;/p&gt;&lt;p style=&quot;margin: 0.7em 0;&quot; class=&quot;js_darkmode__text__99&quot;&gt;为此他们发布了兼容包 &lt;code style=&quot;padding: 0.15em 0.38em;border-radius: 4px;background: #eef2f7;color: #c0392b;font-family: &amp;quot;SFMono-Regular&amp;quot;, Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, monospace;font-size: 0.89em;word-break: break-all;&quot; class=&quot;js_darkmode__62 js_darkmode__text__100&quot;&gt;@typescript/typescript6&lt;/code&gt;，它提供一个叫 &lt;code style=&quot;padding: 0.15em 0.38em;border-radius: 4px;background: #eef2f7;color: #c0392b;font-family: &amp;quot;SFMono-Regular&amp;quot;, Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, monospace;font-size: 0.89em;word-break: break-all;&quot; class=&quot;js_darkmode__63 js_darkmode__text__101&quot;&gt;tsc6&lt;/code&gt; 的可执行文件，让你能在没有命名冲突的情况下并存安装。这个包还重新导出了 6.0 的 API，于是你可以让 &lt;code style=&quot;padding: 0.15em 0.38em;border-radius: 4px;background: #eef2f7;color: #c0392b;font-family: &amp;quot;SFMono-Regular&amp;quot;, Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, monospace;font-size: 0.89em;word-break: break-all;&quot; class=&quot;js_darkmode__64 js_darkmode__text__102&quot;&gt;tsc&lt;/code&gt; 用 7.0，其他工具继续依赖 6.0。&lt;/p&gt;&lt;p style=&quot;margin: 0.7em 0;&quot; class=&quot;js_darkmode__text__103&quot;&gt;因为像 typescript-eslint 这类工具期望直接从 &lt;code style=&quot;padding: 0.15em 0.38em;border-radius: 4px;background: #eef2f7;color: #c0392b;font-family: &amp;quot;SFMono-Regular&amp;quot;, Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, monospace;font-size: 0.89em;word-break: break-all;&quot; class=&quot;js_darkmode__65 js_darkmode__text__104&quot;&gt;typescript&lt;/code&gt; 导入，推荐用 npm 别名实现。可以跑：&lt;/p&gt;&lt;pre style=&quot;margin: 1.4em 0;padding: 1.2em 1.5em;border-radius: 12px;overflow-x: auto;-webkit-overflow-scrolling: touch;background: #111827;color: #f3f4f6;font-size: 13.5px;line-height: 1.65;white-space: pre;word-break: normal;word-wrap: normal;overflow-wrap: normal;tab-size: 4;-moz-tab-size: 4;&quot; class=&quot;js_darkmode__66 js_darkmode__text__105&quot;&gt;npm&amp;nbsp;install&amp;nbsp;-D&amp;nbsp;typescript@npm:@typescript/typescript6&lt;/pre&gt;&lt;p style=&quot;margin: 0.7em 0;&quot; class=&quot;js_darkmode__text__107&quot;&gt;或者改 &lt;code style=&quot;padding: 0.15em 0.38em;border-radius: 4px;background: #eef2f7;color: #c0392b;font-family: &amp;quot;SFMono-Regular&amp;quot;, Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, monospace;font-size: 0.89em;word-break: break-all;&quot; class=&quot;js_darkmode__67 js_darkmode__text__108&quot;&gt;package.json&lt;/code&gt;：&lt;/p&gt;&lt;pre style=&quot;margin: 1.4em 0;padding: 1.2em 1.5em;border-radius: 12px;overflow-x: auto;-webkit-overflow-scrolling: touch;background: #111827;color: #f3f4f6;font-size: 13.5px;line-height: 1.65;white-space: pre;word-break: normal;word-wrap: normal;overflow-wrap: normal;tab-size: 4;-moz-tab-size: 4;&quot; class=&quot;js_darkmode__68 js_darkmode__text__109&quot;&gt;{
&amp;nbsp;&amp;nbsp;&amp;quot;devDependencies&amp;quot;:&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;typescript&amp;quot;:&amp;nbsp;&amp;quot;npm:@typescript/typescript6@^6.0.2&amp;quot;,
&amp;nbsp;&amp;nbsp;}
}&lt;/pre&gt;&lt;p style=&quot;margin: 0.7em 0;&quot; class=&quot;js_darkmode__text__111&quot;&gt;注意这样做只会给你 &lt;code style=&quot;padding: 0.15em 0.38em;border-radius: 4px;background: #eef2f7;color: #c0392b;font-family: &amp;quot;SFMono-Regular&amp;quot;, Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, monospace;font-size: 0.89em;word-break: break-all;&quot; class=&quot;js_darkmode__69 js_darkmode__text__112&quot;&gt;tsc6&lt;/code&gt; 可执行文件。想同时拿到 7.0 的 &lt;code style=&quot;padding: 0.15em 0.38em;border-radius: 4px;background: #eef2f7;color: #c0392b;font-family: &amp;quot;SFMono-Regular&amp;quot;, Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, monospace;font-size: 0.89em;word-break: break-all;&quot; class=&quot;js_darkmode__70 js_darkmode__text__113&quot;&gt;tsc&lt;/code&gt;，再加一个 TypeScript 7 的别名，&lt;code style=&quot;padding: 0.15em 0.38em;border-radius: 4px;background: #eef2f7;color: #c0392b;font-family: &amp;quot;SFMono-Regular&amp;quot;, Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, monospace;font-size: 0.89em;word-break: break-all;&quot; class=&quot;js_darkmode__71 js_darkmode__text__114&quot;&gt;npx tsc&lt;/code&gt; 就会走 7.0：&lt;/p&gt;&lt;pre style=&quot;margin: 1.4em 0;padding: 1.2em 1.5em;border-radius: 12px;overflow-x: auto;-webkit-overflow-scrolling: touch;background: #111827;color: #f3f4f6;font-size: 13.5px;line-height: 1.65;white-space: pre;word-break: normal;word-wrap: normal;overflow-wrap: normal;tab-size: 4;-moz-tab-size: 4;&quot; class=&quot;js_darkmode__72 js_darkmode__text__115&quot;&gt;{
&amp;nbsp;&amp;nbsp;&amp;quot;devDependencies&amp;quot;:&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;@typescript/native&amp;quot;:&amp;nbsp;&amp;quot;npm:typescript@^7.0.2&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;typescript&amp;quot;:&amp;nbsp;&amp;quot;npm:@typescript/typescript6@^6.0.2&amp;quot;
&amp;nbsp;&amp;nbsp;}
}&lt;/pre&gt;&lt;p style=&quot;margin: 0.7em 0;&quot; class=&quot;js_darkmode__text__117&quot;&gt;另外，此前大多数人是通过 &lt;code style=&quot;padding: 0.15em 0.38em;border-radius: 4px;background: #eef2f7;color: #c0392b;font-family: &amp;quot;SFMono-Regular&amp;quot;, Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, monospace;font-size: 0.89em;word-break: break-all;&quot; class=&quot;js_darkmode__73 js_darkmode__text__118&quot;&gt;@typescript/native-preview&lt;/code&gt; 装 TypeScript 7 的（每周下载超 850 万次）。之后每日构建会回归标准 &lt;code style=&quot;padding: 0.15em 0.38em;border-radius: 4px;background: #eef2f7;color: #c0392b;font-family: &amp;quot;SFMono-Regular&amp;quot;, Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, monospace;font-size: 0.89em;word-break: break-all;&quot; class=&quot;js_darkmode__74 js_darkmode__text__119&quot;&gt;typescript&lt;/code&gt; 包的 &lt;code style=&quot;padding: 0.15em 0.38em;border-radius: 4px;background: #eef2f7;color: #c0392b;font-family: &amp;quot;SFMono-Regular&amp;quot;, Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, monospace;font-size: 0.89em;word-break: break-all;&quot; class=&quot;js_darkmode__75 js_darkmode__text__120&quot;&gt;next&lt;/code&gt; 标签，用 &lt;code style=&quot;padding: 0.15em 0.38em;border-radius: 4px;background: #eef2f7;color: #c0392b;font-family: &amp;quot;SFMono-Regular&amp;quot;, Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, monospace;font-size: 0.89em;word-break: break-all;&quot; class=&quot;js_darkmode__76 js_darkmode__text__121&quot;&gt;npm install -D typescript@next&lt;/code&gt; 即可。&lt;/p&gt;&lt;h2 style=&quot;margin: 1.3em 0 0.65em;font-size: 22px;line-height: 1.35;font-weight: 700;color: #1a202c;border-bottom: 2px solid #e2e8f0;padding-bottom: 0.35em;&quot; class=&quot;js_darkmode__77 js_darkmode__text__122&quot;&gt;并行控制：checkers 和 builders&lt;/h2&gt;&lt;p style=&quot;margin: 0.7em 0;&quot; class=&quot;js_darkmode__text__123&quot;&gt;TypeScript 7.0 现在把很多步骤并行执行，包括解析、类型检查和输出。解析和输出这类步骤在文件间基本独立，所以并行能随代码库变大自动扩展，开销很小。但不是每一步都好并行。&lt;/p&gt;&lt;p style=&quot;margin: 0.7em 0;&quot; class=&quot;js_darkmode__text__124&quot;&gt;TypeScript 7 引入了实验性的 &lt;code style=&quot;padding: 0.15em 0.38em;border-radius: 4px;background: #eef2f7;color: #c0392b;font-family: &amp;quot;SFMono-Regular&amp;quot;, Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, monospace;font-size: 0.89em;word-break: break-all;&quot; class=&quot;js_darkmode__78 js_darkmode__text__125&quot;&gt;--checkers&lt;/code&gt; 和 &lt;code style=&quot;padding: 0.15em 0.38em;border-radius: 4px;background: #eef2f7;color: #c0392b;font-family: &amp;quot;SFMono-Regular&amp;quot;, Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, monospace;font-size: 0.89em;word-break: break-all;&quot; class=&quot;js_darkmode__79 js_darkmode__text__126&quot;&gt;--builders&lt;/code&gt; 两个标志，用来微调类型检查、项目引用构建这类不那么好并行的步骤。还有一个 &lt;code style=&quot;padding: 0.15em 0.38em;border-radius: 4px;background: #eef2f7;color: #c0392b;font-family: &amp;quot;SFMono-Regular&amp;quot;, Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, monospace;font-size: 0.89em;word-break: break-all;&quot; class=&quot;js_darkmode__80 js_darkmode__text__127&quot;&gt;--singleThreaded&lt;/code&gt; 标志可以完全关闭并行，用于调试或资源受限的环境。&lt;/p&gt;&lt;h3 style=&quot;margin: 1.2em 0 0.6em;font-size: 18px;line-height: 1.4;font-weight: 700;color: #2563eb;&quot; class=&quot;js_darkmode__text__128&quot;&gt;类型检查并行&lt;/h3&gt;&lt;p style=&quot;margin: 0.7em 0;&quot; class=&quot;js_darkmode__text__129&quot;&gt;类型检查在文件间的依赖更复杂：多数文件依赖同一批来自依赖项和全局作用域的类型信息，完全独立地跑检查器会浪费计算和内存。另一方面类型检查偶尔依赖程序内信息的相对顺序，所以从头检查必须每次以相同顺序检查相同文件，才能保证结果一致。&lt;/p&gt;&lt;p style=&quot;margin: 0.7em 0;&quot; class=&quot;js_darkmode__text__130&quot;&gt;为了兼顾并行和一致性，7.0 创建固定数量、各自持有一份世界视图的类型检查 worker。它们可能重复一些公共工作，但对同样的输入文件，永远以相同方式划分并产出相同结果。&lt;/p&gt;&lt;p style=&quot;margin: 0.7em 0;&quot; class=&quot;js_darkmode__text__131&quot;&gt;默认 4 个 worker，可用 &lt;code style=&quot;padding: 0.15em 0.38em;border-radius: 4px;background: #eef2f7;color: #c0392b;font-family: &amp;quot;SFMono-Regular&amp;quot;, Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, monospace;font-size: 0.89em;word-break: break-all;&quot; class=&quot;js_darkmode__81 js_darkmode__text__132&quot;&gt;--checkers&lt;/code&gt; 调。在核数更多的机器上加大这个数能进一步提速，但通常以更高内存为代价。前面表格用的是默认 &lt;code style=&quot;padding: 0.15em 0.38em;border-radius: 4px;background: #eef2f7;color: #c0392b;font-family: &amp;quot;SFMono-Regular&amp;quot;, Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, monospace;font-size: 0.89em;word-break: break-all;&quot; class=&quot;js_darkmode__82 js_darkmode__text__133&quot;&gt;--checkers 4&lt;/code&gt;；换成 &lt;code style=&quot;padding: 0.15em 0.38em;border-radius: 4px;background: #eef2f7;color: #c0392b;font-family: &amp;quot;SFMono-Regular&amp;quot;, Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, monospace;font-size: 0.89em;word-break: break-all;&quot; class=&quot;js_darkmode__83 js_darkmode__text__134&quot;&gt;--checkers 8&lt;/code&gt; 同一机器上：&lt;/p&gt;&lt;table class=&quot;js_darkmode__text__135&quot; width=&quot;100&quot;&gt;&lt;thead class=&quot;js_darkmode__text__136&quot;&gt;&lt;tr class=&quot;js_darkmode__text__137 firstRow&quot;&gt;&lt;th style=&quot;padding: 0.75em;border: 1px solid #d9e0ea;background: #edf2fb;text-align: left;font-weight: 700;&quot; class=&quot;js_darkmode__84 js_darkmode__text__138&quot;&gt;代码库&lt;/th&gt;&lt;th style=&quot;padding: 0.75em;border: 1px solid #d9e0ea;background: #edf2fb;text-align: left;font-weight: 700;&quot; class=&quot;js_darkmode__85 js_darkmode__text__139&quot;&gt;TypeScript 6&lt;/th&gt;&lt;th style=&quot;padding: 0.75em;border: 1px solid #d9e0ea;background: #edf2fb;text-align: left;font-weight: 700;&quot; class=&quot;js_darkmode__86 js_darkmode__text__140&quot;&gt;TypeScript 7 (&lt;code style=&quot;padding: 0.15em 0.38em;border-radius: 4px;background: #eef2f7;color: #c0392b;font-family: &amp;quot;SFMono-Regular&amp;quot;, Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, monospace;font-size: 0.89em;word-break: break-all;&quot; class=&quot;js_darkmode__87 js_darkmode__text__141&quot;&gt;--checkers 8&lt;/code&gt;)&lt;/th&gt;&lt;th style=&quot;padding: 0.75em;border: 1px solid #d9e0ea;background: #edf2fb;text-align: left;font-weight: 700;&quot; class=&quot;js_darkmode__88 js_darkmode__text__142&quot;&gt;提速&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody class=&quot;js_darkmode__text__143&quot;&gt;&lt;tr class=&quot;js_darkmode__text__144&quot;&gt;&lt;td style=&quot;padding: 0.75em;border: 1px solid #d9e0ea;text-align: left;vertical-align: top;&quot; class=&quot;js_darkmode__89 js_darkmode__text__145&quot;&gt;vscode&lt;/td&gt;&lt;td style=&quot;padding: 0.75em;border: 1px solid #d9e0ea;text-align: left;vertical-align: top;&quot; class=&quot;js_darkmode__90 js_darkmode__text__146&quot;&gt;125.7s&lt;/td&gt;&lt;td style=&quot;padding: 0.75em;border: 1px solid #d9e0ea;text-align: left;vertical-align: top;&quot; class=&quot;js_darkmode__91 js_darkmode__text__147&quot;&gt;7.51s&lt;/td&gt;&lt;td style=&quot;padding: 0.75em;border: 1px solid #d9e0ea;text-align: left;vertical-align: top;&quot; class=&quot;js_darkmode__92 js_darkmode__text__148&quot;&gt;16.7x&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;js_darkmode__text__149&quot;&gt;&lt;td style=&quot;padding: 0.75em;border: 1px solid #d9e0ea;text-align: left;vertical-align: top;&quot; class=&quot;js_darkmode__93 js_darkmode__text__150&quot;&gt;sentry&lt;/td&gt;&lt;td style=&quot;padding: 0.75em;border: 1px solid #d9e0ea;text-align: left;vertical-align: top;&quot; class=&quot;js_darkmode__94 js_darkmode__text__151&quot;&gt;139.8s&lt;/td&gt;&lt;td style=&quot;padding: 0.75em;border: 1px solid #d9e0ea;text-align: left;vertical-align: top;&quot; class=&quot;js_darkmode__95 js_darkmode__text__152&quot;&gt;12.08s&lt;/td&gt;&lt;td style=&quot;padding: 0.75em;border: 1px solid #d9e0ea;text-align: left;vertical-align: top;&quot; class=&quot;js_darkmode__96 js_darkmode__text__153&quot;&gt;11.6x&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;js_darkmode__text__154&quot;&gt;&lt;td style=&quot;padding: 0.75em;border: 1px solid #d9e0ea;text-align: left;vertical-align: top;&quot; class=&quot;js_darkmode__97 js_darkmode__text__155&quot;&gt;bluesky&lt;/td&gt;&lt;td style=&quot;padding: 0.75em;border: 1px solid #d9e0ea;text-align: left;vertical-align: top;&quot; class=&quot;js_darkmode__98 js_darkmode__text__156&quot;&gt;24.3s&lt;/td&gt;&lt;td style=&quot;padding: 0.75em;border: 1px solid #d9e0ea;text-align: left;vertical-align: top;&quot; class=&quot;js_darkmode__99 js_darkmode__text__157&quot;&gt;2.01s&lt;/td&gt;&lt;td style=&quot;padding: 0.75em;border: 1px solid #d9e0ea;text-align: left;vertical-align: top;&quot; class=&quot;js_darkmode__100 js_darkmode__text__158&quot;&gt;12.1x&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;js_darkmode__text__159&quot;&gt;&lt;td style=&quot;padding: 0.75em;border: 1px solid #d9e0ea;text-align: left;vertical-align: top;&quot; class=&quot;js_darkmode__101 js_darkmode__text__160&quot;&gt;playwright&lt;/td&gt;&lt;td style=&quot;padding: 0.75em;border: 1px solid #d9e0ea;text-align: left;vertical-align: top;&quot; class=&quot;js_darkmode__102 js_darkmode__text__161&quot;&gt;12.8s&lt;/td&gt;&lt;td style=&quot;padding: 0.75em;border: 1px solid #d9e0ea;text-align: left;vertical-align: top;&quot; class=&quot;js_darkmode__103 js_darkmode__text__162&quot;&gt;1.16s&lt;/td&gt;&lt;td style=&quot;padding: 0.75em;border: 1px solid #d9e0ea;text-align: left;vertical-align: top;&quot; class=&quot;js_darkmode__104 js_darkmode__text__163&quot;&gt;11x&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;js_darkmode__text__164&quot;&gt;&lt;td style=&quot;padding: 0.75em;border: 1px solid #d9e0ea;text-align: left;vertical-align: top;&quot; class=&quot;js_darkmode__105 js_darkmode__text__165&quot;&gt;tldraw&lt;/td&gt;&lt;td style=&quot;padding: 0.75em;border: 1px solid #d9e0ea;text-align: left;vertical-align: top;&quot; class=&quot;js_darkmode__106 js_darkmode__text__166&quot;&gt;11.2s&lt;/td&gt;&lt;td style=&quot;padding: 0.75em;border: 1px solid #d9e0ea;text-align: left;vertical-align: top;&quot; class=&quot;js_darkmode__107 js_darkmode__text__167&quot;&gt;1.06s&lt;/td&gt;&lt;td style=&quot;padding: 0.75em;border: 1px solid #d9e0ea;text-align: left;vertical-align: top;&quot; class=&quot;js_darkmode__108 js_darkmode__text__168&quot;&gt;10.6x&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p style=&quot;margin: 0.7em 0;&quot; class=&quot;js_darkmode__text__169&quot;&gt;反过来，在核少内存小的机器（比如 CI runner）上，你可能想调低以避免额外开销，最低可设 &lt;code style=&quot;padding: 0.15em 0.38em;border-radius: 4px;background: #eef2f7;color: #c0392b;font-family: &amp;quot;SFMono-Regular&amp;quot;, Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, monospace;font-size: 0.89em;word-break: break-all;&quot; class=&quot;js_darkmode__109 js_darkmode__text__170&quot;&gt;--checkers 1&lt;/code&gt;，等于把类型检查变单线程、消除重复工作。少数情况下改 checkers 数量会暴露顺序相关的结果差异，跨环境固定一个数值能保证大家结果一致。&lt;/p&gt;&lt;h3 style=&quot;margin: 1.2em 0 0.6em;font-size: 18px;line-height: 1.4;font-weight: 700;color: #2563eb;&quot; class=&quot;js_darkmode__text__171&quot;&gt;项目引用构建并行&lt;/h3&gt;&lt;p style=&quot;margin: 0.7em 0;&quot; class=&quot;js_darkmode__text__172&quot;&gt;7.0 不仅能在单个项目内并行，还能同时构建多个项目，用 &lt;code style=&quot;padding: 0.15em 0.38em;border-radius: 4px;background: #eef2f7;color: #c0392b;font-family: &amp;quot;SFMono-Regular&amp;quot;, Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, monospace;font-size: 0.89em;word-break: break-all;&quot; class=&quot;js_darkmode__110 js_darkmode__text__173&quot;&gt;--builders&lt;/code&gt; 标志控制 &lt;code style=&quot;padding: 0.15em 0.38em;border-radius: 4px;background: #eef2f7;color: #c0392b;font-family: &amp;quot;SFMono-Regular&amp;quot;, Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, monospace;font-size: 0.89em;word-break: break-all;&quot; class=&quot;js_darkmode__111 js_darkmode__text__174&quot;&gt;--build&lt;/code&gt; 下同时运行的并行项目引用构建器数量，对多项目 monorepo 特别有用。&lt;/p&gt;&lt;p style=&quot;margin: 0.7em 0;&quot; class=&quot;js_darkmode__text__175&quot;&gt;和 &lt;code style=&quot;padding: 0.15em 0.38em;border-radius: 4px;background: #eef2f7;color: #c0392b;font-family: &amp;quot;SFMono-Regular&amp;quot;, Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, monospace;font-size: 0.89em;word-break: break-all;&quot; class=&quot;js_darkmode__112 js_darkmode__text__176&quot;&gt;--checkers&lt;/code&gt; 一样，加大 builders 能提速但更耗内存，而且它和 &lt;code style=&quot;padding: 0.15em 0.38em;border-radius: 4px;background: #eef2f7;color: #c0392b;font-family: &amp;quot;SFMono-Regular&amp;quot;, Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, monospace;font-size: 0.89em;word-break: break-all;&quot; class=&quot;js_darkmode__113 js_darkmode__text__177&quot;&gt;--checkers&lt;/code&gt; 是乘积关系——&lt;code style=&quot;padding: 0.15em 0.38em;border-radius: 4px;background: #eef2f7;color: #c0392b;font-family: &amp;quot;SFMono-Regular&amp;quot;, Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, monospace;font-size: 0.89em;word-break: break-all;&quot; class=&quot;js_darkmode__114 js_darkmode__text__178&quot;&gt;--checkers 4 --builders 4&lt;/code&gt; 允许最多 16 个类型检查器同时跑，可能过头。不同于 checkers，改 builders 数量不会产生不同结果，但项目引用构建本质上受项目依赖图瓶颈限制。&lt;/p&gt;&lt;h3 style=&quot;margin: 1.2em 0 0.6em;font-size: 18px;line-height: 1.4;font-weight: 700;color: #2563eb;&quot; class=&quot;js_darkmode__text__179&quot;&gt;单线程模式&lt;/h3&gt;&lt;p style=&quot;margin: 0.7em 0;&quot; class=&quot;js_darkmode__text__180&quot;&gt;某些情况下强制整个编译器单线程会有用：调试、对比 6 和 7 的性能、外部编排并行构建，或在资源极受限的环境跑。&lt;code style=&quot;padding: 0.15em 0.38em;border-radius: 4px;background: #eef2f7;color: #c0392b;font-family: &amp;quot;SFMono-Regular&amp;quot;, Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, monospace;font-size: 0.89em;word-break: break-all;&quot; class=&quot;js_darkmode__115 js_darkmode__text__181&quot;&gt;--singleThreaded&lt;/code&gt; 标志不仅把类型检查 worker 限为 1，还确保解析和输出也在单线程里完成。&lt;/p&gt;&lt;h2 style=&quot;margin: 1.3em 0 0.65em;font-size: 22px;line-height: 1.35;font-weight: 700;color: #1a202c;border-bottom: 2px solid #e2e8f0;padding-bottom: 0.35em;&quot; class=&quot;js_darkmode__116 js_darkmode__text__182&quot;&gt;重建的 --watch 模式&lt;/h2&gt;&lt;p style=&quot;margin: 0.7em 0;&quot; class=&quot;js_darkmode__text__183&quot;&gt;TypeScript 7 带了一个彻底重建的 &lt;code style=&quot;padding: 0.15em 0.38em;border-radius: 4px;background: #eef2f7;color: #c0392b;font-family: &amp;quot;SFMono-Regular&amp;quot;, Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, monospace;font-size: 0.89em;word-break: break-all;&quot; class=&quot;js_darkmode__117 js_darkmode__text__184&quot;&gt;--watch&lt;/code&gt; 模式，底层基于 Parcel 打包器的文件监听器，提供高效稳定的跨平台文件监听。&lt;/p&gt;&lt;p style=&quot;margin: 0.7em 0;&quot; class=&quot;js_darkmode__text__185&quot;&gt;团队移植监听逻辑时遇到过几个坑：Go 标准库没有内置文件监听 API，试过的第三方库在稳定性、性能、跨平台或构建工具集成上各有问题。纯轮询方案能广泛跑起来但计算太贵，尤其是 &lt;code style=&quot;padding: 0.15em 0.38em;border-radius: 4px;background: #eef2f7;color: #c0392b;font-family: &amp;quot;SFMono-Regular&amp;quot;, Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, monospace;font-size: 0.89em;word-break: break-all;&quot; class=&quot;js_darkmode__118 js_darkmode__text__186&quot;&gt;node_modules&lt;/code&gt; 依赖多的大项目。而 Parcel 的监听器虽然好用，却是 C++ 写的、需要完整 C++ 工具链。他们最后把它移植成 Go（加了几个最小的汇编垫片），从直译逐步打磨成能通过移植测试套件的地道 Go 代码，跨平台的资源占用显著改善。&lt;/p&gt;&lt;h2 style=&quot;margin: 1.3em 0 0.65em;font-size: 22px;line-height: 1.35;font-weight: 700;color: #1a202c;border-bottom: 2px solid #e2e8f0;padding-bottom: 0.35em;&quot; class=&quot;js_darkmode__119 js_darkmode__text__187&quot;&gt;从 5.x 到 6.0 再到 7.0 的行为变更&lt;/h2&gt;&lt;p style=&quot;margin: 0.7em 0;&quot; class=&quot;js_darkmode__text__188&quot;&gt;TypeScript 7.0 在类型检查和命令行行为上兼容 6.0。基本上任何在 6.0 下（开着 &lt;code style=&quot;padding: 0.15em 0.38em;border-radius: 4px;background: #eef2f7;color: #c0392b;font-family: &amp;quot;SFMono-Regular&amp;quot;, Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, monospace;font-size: 0.89em;word-break: break-all;&quot; class=&quot;js_darkmode__120 js_darkmode__text__189&quot;&gt;stableTypeOrdering&lt;/code&gt;、没设 &lt;code style=&quot;padding: 0.15em 0.38em;border-radius: 4px;background: #eef2f7;color: #c0392b;font-family: &amp;quot;SFMono-Regular&amp;quot;, Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, monospace;font-size: 0.89em;word-break: break-all;&quot; class=&quot;js_darkmode__121 js_darkmode__text__190&quot;&gt;ignoreDeprecations&lt;/code&gt;）能干净编译的代码，在 7.0 下应该编译结果一致。&lt;/p&gt;&lt;p style=&quot;margin: 0.7em 0;&quot; class=&quot;js_darkmode__text__191&quot;&gt;但 7.0 采用了 6.0 的新默认值，并对 6.0 里废弃的标志和写法直接报硬错误。由于 6.0 还比较新，很多项目需要适配这些新行为。建议先采用 6.0 来平滑过渡。默认配置的显著变化有：&lt;/p&gt;&lt;p style=&quot;margin: 0.35em 0;&quot; class=&quot;js_darkmode__text__192&quot;&gt;• &lt;code style=&quot;padding: 0.15em 0.38em;border-radius: 4px;background: #eef2f7;color: #c0392b;font-family: &amp;quot;SFMono-Regular&amp;quot;, Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, monospace;font-size: 0.89em;word-break: break-all;&quot; class=&quot;js_darkmode__122 js_darkmode__text__193&quot;&gt;strict&lt;/code&gt; 默认 &lt;code style=&quot;padding: 0.15em 0.38em;border-radius: 4px;background: #eef2f7;color: #c0392b;font-family: &amp;quot;SFMono-Regular&amp;quot;, Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, monospace;font-size: 0.89em;word-break: break-all;&quot; class=&quot;js_darkmode__123 js_darkmode__text__194&quot;&gt;true&lt;/code&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0.35em 0;&quot; class=&quot;js_darkmode__text__195&quot;&gt;• &lt;code style=&quot;padding: 0.15em 0.38em;border-radius: 4px;background: #eef2f7;color: #c0392b;font-family: &amp;quot;SFMono-Regular&amp;quot;, Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, monospace;font-size: 0.89em;word-break: break-all;&quot; class=&quot;js_darkmode__124 js_darkmode__text__196&quot;&gt;module&lt;/code&gt; 默认 &lt;code style=&quot;padding: 0.15em 0.38em;border-radius: 4px;background: #eef2f7;color: #c0392b;font-family: &amp;quot;SFMono-Regular&amp;quot;, Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, monospace;font-size: 0.89em;word-break: break-all;&quot; class=&quot;js_darkmode__125 js_darkmode__text__197&quot;&gt;esnext&lt;/code&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0.35em 0;&quot; class=&quot;js_darkmode__text__198&quot;&gt;• &lt;code style=&quot;padding: 0.15em 0.38em;border-radius: 4px;background: #eef2f7;color: #c0392b;font-family: &amp;quot;SFMono-Regular&amp;quot;, Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, monospace;font-size: 0.89em;word-break: break-all;&quot; class=&quot;js_darkmode__126 js_darkmode__text__199&quot;&gt;target&lt;/code&gt; 默认为紧邻 &lt;code style=&quot;padding: 0.15em 0.38em;border-radius: 4px;background: #eef2f7;color: #c0392b;font-family: &amp;quot;SFMono-Regular&amp;quot;, Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, monospace;font-size: 0.89em;word-break: break-all;&quot; class=&quot;js_darkmode__127 js_darkmode__text__200&quot;&gt;esnext&lt;/code&gt; 之前的当前稳定 ECMAScript 版本&lt;/p&gt;&lt;p style=&quot;margin: 0.35em 0;&quot; class=&quot;js_darkmode__text__201&quot;&gt;• &lt;code style=&quot;padding: 0.15em 0.38em;border-radius: 4px;background: #eef2f7;color: #c0392b;font-family: &amp;quot;SFMono-Regular&amp;quot;, Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, monospace;font-size: 0.89em;word-break: break-all;&quot; class=&quot;js_darkmode__128 js_darkmode__text__202&quot;&gt;noUncheckedSideEffectImports&lt;/code&gt; 默认 &lt;code style=&quot;padding: 0.15em 0.38em;border-radius: 4px;background: #eef2f7;color: #c0392b;font-family: &amp;quot;SFMono-Regular&amp;quot;, Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, monospace;font-size: 0.89em;word-break: break-all;&quot; class=&quot;js_darkmode__129 js_darkmode__text__203&quot;&gt;true&lt;/code&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0.35em 0;&quot; class=&quot;js_darkmode__text__204&quot;&gt;• &lt;code style=&quot;padding: 0.15em 0.38em;border-radius: 4px;background: #eef2f7;color: #c0392b;font-family: &amp;quot;SFMono-Regular&amp;quot;, Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, monospace;font-size: 0.89em;word-break: break-all;&quot; class=&quot;js_darkmode__130 js_darkmode__text__205&quot;&gt;libReplacement&lt;/code&gt; 默认 &lt;code style=&quot;padding: 0.15em 0.38em;border-radius: 4px;background: #eef2f7;color: #c0392b;font-family: &amp;quot;SFMono-Regular&amp;quot;, Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, monospace;font-size: 0.89em;word-break: break-all;&quot; class=&quot;js_darkmode__131 js_darkmode__text__206&quot;&gt;false&lt;/code&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0.35em 0;&quot; class=&quot;js_darkmode__text__207&quot;&gt;• &lt;code style=&quot;padding: 0.15em 0.38em;border-radius: 4px;background: #eef2f7;color: #c0392b;font-family: &amp;quot;SFMono-Regular&amp;quot;, Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, monospace;font-size: 0.89em;word-break: break-all;&quot; class=&quot;js_darkmode__132 js_darkmode__text__208&quot;&gt;stableTypeOrdering&lt;/code&gt; 默认 &lt;code style=&quot;padding: 0.15em 0.38em;border-radius: 4px;background: #eef2f7;color: #c0392b;font-family: &amp;quot;SFMono-Regular&amp;quot;, Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, monospace;font-size: 0.89em;word-break: break-all;&quot; class=&quot;js_darkmode__133 js_darkmode__text__209&quot;&gt;true&lt;/code&gt; 且不能关&lt;/p&gt;&lt;p style=&quot;margin: 0.35em 0;&quot; class=&quot;js_darkmode__text__210&quot;&gt;• &lt;code style=&quot;padding: 0.15em 0.38em;border-radius: 4px;background: #eef2f7;color: #c0392b;font-family: &amp;quot;SFMono-Regular&amp;quot;, Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, monospace;font-size: 0.89em;word-break: break-all;&quot; class=&quot;js_darkmode__134 js_darkmode__text__211&quot;&gt;rootDir&lt;/code&gt; 现在默认 &lt;code style=&quot;padding: 0.15em 0.38em;border-radius: 4px;background: #eef2f7;color: #c0392b;font-family: &amp;quot;SFMono-Regular&amp;quot;, Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, monospace;font-size: 0.89em;word-break: break-all;&quot; class=&quot;js_darkmode__135 js_darkmode__text__212&quot;&gt;./&lt;/code&gt;，内层源目录必须显式设置&lt;/p&gt;&lt;p style=&quot;margin: 0.35em 0;&quot; class=&quot;js_darkmode__text__213&quot;&gt;• &lt;code style=&quot;padding: 0.15em 0.38em;border-radius: 4px;background: #eef2f7;color: #c0392b;font-family: &amp;quot;SFMono-Regular&amp;quot;, Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, monospace;font-size: 0.89em;word-break: break-all;&quot; class=&quot;js_darkmode__136 js_darkmode__text__214&quot;&gt;types&lt;/code&gt; 现在默认 &lt;code style=&quot;padding: 0.15em 0.38em;border-radius: 4px;background: #eef2f7;color: #c0392b;font-family: &amp;quot;SFMono-Regular&amp;quot;, Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, monospace;font-size: 0.89em;word-break: break-all;&quot; class=&quot;js_darkmode__137 js_darkmode__text__215&quot;&gt;[]&lt;/code&gt;，想恢复旧行为设成 &lt;code style=&quot;padding: 0.15em 0.38em;border-radius: 4px;background: #eef2f7;color: #c0392b;font-family: &amp;quot;SFMono-Regular&amp;quot;, Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, monospace;font-size: 0.89em;word-break: break-all;&quot; class=&quot;js_darkmode__138 js_darkmode__text__216&quot;&gt;[&amp;quot;*&amp;quot;]&lt;/code&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0.7em 0;&quot; class=&quot;js_darkmode__text__217&quot;&gt;&lt;code style=&quot;padding: 0.15em 0.38em;border-radius: 4px;background: #eef2f7;color: #c0392b;font-family: &amp;quot;SFMono-Regular&amp;quot;, Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, monospace;font-size: 0.89em;word-break: break-all;&quot; class=&quot;js_darkmode__139 js_darkmode__text__218&quot;&gt;rootDir&lt;/code&gt; 和 &lt;code style=&quot;padding: 0.15em 0.38em;border-radius: 4px;background: #eef2f7;color: #c0392b;font-family: &amp;quot;SFMono-Regular&amp;quot;, Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, monospace;font-size: 0.89em;word-break: break-all;&quot; class=&quot;js_darkmode__140 js_darkmode__text__219&quot;&gt;types&lt;/code&gt; 的变化最可能让人意外，但都好处理。tsconfig.json 在 &lt;code style=&quot;padding: 0.15em 0.38em;border-radius: 4px;background: #eef2f7;color: #c0392b;font-family: &amp;quot;SFMono-Regular&amp;quot;, Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, monospace;font-size: 0.89em;word-break: break-all;&quot; class=&quot;js_darkmode__141 js_darkmode__text__220&quot;&gt;src&lt;/code&gt; 之类目录外的项目，加上 &lt;code style=&quot;padding: 0.15em 0.38em;border-radius: 4px;background: #eef2f7;color: #c0392b;font-family: &amp;quot;SFMono-Regular&amp;quot;, Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, monospace;font-size: 0.89em;word-break: break-all;&quot; class=&quot;js_darkmode__142 js_darkmode__text__221&quot;&gt;rootDir&lt;/code&gt; 就能保持原目录结构：&lt;/p&gt;&lt;pre style=&quot;margin: 1.4em 0;padding: 1.2em 1.5em;border-radius: 12px;overflow-x: auto;-webkit-overflow-scrolling: touch;background: #111827;color: #f3f4f6;font-size: 13.5px;line-height: 1.65;white-space: pre;word-break: normal;word-wrap: normal;overflow-wrap: normal;tab-size: 4;-moz-tab-size: 4;&quot; class=&quot;js_darkmode__143 js_darkmode__text__222&quot;&gt;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;compilerOptions&amp;quot;:&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;...
+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;rootDir&amp;quot;:&amp;nbsp;&amp;quot;./src&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;include&amp;quot;:&amp;nbsp;[&amp;quot;./src&amp;quot;]
&amp;nbsp;&amp;nbsp;}&lt;/pre&gt;&lt;p style=&quot;margin: 0.7em 0;&quot; class=&quot;js_darkmode__text__224&quot;&gt;依赖特定全局声明的项目要显式列出它们：&lt;/p&gt;&lt;pre style=&quot;margin: 1.4em 0;padding: 1.2em 1.5em;border-radius: 12px;overflow-x: auto;-webkit-overflow-scrolling: touch;background: #111827;color: #f3f4f6;font-size: 13.5px;line-height: 1.65;white-space: pre;word-break: normal;word-wrap: normal;overflow-wrap: normal;tab-size: 4;-moz-tab-size: 4;&quot; class=&quot;js_darkmode__144 js_darkmode__text__225&quot;&gt;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;compilerOptions&amp;quot;:&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;显式列出你需要的&amp;nbsp;@types&amp;nbsp;包（如&amp;nbsp;bun、mocha、jasmine&amp;nbsp;等）
+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;types&amp;quot;:&amp;nbsp;[&amp;quot;node&amp;quot;,&amp;nbsp;&amp;quot;jest&amp;quot;]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;}&lt;/pre&gt;&lt;p style=&quot;margin: 0.7em 0;&quot; class=&quot;js_darkmode__text__227&quot;&gt;变成硬错误、行为置空的废弃项包括：不再支持 &lt;code style=&quot;padding: 0.15em 0.38em;border-radius: 4px;background: #eef2f7;color: #c0392b;font-family: &amp;quot;SFMono-Regular&amp;quot;, Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, monospace;font-size: 0.89em;word-break: break-all;&quot; class=&quot;js_darkmode__145 js_darkmode__text__228&quot;&gt;target: es5&lt;/code&gt;、&lt;code style=&quot;padding: 0.15em 0.38em;border-radius: 4px;background: #eef2f7;color: #c0392b;font-family: &amp;quot;SFMono-Regular&amp;quot;, Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, monospace;font-size: 0.89em;word-break: break-all;&quot; class=&quot;js_darkmode__146 js_darkmode__text__229&quot;&gt;downlevelIteration&lt;/code&gt;、&lt;code style=&quot;padding: 0.15em 0.38em;border-radius: 4px;background: #eef2f7;color: #c0392b;font-family: &amp;quot;SFMono-Regular&amp;quot;, Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, monospace;font-size: 0.89em;word-break: break-all;&quot; class=&quot;js_darkmode__147 js_darkmode__text__230&quot;&gt;moduleResolution: node/node10&lt;/code&gt;（改用 &lt;code style=&quot;padding: 0.15em 0.38em;border-radius: 4px;background: #eef2f7;color: #c0392b;font-family: &amp;quot;SFMono-Regular&amp;quot;, Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, monospace;font-size: 0.89em;word-break: break-all;&quot; class=&quot;js_darkmode__148 js_darkmode__text__231&quot;&gt;nodenext&lt;/code&gt; 或 &lt;code style=&quot;padding: 0.15em 0.38em;border-radius: 4px;background: #eef2f7;color: #c0392b;font-family: &amp;quot;SFMono-Regular&amp;quot;, Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, monospace;font-size: 0.89em;word-break: break-all;&quot; class=&quot;js_darkmode__149 js_darkmode__text__232&quot;&gt;bundler&lt;/code&gt;）、&lt;code style=&quot;padding: 0.15em 0.38em;border-radius: 4px;background: #eef2f7;color: #c0392b;font-family: &amp;quot;SFMono-Regular&amp;quot;, Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, monospace;font-size: 0.89em;word-break: break-all;&quot; class=&quot;js_darkmode__150 js_darkmode__text__233&quot;&gt;module: amd/umd/systemjs/none&lt;/code&gt;、&lt;code style=&quot;padding: 0.15em 0.38em;border-radius: 4px;background: #eef2f7;color: #c0392b;font-family: &amp;quot;SFMono-Regular&amp;quot;, Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, monospace;font-size: 0.89em;word-break: break-all;&quot; class=&quot;js_darkmode__151 js_darkmode__text__234&quot;&gt;baseUrl&lt;/code&gt;、&lt;code style=&quot;padding: 0.15em 0.38em;border-radius: 4px;background: #eef2f7;color: #c0392b;font-family: &amp;quot;SFMono-Regular&amp;quot;, Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, monospace;font-size: 0.89em;word-break: break-all;&quot; class=&quot;js_darkmode__152 js_darkmode__text__235&quot;&gt;moduleResolution: classic&lt;/code&gt;；&lt;code style=&quot;padding: 0.15em 0.38em;border-radius: 4px;background: #eef2f7;color: #c0392b;font-family: &amp;quot;SFMono-Regular&amp;quot;, Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, monospace;font-size: 0.89em;word-break: break-all;&quot; class=&quot;js_darkmode__153 js_darkmode__text__236&quot;&gt;esModuleInterop&lt;/code&gt; 和 &lt;code style=&quot;padding: 0.15em 0.38em;border-radius: 4px;background: #eef2f7;color: #c0392b;font-family: &amp;quot;SFMono-Regular&amp;quot;, Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, monospace;font-size: 0.89em;word-break: break-all;&quot; class=&quot;js_darkmode__154 js_darkmode__text__237&quot;&gt;allowSyntheticDefaultImports&lt;/code&gt; 不能设为 &lt;code style=&quot;padding: 0.15em 0.38em;border-radius: 4px;background: #eef2f7;color: #c0392b;font-family: &amp;quot;SFMono-Regular&amp;quot;, Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, monospace;font-size: 0.89em;word-break: break-all;&quot; class=&quot;js_darkmode__155 js_darkmode__text__238&quot;&gt;false&lt;/code&gt;；&lt;code style=&quot;padding: 0.15em 0.38em;border-radius: 4px;background: #eef2f7;color: #c0392b;font-family: &amp;quot;SFMono-Regular&amp;quot;, Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, monospace;font-size: 0.89em;word-break: break-all;&quot; class=&quot;js_darkmode__156 js_darkmode__text__239&quot;&gt;alwaysStrict&lt;/code&gt; 视为 &lt;code style=&quot;padding: 0.15em 0.38em;border-radius: 4px;background: #eef2f7;color: #c0392b;font-family: &amp;quot;SFMono-Regular&amp;quot;, Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, monospace;font-size: 0.89em;word-break: break-all;&quot; class=&quot;js_darkmode__157 js_darkmode__text__240&quot;&gt;true&lt;/code&gt; 不能关；namespace 声明里不能用 &lt;code style=&quot;padding: 0.15em 0.38em;border-radius: 4px;background: #eef2f7;color: #c0392b;font-family: &amp;quot;SFMono-Regular&amp;quot;, Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, monospace;font-size: 0.89em;word-break: break-all;&quot; class=&quot;js_darkmode__158 js_darkmode__text__241&quot;&gt;module&lt;/code&gt; 关键字；import 上不能用 &lt;code style=&quot;padding: 0.15em 0.38em;border-radius: 4px;background: #eef2f7;color: #c0392b;font-family: &amp;quot;SFMono-Regular&amp;quot;, Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, monospace;font-size: 0.89em;word-break: break-all;&quot; class=&quot;js_darkmode__159 js_darkmode__text__242&quot;&gt;asserts&lt;/code&gt;，要改用 &lt;code style=&quot;padding: 0.15em 0.38em;border-radius: 4px;background: #eef2f7;color: #c0392b;font-family: &amp;quot;SFMono-Regular&amp;quot;, Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, monospace;font-size: 0.89em;word-break: break-all;&quot; class=&quot;js_darkmode__160 js_darkmode__text__243&quot;&gt;with&lt;/code&gt; 关键字。&lt;/p&gt;&lt;h3 style=&quot;margin: 1.2em 0 0.6em;font-size: 18px;line-height: 1.4;font-weight: 700;color: #2563eb;&quot; class=&quot;js_darkmode__text__244&quot;&gt;模板字面量类型现在保留 Unicode 码点&lt;/h3&gt;&lt;p style=&quot;margin: 0.7em 0;&quot; class=&quot;js_darkmode__text__245&quot;&gt;7.0 在从模板字面量类型推断时更自然地处理 Unicode 码点：&lt;/p&gt;&lt;pre style=&quot;margin: 1.4em 0;padding: 1.2em 1.5em;border-radius: 12px;overflow-x: auto;-webkit-overflow-scrolling: touch;background: #111827;color: #f3f4f6;font-size: 13.5px;line-height: 1.65;white-space: pre;word-break: normal;word-wrap: normal;overflow-wrap: normal;tab-size: 4;-moz-tab-size: 4;&quot; class=&quot;js_darkmode__161 js_darkmode__text__246&quot;&gt;type&amp;nbsp;HeadTail&amp;lt;S&amp;gt;&amp;nbsp;=&amp;nbsp;S&amp;nbsp;extends&amp;nbsp;`${infer&amp;nbsp;Head}${infer&amp;nbsp;Tail}`&amp;nbsp;?&amp;nbsp;[Head,&amp;nbsp;Tail]&amp;nbsp;:&amp;nbsp;never;

type&amp;nbsp;Result&amp;nbsp;=&amp;nbsp;HeadTail&amp;lt;&amp;quot;😀abc&amp;quot;&amp;gt;;
//&amp;nbsp;&amp;nbsp;&amp;nbsp;^
//&amp;nbsp;7.0&amp;nbsp;里：[&amp;quot;😀&amp;quot;,&amp;nbsp;&amp;quot;abc&amp;quot;]
//&amp;nbsp;以前：[&amp;quot;\ud83d&amp;quot;,&amp;nbsp;&amp;quot;\ude00abc&amp;quot;]&lt;/pre&gt;&lt;p style=&quot;margin: 0.7em 0;&quot; class=&quot;js_darkmode__text__248&quot;&gt;以前 TypeScript 跟随 JavaScript 的 UTF-16 索引行为，把 &lt;code style=&quot;padding: 0.15em 0.38em;border-radius: 4px;background: #eef2f7;color: #c0392b;font-family: &amp;quot;SFMono-Regular&amp;quot;, Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, monospace;font-size: 0.89em;word-break: break-all;&quot; class=&quot;js_darkmode__162 js_darkmode__text__249&quot;&gt;&amp;quot;😀&amp;quot;&lt;/code&gt; 拆成代理对的两半。技术上和 JS 索引一致，但通常不是人们想要的，还会产生含不成对代理项、语义无意义的字符串字面量类型。对那些刻意建模 UTF-16 码元的类型级字符串工具（比如某些 &lt;code style=&quot;padding: 0.15em 0.38em;border-radius: 4px;background: #eef2f7;color: #c0392b;font-family: &amp;quot;SFMono-Regular&amp;quot;, Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, monospace;font-size: 0.89em;word-break: break-all;&quot; class=&quot;js_darkmode__163 js_darkmode__text__250&quot;&gt;Length&lt;/code&gt; 工具），这是破坏性变更。新行为更接近用 &lt;code style=&quot;padding: 0.15em 0.38em;border-radius: 4px;background: #eef2f7;color: #c0392b;font-family: &amp;quot;SFMono-Regular&amp;quot;, Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, monospace;font-size: 0.89em;word-break: break-all;&quot; class=&quot;js_darkmode__164 js_darkmode__text__251&quot;&gt;for...of&lt;/code&gt; 遍历或 &lt;code style=&quot;padding: 0.15em 0.38em;border-radius: 4px;background: #eef2f7;color: #c0392b;font-family: &amp;quot;SFMono-Regular&amp;quot;, Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, monospace;font-size: 0.89em;word-break: break-all;&quot; class=&quot;js_darkmode__165 js_darkmode__text__252&quot;&gt;[...str]&lt;/code&gt; 展开时的直觉——&lt;code style=&quot;padding: 0.15em 0.38em;border-radius: 4px;background: #eef2f7;color: #c0392b;font-family: &amp;quot;SFMono-Regular&amp;quot;, Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, monospace;font-size: 0.89em;word-break: break-all;&quot; class=&quot;js_darkmode__166 js_darkmode__text__253&quot;&gt;&amp;quot;😀&amp;quot;&lt;/code&gt; 被当成一个单位。&lt;/p&gt;&lt;h3 style=&quot;margin: 1.2em 0 0.6em;font-size: 18px;line-height: 1.4;font-weight: 700;color: #2563eb;&quot; class=&quot;js_darkmode__text__254&quot;&gt;JavaScript 支持的差异&lt;/h3&gt;&lt;p style=&quot;margin: 0.7em 0;&quot; class=&quot;js_darkmode__text__255&quot;&gt;移植时团队顺带重做了 JavaScript 支持，让它和 &lt;code style=&quot;padding: 0.15em 0.38em;border-radius: 4px;background: #eef2f7;color: #c0392b;font-family: &amp;quot;SFMono-Regular&amp;quot;, Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, monospace;font-size: 0.89em;word-break: break-all;&quot; class=&quot;js_darkmode__167 js_darkmode__text__256&quot;&gt;.ts&lt;/code&gt; 文件的分析方式更一致。一些差异：值不能用在期望类型的地方，改写 &lt;code style=&quot;padding: 0.15em 0.38em;border-radius: 4px;background: #eef2f7;color: #c0392b;font-family: &amp;quot;SFMono-Regular&amp;quot;, Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, monospace;font-size: 0.89em;word-break: break-all;&quot; class=&quot;js_darkmode__168 js_darkmode__text__257&quot;&gt;typeof someValue&lt;/code&gt;；&lt;code style=&quot;padding: 0.15em 0.38em;border-radius: 4px;background: #eef2f7;color: #c0392b;font-family: &amp;quot;SFMono-Regular&amp;quot;, Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, monospace;font-size: 0.89em;word-break: break-all;&quot; class=&quot;js_darkmode__169 js_darkmode__text__258&quot;&gt;@enum&lt;/code&gt; 不再被特殊识别；单独的 &lt;code style=&quot;padding: 0.15em 0.38em;border-radius: 4px;background: #eef2f7;color: #c0392b;font-family: &amp;quot;SFMono-Regular&amp;quot;, Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, monospace;font-size: 0.89em;word-break: break-all;&quot; class=&quot;js_darkmode__170 js_darkmode__text__259&quot;&gt;?&lt;/code&gt; 不再能当类型用，改用 &lt;code style=&quot;padding: 0.15em 0.38em;border-radius: 4px;background: #eef2f7;color: #c0392b;font-family: &amp;quot;SFMono-Regular&amp;quot;, Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, monospace;font-size: 0.89em;word-break: break-all;&quot; class=&quot;js_darkmode__171 js_darkmode__text__260&quot;&gt;any&lt;/code&gt;；&lt;code style=&quot;padding: 0.15em 0.38em;border-radius: 4px;background: #eef2f7;color: #c0392b;font-family: &amp;quot;SFMono-Regular&amp;quot;, Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, monospace;font-size: 0.89em;word-break: break-all;&quot; class=&quot;js_darkmode__172 js_darkmode__text__261&quot;&gt;@class&lt;/code&gt; 不再让函数变构造器，改用 &lt;code style=&quot;padding: 0.15em 0.38em;border-radius: 4px;background: #eef2f7;color: #c0392b;font-family: &amp;quot;SFMono-Regular&amp;quot;, Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, monospace;font-size: 0.89em;word-break: break-all;&quot; class=&quot;js_darkmode__173 js_darkmode__text__262&quot;&gt;class&lt;/code&gt; 声明；不支持后缀 &lt;code style=&quot;padding: 0.15em 0.38em;border-radius: 4px;background: #eef2f7;color: #c0392b;font-family: &amp;quot;SFMono-Regular&amp;quot;, Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, monospace;font-size: 0.89em;word-break: break-all;&quot; class=&quot;js_darkmode__174 js_darkmode__text__263&quot;&gt;!&lt;/code&gt;；类型名必须定义在 &lt;code style=&quot;padding: 0.15em 0.38em;border-radius: 4px;background: #eef2f7;color: #c0392b;font-family: &amp;quot;SFMono-Regular&amp;quot;, Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, monospace;font-size: 0.89em;word-break: break-all;&quot; class=&quot;js_darkmode__175 js_darkmode__text__264&quot;&gt;@typedef&lt;/code&gt; 标签里；不再支持 Closure 风格函数语法。更详细的 6.0 到 7.0 差异记录在项目的 &lt;code style=&quot;padding: 0.15em 0.38em;border-radius: 4px;background: #eef2f7;color: #c0392b;font-family: &amp;quot;SFMono-Regular&amp;quot;, Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, monospace;font-size: 0.89em;word-break: break-all;&quot; class=&quot;js_darkmode__176 js_darkmode__text__265&quot;&gt;CHANGES.md&lt;/code&gt; 里。&lt;/p&gt;&lt;h2 style=&quot;margin: 1.3em 0 0.65em;font-size: 22px;line-height: 1.35;font-weight: 700;color: #1a202c;border-bottom: 2px solid #e2e8f0;padding-bottom: 0.35em;&quot; class=&quot;js_darkmode__177 js_darkmode__text__266&quot;&gt;暂时还不能用的场景&lt;/h2&gt;&lt;p style=&quot;margin: 0.7em 0;&quot; class=&quot;js_darkmode__text__267&quot;&gt;有一点要特别说清楚：用 Vue、MDX、Astro、Svelte 的工作流，以及 Angular 里模板内的专门类型检查，暂时还不能用 TypeScript 7。原因是 7.0 还没暴露稳定的编程式 API，那些把 TypeScript 嵌进自己编译器和语言服务的工具（比如 Volar）目前只能依赖 6.0。团队说这是一个阶段性问题，会主动和这些项目的维护者合作解决。&lt;/p&gt;&lt;p style=&quot;margin: 0.7em 0;&quot; class=&quot;js_darkmode__text__268&quot;&gt;在那之前的建议：Angular 项目可以用 TypeScript 7 通过 &lt;code style=&quot;padding: 0.15em 0.38em;border-radius: 4px;background: #eef2f7;color: #c0392b;font-family: &amp;quot;SFMono-Regular&amp;quot;, Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, monospace;font-size: 0.89em;word-break: break-all;&quot; class=&quot;js_darkmode__178 js_darkmode__text__269&quot;&gt;tsc&lt;/code&gt; 在命令行做快速的全项目错误检测，编辑器仍用 6.0；用 Vue、MDX、Astro、Svelte 的项目暂时继续用 6.0。VS Code 里跑一下&amp;quot;Disable TypeScript 7 Language Server&amp;quot;命令就能回到 6.0。&lt;/p&gt;&lt;h2 style=&quot;margin: 1.3em 0 0.65em;font-size: 22px;line-height: 1.35;font-weight: 700;color: #1a202c;border-bottom: 2px solid #e2e8f0;padding-bottom: 0.35em;&quot; class=&quot;js_darkmode__179 js_darkmode__text__270&quot;&gt;往后怎么走&lt;/h2&gt;&lt;p style=&quot;margin: 0.7em 0;&quot; class=&quot;js_darkmode__text__271&quot;&gt;7.0 是 TypeScript 项目的一个大里程碑。这次移植是团队一年多的主要工作，7.0 出了之后，团队会回到新功能、易用性改进、更多性能优化，以及为整个生态实现新 API。发布节奏预计和 7.0 之前类似，每 3-4 个月一个有新特性的版本。7.1 已经在路上，会补上生态里的空缺。&lt;/p&gt;&lt;p style=&quot;margin: 0.7em 0;&quot; class=&quot;js_darkmode__text__272&quot;&gt;如果你手上有被类型检查拖慢的大型 TS 项目，这个版本值得尽早在非嵌入式语言的场景里试。先把 6.0 的默认变更适配好，迁移到 7.0 会顺很多。&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Thu, 09 Jul 2026 09:41:57 +0800</pubDate></item></channel></rss>