From b544d5cccd76735e034c8055918a50927b437474 Mon Sep 17 00:00:00 2001
From: wenxiangchao <wenxiangchao@ihengxin.com.cn>
Date: 星期二, 10 十一月 2026 08:29:04 +0800
Subject: [PATCH] fix: 维护模式重复进入失败与按钮灰死 + Broker 并发验证用例

---
 docs/程序架构解析报告_V3.1_TCP模拟器与统一驱动.html |  342 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 342 insertions(+), 0 deletions(-)

diff --git "a/docs/\347\250\213\345\272\217\346\236\266\346\236\204\350\247\243\346\236\220\346\212\245\345\221\212_V3.1_TCP\346\250\241\346\213\237\345\231\250\344\270\216\347\273\237\344\270\200\351\251\261\345\212\250.html" "b/docs/\347\250\213\345\272\217\346\236\266\346\236\204\350\247\243\346\236\220\346\212\245\345\221\212_V3.1_TCP\346\250\241\346\213\237\345\231\250\344\270\216\347\273\237\344\270\200\351\251\261\345\212\250.html"
new file mode 100644
index 0000000..321b6ed
--- /dev/null
+++ "b/docs/\347\250\213\345\272\217\346\236\266\346\236\204\350\247\243\346\236\220\346\212\245\345\221\212_V3.1_TCP\346\250\241\346\213\237\345\231\250\344\270\216\347\273\237\344\270\200\351\251\261\345\212\250.html"
@@ -0,0 +1,342 @@
+<!DOCTYPE html>
+<html lang="zh-CN">
+<head>
+<meta charset="utf-8"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>浠櫒璋冭瘯骞冲彴 绋嬪簭鏋舵瀯瑙f瀽鎶ュ憡锛圴3.1 路 TCP 妯℃嫙鍣� + 缁熶竴椹卞姩 + 澶氳澶囧苟鍙戯級</title>
+<style>
+:root{--bg:#f7f8fa;--card:#fff;--ink:#1f2430;--muted:#5b6472;--line:#e4e8ef;--accent:#2f6fed;--warn:#b7791f;--bad:#c0392b;--ok:#2e8b57;--code:#0d1117;}
+*{box-sizing:border-box}
+body{margin:0;background:var(--bg);color:var(--ink);font:15px/1.7 "Segoe UI","Microsoft YaHei",Arial,sans-serif}
+.wrap{max-width:1080px;margin:0 auto;padding:32px 20px 80px}
+h1{font-size:26px;margin:0 0 6px}
+h2{font-size:20px;margin:34px 0 12px;padding-bottom:6px;border-bottom:2px solid var(--line)}
+h3{font-size:16px;margin:20px 0 8px;color:var(--accent)}
+.sub{color:var(--muted);margin:0 0 18px}
+.card{background:var(--card);border:1px solid var(--line);border-radius:12px;padding:16px 18px;margin:14px 0;box-shadow:0 1px 2px rgba(0,0,0,.03)}
+pre{background:var(--code);color:#e6edf3;border-radius:10px;padding:14px 16px;overflow:auto;font:13px/1.55 "Cascadia Code",Consolas,monospace;margin:10px 0}
+code{font-family:"Cascadia Code",Consolas,monospace;background:#eef1f6;padding:1px 5px;border-radius:4px;font-size:13px}
+pre code{background:none;padding:0;color:inherit}
+table{border-collapse:collapse;width:100%;margin:10px 0;font-size:14px}
+th,td{border:1px solid var(--line);padding:7px 10px;text-align:left;vertical-align:top}
+th{background:#eef2f8}
+.tag{display:inline-block;padding:1px 8px;border-radius:999px;font-size:12px;font-weight:600;margin-right:4px}
+.t-local{background:#e6f0ff;color:#1b4fa0}
+.t-broker{background:#fdeee0;color:#a35a12}
+.t-server{background:#e7f6ec;color:#1f7a3d}
+.ok{color:var(--ok);font-weight:600}
+.bad{color:var(--bad);font-weight:600}
+.warn{color:var(--warn);font-weight:600}
+.small{font-size:13px;color:var(--muted)}
+.toc{columns:2;font-size:14px}
+.toc a{color:var(--accent);text-decoration:none}
+.kv{color:#8b949e}
+.hl{background:#fff6d6;border-left:4px solid var(--warn);padding:10px 12px;border-radius:6px;margin:10px 0}
+.fx{background:#e8f5e9;border-left:4px solid var(--ok);padding:10px 12px;border-radius:6px;margin:10px 0}
+</style>
+</head>
+<body>
+<div class="wrap">
+
+<h1>浠櫒璋冭瘯骞冲彴 路 绋嬪簭鏋舵瀯瑙f瀽鎶ュ憡</h1>
+<p class="sub">V3.1 缁撴瀯锛欳AN 妯℃嫙鍣ㄧ嫭绔� TCP 鏈嶅姟 + 缁熶竴 <code>CanDeviceDriver</code> + 澶氳澶囧苟鍙戣皟璇� + 鎬荤嚎搴旂瓟鍣� + 缁存姢绉熺害蹇冭烦銆�<br/>
+鏈姤鍛婃弿杩�<b>鏈�鏂颁唬鐮�</b>鐨勮繍琛岄�昏緫锛屼笌浠撳簱瀹為檯瀹炵幇鍚屾锛�2026-11-09锛夈��</p>
+
+<div class="card">
+<b>鐩綍</b>
+<div class="toc">
+<div><a href="#s1">1. 杩涚▼涓庢暟鎹嫇鎵�</a></div>
+<div><a href="#s2">2. 宸ョ▼涓庡叧閿枃浠舵竻鍗�</a></div>
+<div><a href="#s3">3. 鍚姩鍒濆鍖栨椂搴�</a></div>
+<div><a href="#s4">4. 璁惧娉ㄥ唽涓庣粺涓�椹卞姩鍒嗘淳</a></div>
+<div><a href="#s5">5. TCP 绾垮崗璁笌妯℃嫙鍣ㄦ湇鍔$</a></div>
+<div><a href="#s6">6. 鎬荤嚎璺敱涓庡簲绛斿櫒</a></div>
+<div><a href="#s7">7. 璋冭瘯椤靛鏍囩澶氫細璇�</a></div>
+<div><a href="#s8">8. 缁存姢浼氳瘽鐘舵�佹満涓庣绾﹀績璺�</a></div>
+<div><a href="#s9">9. 鎶ユ枃鏀跺彂鍏ㄩ摼璺紙Local / Broker锛�</a></div>
+<div><a href="#s10">10. 閿欒澶勭悊涓庝笉鍙橀噺</a></div>
+<div><a href="#s11">11. 浠g爜绱㈠紩</a></div>
+<div><a href="#s12">12. 宸茬煡闄愬埗</a></div>
+</div>
+</div>
+
+<!-- ============================================================ -->
+<h2 id="s1">1銆�杩涚▼涓庢暟鎹嫇鎵�</h2>
+<div class="card">
+<p>绯荤粺鐢� <b>3 绫昏繘绋� + 1 涓湇鍔¤繘绋�</b> 缁勬垚锛孋AN 鎬荤嚎涓栫晫鐢辩嫭绔嬫湇鍔¤繘绋嬬粺涓�鎵樼锛�</p>
+<pre>
+鈹屸攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹� CanSimulatorServer.exe锛堟�荤嚎鏉冨▉锛岀嫭绔嬭繘绋嬶級 鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
+鈹�  TcpListener 127.0.0.1:9000                                                                                      鈹�
+鈹�   鈹溾攢 TcpSimulatorHost   鎺ュ彈杩炴帴锛屾瘡杩炴帴涓�涓� ServerSession                                                        鈹�
+鈹�   鈹溾攢 ServerSession      HELLO 鐘舵�佹満 + 涓�闂竴绛斾繚搴忓搷搴� + EV:RECV 鎺ㄩ�侊紙鍐欓攣涓茶銆佸懡浠ゆ湡鏆傚瓨闂級                 鈹�
+鈹�   鈹溾攢 CanBusManager      鎸夊悕鎳掑缓 CanBusSimulator锛�(bus,nodeIndex) 鍞竴鎬т徊瑁�                                     鈹�
+鈹�   鈹溾攢 CanCommandExecutor 鍛戒护涓叉墽琛岋紙SEND/QUERY/AUTO_RESPONSE/BUS_ECHO/FILTER/LOG/STATUS鈥︼級                       鈹�
+鈹�   鈹斺攢 CanBusSimulator    澶嶇敤鍘熻矾鐢�/鑷姩鍝嶅簲/鎬荤嚎鏃ュ織 + <b>鎬荤嚎绾у簲绛斿櫒 EchoResponderToSender</b>                    鈹�
+鈹�  UI锛氱洃鍚姸鎬� 路 鑺傜偣鏍� 路 瀹炴椂甯ц〃(TX/RX) 路 缁熻 路 鏃ュ織 路 搴旂瓟鍣ㄥ閫夋                                              鈹�
+鈹斺攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
+        鈻� TCP 9000锛圢odeChannelTransport锛�              鈻� TCP 9000锛堝涓荤墿鐞嗕細璇濓級
+        鈹�                                               鈹�
+鈹屸攢鈹�鈹�鈹�鈹�鈹�鈹�鈹粹攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�   鍛藉悕绠¢亾 RPC   鈹屸攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹粹攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
+鈹� Plugin.IntegrationTest 鈹� 鈼勨攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈻� 鈹�  DeviceBroker.exe         鈹�
+鈹� 锛堜富绋嬪簭锛孡ocal 璁惧锛�  鈹�  aging.broker-   鈹� 锛圔roker 鍏变韩璁惧瀹夸富锛�   鈹�
+鈹�  CAN-001/002 鈥�         鈹�  b01.v1          鈹�  CAN-003/004 鈥�            鈹�
+鈹斺攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�                  鈹斺攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
+
+鏁版嵁鏂囦欢锛�%LOCALAPPDATA%\PluginIntegrationTest锛夛細
+  data.db  璁惧瀹氫箟锛堝惈 ExecutionMode=Local/Broker銆丅rokerId銆丒ndpoint銆丳hysicalSessionKey锛�
+  arb.db   璺ㄨ繘绋嬬绾︿徊瑁侊紙resource_state / lease_history / recovery_checkpoint / authority_meta锛�
+  debug.db 璋冭瘯浼氳瘽锛坉ebug_session 鐘舵�佹満鎸佷箙鍖� + 鎿嶄綔鏃ュ織锛�
+</pre>
+<p><span class="tag t-local">Local 鐩磋繛</span>瀹㈡埛绔繘绋嬪唴 <code>CanDeviceDriver</code> 缁� <code>NodeChannelTransport</code> 鐩存帴 TCP 杩炴ā鎷熷櫒銆�<br/>
+<span class="tag t-broker">Broker 浠g悊</span>瀹㈡埛绔� <code>CanDeviceDriver</code> 缁� <code>BrokerRpcTransport</code> 璧板懡鍚嶇閬撳鎵樺涓伙紝瀹夸富鍐呭啀鐢� <code>CanDeviceDriver(NodeChannel)</code> 杩炴ā鎷熷櫒銆�<br/>
+<span class="tag t-server">鏈嶅姟</span>CanSimulatorServer 鏄敮涓�鐨勬�荤嚎涓栫晫鏉冨▉锛屾墍鏈夎繘绋嬬殑鍚屽悕鎬荤嚎鍏跺疄鏄�<b>鍚屼竴涓繘绋嬪唴鐨勫悓涓�鎬荤嚎瀵硅薄</b>锛屽洜姝よ法杩涚▼璁惧澶╃劧浜掗�氥��</p>
+<p class="small">涓庢棫缁撴瀯鐨勫叧閿樊寮傦細涓嶅啀鏈�"杩涚▼鍐� static 鎬荤嚎瀛楀吀"锛岃法杩涚▼闅旂闂浠庢牴涓婃秷闄わ紱CAN 椹卞姩鍙墿涓�涓被銆�</p>
+</div>
+
+<!-- ============================================================ -->
+<h2 id="s2">2銆�宸ョ▼涓庡叧閿枃浠舵竻鍗�</h2>
+<div class="card">
+<table>
+<tr><th>灞�</th><th>鏂囦欢</th><th>鑱岃矗</th></tr>
+<tr><td>妯℃嫙鍣ㄧ被搴�</td><td>CanSimulator\CanBusSimulator.cs 路 CanNode.cs 路 CanFrame.cs 路 <b>SimulatorFraming.cs</b></td><td>铏氭嫙鎬荤嚎/鑺傜偣/甯э紱鏂板 TCP 鍒嗗抚缂栬В鐮侊紙4B 澶х闀垮害+UTF8锛�</td></tr>
+<tr><td rowspan="4">妯℃嫙鍣ㄦ湇鍔$<br/>CanSimulatorServer</td><td>CanSimulatorServer.Core\TcpSimulatorHost.cs</td><td>鐩戝惉/鎺ュ彈杩炴帴/浼氳瘽鐧昏锛沺ort=0 闅忔満绔彛锛堟祴璇曞洖鐜級</td></tr>
+<tr><td>CanSimulatorServer.Core\ServerSession.cs</td><td>鍗曡繛鎺ュ崗璁姸鎬佹満銆佷繚搴忓搷搴斻�丒V 鎺ㄩ�併�佸懡浠ゆ湡鎺ㄩ�佹殏瀛橀棬</td></tr>
+<tr><td>CanSimulatorServer.Core\CanBusManager.cs</td><td>鎬荤嚎娉ㄥ唽琛� + (bus,node) 鍞竴浠茶 + 鑺傜偣鈫斾細璇濊兌姘�</td></tr>
+<tr><td>CanSimulatorServer.Core\CanCommandExecutor.cs</td><td>鍛戒护涓叉墽琛屽櫒锛堝惈 BUS_ECHO 搴旂瓟鍣ㄣ�丄UTO_RESPONSE銆丗ILTER銆丩OG銆丼TATUS锛�</td></tr>
+<tr><td>妯℃嫙鍣ㄦ湇鍔� UI</td><td>CanSimulatorServer.App\App.cs 路 MainWindow.cs</td><td>WPF 鐩戞帶绐楀彛锛堣妭鐐规爲/甯ц〃/缁熻/搴旂瓟鍣ㄥ閫夋锛�</td></tr>
+<tr><td rowspan="4">椹卞姩灞�<br/>Aging.Infrastructure</td><td>Drivers\CanDeviceDriver.cs</td><td><b>鍞竴 CAN 椹卞姩</b>锛氬懡浠よ涔夈�佹帴鏀剁紦鍐层�佷簨浠躲�佽繛鎺ョ姸鎬佹満</td></tr>
+<tr><td>Drivers\ICanTransport.cs 路 NodeChannelTransport.cs 路 BrokerRpcTransport.cs</td><td>浼犺緭鍚庣鎶借薄涓庝袱瀹炵幇锛圱CP 鐩磋繛 / 绠¢亾 RPC锛�</td></tr>
+<tr><td>Drivers\DriverFactory.cs</td><td>CAN 缁熶竴浜у嚭 CanDeviceDriver</td></tr>
+<tr><td>InfrastructureBootstrapper.cs</td><td>瑁呴厤鏈嶅姟銆丅roker 璁惧娉ㄥ唽浠g悊椹卞姩銆佸惎鍔ㄥ璐�</td></tr>
+<tr><td>Broker 瀹夸富</td><td>DeviceBroker\BrokerServer.cs</td><td>涓夐噸鍏冲崱 + SessionGate + 鎹庡甫鎺ㄩ�� AppendPushes</td></tr>
+<tr><td rowspan="5">璋冭瘯鎻掍欢<br/>Plugin.DeviceDebug</td><td>DeviceDebug.xaml(.cs)</td><td>澶氳澶囧3锛氳澶囦笅鎷�(杩囨护宸插紑)+鍔犲叆/鍏抽棴+TabControl</td></tr>
+<tr><td>DeviceDebugTab.xaml(.cs)</td><td>鍗曡澶囧伐浣滃尯锛氱嫭绔嬩細璇�+闈㈡澘+鎿嶄綔鏃ュ織+缁存姢鎸夐挳</td></tr>
+<tr><td>Model\DebugSessionManager.cs</td><td>浼氳瘽鐘舵�佹満 + <b>缁存姢绉熺害蹇冭烦缁湡</b> + 浠ょ墝缂撳瓨澶嶇敤</td></tr>
+<tr><td>Panels\CanDebugPanel.xaml(.cs)</td><td>CAN 澶氶�氶亾澹筹紙TabControl锛�</td></tr>
+<tr><td>Panels\CanChannelView.xaml(.cs)</td><td>鍗曢�氶亾瑙嗗浘锛堣繛鎺�/鍙戦��/鎺ユ敹/缁熻锛夛紝BeginInvoke 鏄剧ず</td></tr>
+</table>
+</div>
+
+<!-- ============================================================ -->
+<h2 id="s3">3銆�鍚姩鍒濆鍖栨椂搴�</h2>
+<div class="card">
+<pre class="seq">
+鈶� 鐢ㄦ埛鎵嬪姩鍚姩 CanSimulatorServer.exe锛堜富绋嬪簭涓� Broker 閮戒笉鎷夎捣瀹冿級
+   鈹� TcpSimulatorHost.StartAsync(9000) 鐩戝惉锛沀I 灏辩华锛涘簲绛斿櫒榛樿 OFF
+
+鈶� 鍚姩 Plugin.IntegrationTest.exe 鈫� MainWindow.InitializePlugins锛堥『搴忔晱鎰燂級
+   1. DeviceConfig.InitFinish        鈫� 寤哄簱/杩佺Щ data.db
+   2. SeedPresetCanDevices()         鈫� 棰勭疆 CAN 璁惧锛�<b>蹇呴』鍏堜簬鍩虹璁炬柦</b>锛孊ootstrapper 鎵簱鍐冲畾娉ㄥ唽锛�
+   3. InitializeAutoServices()
+      InfrastructureBootstrapper.Initialize(data.db)
+        a. DbLeaseStore(arb.db,"local-main")
+        b. <u>ReconcileAfterBoot</u>       鈫� SweepExpired + ApproveRecovery 鍥炴敹涓婃杩涚▼娉勬紡/杩囨湡绉熺害
+        c. LayeredResourceManager 娉ㄥ唽杩� UtilContainer锛�"ResourceManager"/"LeaseCoordinator"锛�
+        d. DeviceManager/DeviceService/AutoDeviceFacade/CanBusService
+        e. LoadDevicesFromConfig + RegisterBrokeredDrivers锛圔roker 璁惧鈫扖anDeviceDriver.CreateBrokerProxy锛�
+   4. 鑷姩鎷夎捣 DeviceBroker.exe锛堝瓨鍦� Broker 璁惧鏃讹級
+      鈹� BrokerServer 鏋勯�犳椂鍚屾牱 ReconcileAfterBoot(broker:...)
+   5. DeviceDebug.InitFinish          鈫� 姝ゆ椂 UtilContainer 灏辩华锛岃兘鎷垮埌浠茶鏈嶅姟
+</pre>
+<div class="hl"><b>椤哄簭瑕佺偣</b>锛氬缓搴撯啋棰勭疆璁惧鈫掑熀纭�璁炬柦鈫払roker鈫扗eviceDebug銆傝嫢 DeviceDebug 鏃╀簬鍩虹璁炬柦锛孶tilContainer 鍙栧埌 null 鏈嶅姟锛岀淮鎶や徊瑁佷細琚潤榛樼粫杩囷紙鍘嗗彶缂洪櫡锛屽凡淇級銆�</div>
+</div>
+
+<!-- ============================================================ -->
+<h2 id="s4">4銆�璁惧娉ㄥ唽涓庣粺涓�椹卞姩鍒嗘淳</h2>
+<div class="card">
+<p>鍏ㄧ郴缁熷彧鏈変竴涓� CAN 椹卞姩绫� <code>CanDeviceDriver</code>锛孡ocal/Broker 宸紓涓嬫矇鍒版瀯閫犳椂閫夋嫨鐨勪紶杈撳悗绔� <code>ICanTransport</code>锛屼笂灞傦紙鑷姩鍖� <code>DeviceManager.GetDriver</code>銆佽皟璇曢潰鏉匡級瀹屽叏鏃犳劅鐭ャ��</p>
+<pre>
+IDeviceDriver锛堢粺涓�濂戠害锛�
+    鈻�
+CanDeviceDriver  鈫� 鍛戒护瑙f瀽 / _recvBuffer / DriverFrameReceived 浜嬩欢 / 杩炴帴鐘舵�佹満
+ 鈹溾攢 NodeChannelTransport   (Local)  TCP 鐩磋繛妯℃嫙鍣細HELLO鈫掑懡浠や竴闂竴绛斺啋璇诲惊鐜垎娴佸搷搴�/鎺ㄩ�佲啋鏂嚎閲嶈繛
+ 鈹斺攢 BrokerRpcTransport     (Broker) 鍛藉悕绠¢亾濮旀墭瀹夸富锛歋ubmitBody RPC鈫扲esultBody 鎬佹槧灏勨啋瑙f瀽 |PUSHED 鎹庡甫
+
+鍒嗘淳鏉ユ簮锛�
+ 路 DriverFactory.CreateDriver("CAN", endpoint) 鈫� new CanDeviceDriver(deviceId, "bus:node")   // Local / 瀹夸富鐗╃悊浼氳瘽
+ 路 InfrastructureBootstrapper.RegisterBrokeredDrivers 鈫� CanDeviceDriver.CreateBrokerProxy(...) // Broker 瀹㈡埛绔�
+</pre>
+<table>
+<tr><th>鍦烘櫙</th><th>椹卞姩濡備綍浜х敓</th><th>鐗╃悊浼氳瘽鍦ㄥ摢</th></tr>
+<tr><td>Local 璁惧(CAN-001/002)</td><td>闈㈡澘/宸ュ巶 new CanDeviceDriver(NodeChannel)</td><td>鏈繘绋嬧啋TCP 杩炴ā鎷熷櫒</td></tr>
+<tr><td>Broker 璁惧(CAN-003/004) 瀹㈡埛绔�</td><td>Bootstrapper 娉ㄥ唽 CreateBrokerProxy(BrokerRpc)</td><td>瀹夸富杩涚▼</td></tr>
+<tr><td>Broker 璁惧 瀹夸富渚�</td><td>BrokerServer.EnsureConnectedAsync鈫扗riverFactory鈫扖anDeviceDriver(NodeChannel)</td><td>瀹夸富鈫扵CP 杩炴ā鎷熷櫒</td></tr>
+</table>
+<p class="small">鍏抽敭锛�<b>鍏ㄧ郴缁熷彧鏈変竴浠�"鑺傜偣閫氶亾椹卞姩"浠g爜</b>鈥斺�擝roker 妯″紡涓嬪涓诲唴閮ㄧ殑鐗╃悊浼氳瘽鍚屾牱鏄� CanDeviceDriver(NodeChannel)銆�</p>
+</div>
+
+<!-- ============================================================ -->
+<h2 id="s5">5銆�TCP 绾垮崗璁笌妯℃嫙鍣ㄦ湇鍔$</h2>
+<div class="card">
+<h3>5.1 鍒嗗抚</h3>
+<p>4 瀛楄妭<b>澶х</b>闀垮害鍓嶇紑 + UTF8 鏂囨湰琛岋紙<code>SimulatorFraming</code>锛夈�傝渚у惊鐜婊″ご閮ㄤ笌甯т綋锛屽ぉ鐒跺鐞嗙矘鍖�/鍗婂寘锛涢暱搴﹂潪娉曟姏 <code>InvalidDataException</code>锛汦OF 杩斿洖 null 瑙﹀彂鏂嚎鎰熺煡銆�</p>
+<h3>5.2 娑堟伅绫诲瀷</h3>
+<table>
+<tr><th>鏂瑰悜</th><th>娑堟伅</th><th>鍚箟</th></tr>
+<tr><td rowspan="4">C鈫扴</td><td><code>HELLO:{bus}:{nodeIndex}:{tag}</code></td><td>鎻℃墜骞舵寕杞� (bus,nodeIndex)锛屾縺娲昏妭鐐广�佸紑濮嬫敹甯�</td></tr>
+<tr><td><code>SEND:{frameId}:{data}</code></td><td>鍙戝抚锛堝懡浠や覆閫忎紶锛�</td></tr>
+<tr><td><code>QUERY:{鍛戒护涓瞹</code></td><td>RECV/RECV_ALL/STATUS/AUTO_RESPONSE/BUS_ECHO/FILTER/LOG/BUS_STATUS鈥�</td></tr>
+<tr><td><code>DISCONNECT</code></td><td>娉ㄩ攢鏈繛鎺ヨ妭鐐�</td></tr>
+<tr><td rowspan="3">S鈫扖</td><td><code>OK:{payload}</code> / <code>ERR:{code}:{msg}</code></td><td>瀵逛笂涓�鏉¤姹傜殑鍝嶅簲锛堟伆濂戒竴琛岋紝淇濆簭锛�</td></tr>
+<tr><td><code>EV:RECV:{id}:{data}:{ts}:{src}</code></td><td>鎬荤嚎璺敱鎺ㄩ�佸抚锛堜富鍔ㄦ帹閫侊紝src 鍙负鑺傜偣鍙锋垨 RESPONDER锛�</td></tr>
+<tr><td><code>EV:STATE:鈥�</code></td><td>棰勭暀鎵╁睍</td></tr>
+</table>
+<h3>5.3 ServerSession 淇濆簭涓庢殏瀛橀棬</h3>
+<pre>
+璇诲惊鐜�(鍗曠嚎绋�): 閫愯璇昏姹� 鈫� Process() 鈫� 鍝嶅簲缁�"鍐欓攣"鍙戝嚭 鈫� FlushHeldPushes()
+鍛戒护澶勭悊鏈熼棿璺敱浜х敓鐨� EV:RECV 鍏堣繘 _heldPushes锛堟弧 1000 涓㈡渶鑰侊級锛�
+鍝嶅簲鍐欏畬鍚庡啀琛ュ彂 鈫� 淇濊瘉瀹㈡埛绔�"棣栬蹇呬负鍝嶅簲銆佹帹閫侀殢鍚�"銆�
+绌洪棽鏈熸帹閫侊細鍐欓攣涓茶鍗冲彂鍗宠蛋銆�
+</pre>
+<p class="small">閿欒鐮侊細<code>ERR:NODE_BUSY</code>锛堝悓 bus 鍚� nodeIndex 琚崰锛夈��<code>ERR:NOT_HANDSHAKED</code>銆�<code>ERR:UNKNOWN_CMD</code>銆�<code>ERR:BAD_FRAME</code>銆�</p>
+</div>
+
+<!-- ============================================================ -->
+<h2 id="s6">6銆�鎬荤嚎璺敱涓庡簲绛斿櫒</h2>
+<div class="card">
+<p>涓ょ"鑷姩鍥炲"鑳藉姏锛岃涔変笉鍚屻�佷簰涓嶅共鎵帮細</p>
+<table>
+<tr><th>鑳藉姏</th><th>瑙﹀彂鑰�</th><th>鍥炲缁欒皝</th><th>寮�鍏�</th></tr>
+<tr><td>鑺傜偣鑷姩鍝嶅簲</td><td><b>鎺ユ敹</b>鑺傜偣锛堟敹鍒板抚锛�</td><td>鍏跺畠鑺傜偣 + 鑷韩閭</td><td>閫氶亾闈㈡澘"鑷姩鍝嶅簲"锛�<code>AUTO_RESPONSE:ON</code>锛屽啓鑺傜偣灞炴�э級</td></tr>
+<tr><td><b>鎬荤嚎搴旂瓟鍣�</b>锛堟柊锛�</td><td>鎬荤嚎鏈韩</td><td><b>鍙戦�佽�呰嚜宸�</b>锛堝悓甯у洖鏄撅紝src=RESPONDER锛�</td><td>鏈嶅姟绐楀彛澶嶉�夋 / <code>QUERY:BUS_ECHO:ON</code>锛堝啓 <code>CanBusSimulator.EchoResponderToSender</code>锛�</td></tr>
+</table>
+<pre>
+OnNodeFrameSent(frame, src=node0):
+  1) 璺敱鍒板叾瀹冭妭鐐癸紱姣忎釜鎺ユ敹鑺傜偣鑻� AutoResponseEnabled 鈫� SendAutoResponse(鍥炲畠鏀跺埌鐨勫抚)
+  2) 鑻� EchoResponderToSender锛氭妸 frame 澶嶅埗銆丼ourceNodeId="RESPONDER"锛岀洿鎺ユ姇閫掑洖<b>鍙戦�佽妭鐐硅嚜韬�</b>
+     鈫� 鍙戦�佽妭鐐� FrameReceived 鈫� ServerSession 鎺ㄩ�� EV:RECV 鍥炶杩炴帴 鈫� 鍙戦�佽�呮敹鍒�"鍥炴樉"
+</pre>
+<div class="fx"><b>鎰忎箟</b>锛氬崟瀹㈡埛绔皟璇曟椂涔熻兘"鍙戜竴鏉℃敹鍒颁竴鏉″洖澶�"锛屾棤闇�绗簩鑺傜偣鍦ㄧ嚎鈥斺�旇繖姝f槸鎶� CAN-003 杩欑被鍏变韩璁惧褰撲綔琚祴璁惧楠岃瘉璇锋眰/鍝嶅簲鐨勫叧閿兘鍔涖��</div>
+</div>
+
+<!-- ============================================================ -->
+<h2 id="s7">7銆�璋冭瘯椤靛鏍囩澶氫細璇�</h2>
+<div class="card">
+<pre>
+DeviceDebug锛堝3锛孲impleMaskControl 鎻掍欢鍏ュ彛锛�
+ 鈹溾攢 椤舵爮锛氳澶囦笅鎷�(浠呭垪<b>鏈墦寮�</b>璁惧) + [鍔犲叆璋冭瘯] + [鍏抽棴褰撳墠椤礭 + 鍒锋柊
+ 鈹斺攢 TabControl
+     鈹斺攢 DeviceDebugTab 脳 N锛堟瘡涓� = 涓�涓澶囷紝鐙珛浼氳瘽/绉熺害/闈㈡澘/鏃ュ織锛�
+          鈹溾攢 淇℃伅鏍�(璁惧ID/鍨嬪彿/杩炴帴/鐗堟湰/棰勭害/浼氳瘽鐘舵��)
+          鈹溾攢 [杩涘叆缁存姢鎺у埗] [閫�鍑虹淮鎶
+          鈹溾攢 panelContainer锛歀oadPanel(kind)
+          鈹�     CanDevice 鈫� CanDebugPanel(澶氶�氶亾澹�) 鈫� CanChannelView(鍗曢�氶亾)
+          鈹�     PowerSupply / PLC 鈫� 瀵瑰簲闈㈡澘
+          鈹斺攢 鎿嶄綔鏃ュ織(鏈細璇�)
+</pre>
+<p>瑙勫垯锛�<b>涓�浼氫竴璁惧</b>鈥斺�斿姞鍏ユ椂鑻ヨ澶囧凡寮�鍒欒仛鐒﹀叾 Tab锛涗笅鎷夎繃婊ゆ帀宸插紑璁惧锛涘叧闂� Tab 璋� <code>CloseSessionSilently()</code> 閲婃斁浼氳瘽涓庣绾︼紝璁惧閲嶆柊鍥炲埌鍙�夈�侰AN 閫氶亾鍐呴儴鍐嶅涓�灞� <code>CanDebugPanel</code> TabControl锛屽彲瀵瑰悓璁惧寮�澶氶�氶亾銆�</p>
+<div class="hl"><b>鎺ユ敹鏄剧ず绾跨▼妯″瀷</b>锛欳anChannelView 甯т笂灞忕敤 <code>Dispatcher.BeginInvoke</code>锛堝紓姝ワ級銆傛浘鍥犵敤鍚屾 <code>Invoke</code>锛屽湪璇诲惊鐜嚎绋嬫帹閫侀澧炴椂涓�"UI 绾跨▼闃诲绛� RPC 鍝嶅簲"褰㈡垚鐜舰绛夊緟 鈫� 寮�搴旂瓟鍣ㄥ嵆鍐荤粨锛堝凡淇級銆�</div>
+</div>
+
+<!-- ============================================================ -->
+<h2 id="s8">8銆�缁存姢浼氳瘽鐘舵�佹満涓庣绾﹀績璺�</h2>
+<div class="card">
+<pre class="seq">
+OpenSession(deviceId) 鈫� ReadOnly
+   鈹� RequestMaintenance锛歊eserveAsync(澶嶇敤缂撳瓨 ownerToken) 鎷跨淮鎶ょ绾�(TTL=300s)
+   鈻�
+AcquiringMaintenance 鈫� ActivateMaintenance 鈫� <b>MaintenanceActive</b>
+   鈹�  鈹� 鍚姩绉熺害蹇冭烦 Timer锛氭瘡 120s 瀵规瘡涓� MaintenanceActive 浼氳瘽
+   鈹�        Coordinator.Renew(grant, 300) 缁湡锛岄槻 TTL 杩囨湡
+   鈹� 閫�鍑虹淮鎶� / 鍏抽棴 Tab锛欳loseSession
+   鈻�
+Closing 鈫� Closed锛圧eleaseReservationAsync 鐢ㄥ悓涓� ownerToken 閲婃斁绉熺害锛涙棤缁存姢浼氳瘽鍒欏仠蹇冭烦锛�
+</pre>
+<table>
+<tr><th>鏈哄埗</th><th>瑙e喅鐨勯棶棰�</th></tr>
+<tr><td>ownerToken 鎸� sessionId 缂撳瓨澶嶇敤</td><td>绉熺害鎸� TokenId(GUID) 绱㈠紩锛涙瘡娆� new 浼氬鑷撮噴鏀捐惤绌衡啋绉熺害娉勬紡鈫掕繃鏈� RecoveryRequired 姘镐箙闃诲</td></tr>
+<tr><td><b>缁存姢绉熺害蹇冭烦缁湡</b>锛堟柊锛�</td><td>闀挎椂闂寸淮鎶や細璇濆埌 300s TTL 鑷劧杩囨湡鈫払roker 鏍呮爮 RECOVERY_REQUIRED 绂佹 I/O锛涘績璺虫瘡 120s 缁湡锛屾案涓嶈Е杈捐繃鏈熺嚎</td></tr>
+<tr><td>鍚姩 ReconcileAfterBoot</td><td>杩涚▼閲嶅惎鑷姩 SweepExpired+ApproveRecovery锛屾竻鎺変笂娆℃畫鐣�/杩囨湡绉熺害锛堝惈宸插崱 RecoveryRequired 鐨勶級</td></tr>
+<tr><td>姝讳細璇濆洖鏀�</td><td>DB 鎵惧洖鐨勬湭鍏抽棴浼氳瘽寮哄埗鏍� Closed 鍐嶆柊寤猴紝閬垮厤 RequestMaintenance"浼氳瘽涓嶅瓨鍦�"</td></tr>
+</table>
+</div>
+
+<!-- ============================================================ -->
+<h2 id="s9">9銆�鎶ユ枃鏀跺彂鍏ㄩ摼璺�</h2>
+<div class="card">
+<h3>9.1 鍙戦�� 鈥� Local 璁惧</h3>
+<pre>
+CanChannelView.鍙戦�� 鈫� CanDeviceDriver.SendCommandAsync("SEND:0x300:AA BB")
+ 鈫� NodeChannelTransport.TransceiveAsync 鈫� TCP 鍐� "SEND:0x300:AA BB"
+ 鈫� ServerSession 澶勭悊 鈫� CanCommandExecutor.HandleSend 鈫� CanNode.SendFrame 鈫� CanBusSimulator 璺敱
+ 鈫� 鍥� "OK:TX:0x300:2" 鈫� 椹卞姩杩斿洖锛涢潰鏉垮姞 TX 琛�
+</pre>
+<h3>9.2 鍙戦�� 鈥� Broker 璁惧锛圕AN-003锛�</h3>
+<pre>
+闈㈡澘 鈫� CanDeviceDriver(BrokerRpc).SendCommandAsync("SEND:鈥�")
+ 鈫� BrokerRpcTransport 鏄犲皠 opCode=SEND,payload=鏁翠覆 鈫� SubmitBody 缁忓懡鍚嶇閬�
+ 鈫� BrokerServer.ExecuteOneShotAsync锛�
+     鈶� 鐧藉悕鍗�+鍩熷唴璁惧  鈶� configHash 瀵硅处(INV-04)  鈶� 绉熺害鏍呮爮(INV-01/03)  鈶� SessionGate 涓茶
+     鈶� 瀹夸富鍐� CanDeviceDriver(NodeChannel).SendCommandAsync 鈫� TCP 鈫� 妯℃嫙鍣ㄨ矾鐢�
+     鈶� ResultBody.Readback 鏈熬 <b>AppendPushes</b>锛氭妸瀹夸富椹卞姩鑷笂娆′互鏉ユ敹鍒扮殑 EV:RECV
+        浠� "|PUSHED:n|EV:RECV鈥�" 鎷间笂 鈫� 鍚岀閬撹繑鍥�
+ 鈫� 瀹㈡埛绔� BrokerRpcTransport 鍓ョ |PUSHED 娈靛苟瑙﹀彂 FramePushed
+</pre>
+<h3>9.3 鎺ユ敹 鈥� 缁熶竴浜嬩欢妯″瀷</h3>
+<pre>
+鏈嶅姟绔矾鐢�/搴旂瓟鍣ㄤ骇鐢熷抚 鈫� 鐩爣鑺傜偣 FrameReceived 鈫� ServerSession 鎺ㄩ�� EV:RECV
+ 鈹溾攢 Local锛歂odeChannel 璇诲惊鐜敹鍒� EV:RECV 鈫� CanDeviceDriver.OnFramePushed
+ 鈹�           鈫� _recvBuffer + _pendingPushLines + <b>DriverFrameReceived</b> 鈫� 闈㈡澘 BeginInvoke 涓婂睆
+ 鈹斺攢 Broker锛氬涓昏寰幆鏀跺埌 鈫� 瀹夸富椹卞姩 _pendingPushLines 鏆傚瓨
+            瀹㈡埛绔笅涓�娆� STATUS/SEND 杞鏃讹紝瀹夸富 AppendPushes 鎹庡甫 鈫� 瀹㈡埛绔� FramePushed 鈫� 浜嬩欢 鈫� 涓婂睆
+锛堥潰鏉� PollTimer 姣� 100ms 璋� QueryAsync("STATUS")锛氭棦鍒锋柊缁熻锛屼篃瑙﹀彂 Broker 鎹庡甫 drain锛�
+</pre>
+<div class="fx">缁撴灉锛歀ocal 涓� Broker 璁惧鍏变韩鍚屼竴濂椾簨浠堕┍鍔ㄦ帴鏀讹紝瀹炴椂涓旀棤閲嶅琛岋紱搴旂瓟鍣ㄥ紑鍚悗 Broker 璁惧涔熻兘"鍙戜竴鏉℃敹涓�鏉″洖鏄�"锛堝疄娴� 50 娆¤繛缁彂閫侊紝姣忔 1 TX + 鍥炴樉 RX锛屾棤閿欒鏃犲喕缁擄級銆�</div>
+</div>
+
+<!-- ============================================================ -->
+<h2 id="s10">10銆�閿欒澶勭悊涓庝笉鍙橀噺</h2>
+<div class="card">
+<table>
+<tr><th>涓嶅彉閲�</th><th>鍚箟</th><th>钀界偣</th></tr>
+<tr><td>INV-01</td><td>鏃犵绾︾姝� I/O</td><td>BrokerServer 鏍呮爮锛歋END/鍐欑被 QUERY 闇� Active 绉熺害锛汣ONNECT/DISCONNECT 涓庡彧璇� drain(RECV/STATUS/LOG/BUS_STATUS) 璞佸厤</td></tr>
+<tr><td>INV-03</td><td>杩囨湡涓嶈嚜鍔ㄨ娓�</td><td>绉熺害杩囨湡鈫扲ecoveryRequired锛屾嫆缁� I/O锛岄渶 ApproveRecovery锛堝績璺崇画鏈熼伩鍏嶈瑙︼級</td></tr>
+<tr><td>INV-04</td><td>閰嶇疆鍝堝笇瀵硅处</td><td>RPC 鎼哄甫 configHash锛屼笌瀹夸富鐢熸晥鍝堝笇涓嶇鈫扲ejectedConfigMismatch锛堟敼閰嶇疆椤诲厛 Apply锛�</td></tr>
+<tr><td>INV-06</td><td>缁撴灉鏈煡涓嶅緱鍋囧畾鏈墽琛�</td><td>瓒呮椂/鍦ㄩ�斿紓甯糕啋Unknown鈫掑鎴风鎶� TimeoutException锛岀姝㈣嚜鍔ㄩ噸璇� SEND</td></tr>
+</table>
+<table>
+<tr><th>鏁呴殰</th><th>琛屼负</th></tr>
+<tr><td>妯℃嫙鍣ㄦ湇鍔′笉鍙揪</td><td>NodeChannel.ConnectAsync 鎶涘惈"璇峰厛鍚姩 CanSimulatorServer.exe"鐨勮繛鎺ュ紓甯�</td></tr>
+<tr><td>涓�旀柇绾�</td><td>IsConnected=false鈫掓寚鏁伴��閬块噸杩�(0.5~5s)鈫掗噸鍙� HELLO锛涙湡闂村彂閫佸揩閫熷け璐� NOT_CONNECTED</td></tr>
+<tr><td>鍚� (bus,node) 鍐茬獊</td><td>HELLO 杩斿洖 ERR:NODE_BUSY锛岄┍鍔ㄦ姏"鑺傜偣缂栧彿 X 宸茶鍗犵敤"锛堝睘閰嶇疆閿欒锛屽紩瀵兼敼绔偣锛�</td></tr>
+<tr><td>鎺ㄩ�佹殏瀛樻弧</td><td>涓㈡渶鑰佸苟璁℃暟锛涘鎴风 STATUS/RECV 鍏滃簳琛ヨ处</td></tr>
+<tr><td>缁存姢绉熺害杩囨湡</td><td>蹇冭烦缁湡閬垮厤锛涜嫢杩涚▼宕╂簝閬楃暀锛岄噸鍚� ReconcileAfterBoot 鑷姩鍥炴敹</td></tr>
+</table>
+</div>
+
+<!-- ============================================================ -->
+<h2 id="s11">11銆�浠g爜绱㈠紩</h2>
+<div class="card">
+<table>
+<tr><th>鍏虫敞鐐�</th><th>浣嶇疆</th></tr>
+<tr><td>TCP 鍒嗗抚</td><td>CanSimulator\SimulatorFraming.cs锛圗ncode/Decode/ReadFrameAsync锛�</td></tr>
+<tr><td>鏈嶅姟绔細璇�/鍗忚</td><td>CanSimulatorServer.Core\ServerSession.cs锛圥rocess/HandleHello/OnNodeFrame/FlushHeldPushes锛�</td></tr>
+<tr><td>鍛戒护鎵ц/搴旂瓟鍣�</td><td>CanSimulatorServer.Core\CanCommandExecutor.cs锛圚andleSend/HandleQuery/BUS_ECHO/FormatPush锛�</td></tr>
+<tr><td>璺敱/鑷姩鍝嶅簲/搴旂瓟鍣�</td><td>CanSimulator\CanBusSimulator.cs锛圤nNodeFrameSent/SendAutoResponse/EchoResponderToSender锛�</td></tr>
+<tr><td>缁熶竴椹卞姩</td><td>Aging.Infrastructure\Drivers\CanDeviceDriver.cs锛圕onnect/Send/Query/OnFramePushed/DrainPendingPushLines锛�</td></tr>
+<tr><td>TCP 鍚庣</td><td>Drivers\NodeChannelTransport.cs锛圚andshakeAsync/ReadLoopAsync/閲嶈繛锛�</td></tr>
+<tr><td>RPC 鍚庣</td><td>Drivers\BrokerRpcTransport.cs锛圱ransceiveAsync/DrainPiggyback/ThrowForState锛�</td></tr>
+<tr><td>Broker 鎹庡甫</td><td>DeviceBroker\BrokerServer.cs锛圗xecuteOneShotAsync/RunFragmentAsync/AppendPushes锛�</td></tr>
+<tr><td>澶氳澶囧3/宸ヤ綔鍖�</td><td>Plugin.DeviceDebug\DeviceDebug.xaml.cs 路 DeviceDebugTab.xaml.cs</td></tr>
+<tr><td>浼氳瘽鐘舵�佹満/蹇冭烦</td><td>Plugin.DeviceDebug\Model\DebugSessionManager.cs锛圧equestMaintenance/ActivateMaintenance/RenewActiveMaintenance锛�</td></tr>
+<tr><td>閫氶亾鏄剧ず</td><td>Panels\CanDebugPanel.xaml.cs锛堝3锛壜� Panels\CanChannelView.xaml.cs锛圓ddReceivedFrame/BeginInvoke锛�</td></tr>
+<tr><td>瑁呴厤/娉ㄥ唽</td><td>Aging.Infrastructure\InfrastructureBootstrapper.cs锛圧egisterBrokeredDrivers锛壜� Drivers\DriverFactory.cs</td></tr>
+</table>
+</div>
+
+<!-- ============================================================ -->
+<h2 id="s12">12銆�宸茬煡闄愬埗涓庡悗缁�</h2>
+<div class="card">
+<ul>
+<li><b>Broker 鎺ユ敹瀹炴椂鎬т负"璇锋眰椹卞姩"</b>锛氶潬瀹夸富 STATUS/SEND 杞鎹庡甫 drain锛岄潪绾帹閫侊紱闈㈡澘 100ms 杞淇濊瘉鏈�缁堜竴鑷淬�傜湡瀹炵‖浠舵棤姝ゅ眰銆�</li>
+<li><b>owner鈫攃lientInstanceId 寮卞榻�</b>锛氬悓鏈� arb.db 浠呭瓨鍦ㄦ��/鐩镐綅鏍¢獙锛屾湭鍋氱鍚嶅嚟鎹紙V3.0 搂13 P2锛夈��</li>
+<li><b>搴旂瓟鍣ㄤ负鎬荤嚎绾�</b>锛氫竴娆″紑鍏充綔鐢ㄤ簬璇ユ�荤嚎鎵�鏈夊彂閫佽�咃紱濡傞渶鎸夎妭鐐�/鎸夊抚ID 绮剧粏鏄犲皠涓哄悗缁」銆�</li>
+<li><b>UI 寰呭姙</b>锛氫复鏃惰瘖鏂棩蹇楁挙闄わ紱RecoveryRequired 浜哄伐瀹℃壒 UI锛堢幇鐢卞惎鍔ㄥ璐︿唬鍋匡級锛汚pp.Success/Warn 鏍囬鏈湴鍖栥��</li>
+<li><b>鏋勫缓</b>锛歐PF 閾捐矾椤荤敤 VS 瀹屾暣鐗� MSBuild锛堜笉鍔� /p:Platform=x64锛夛紱妯℃嫙鍣ㄦ牳蹇冨彲 dotnet 鏋勫缓/娴嬭瘯銆�</li>
+</ul>
+<p class="small">鏈姤鍛婁笌浠g爜鍚屾浜� 2026-11-09锛涘疄鐜板彉鏇磋鍚屾鏇存柊鏈枃浠躲��</p>
+</div>
+
+</div>
+</body>
+</html>

--
Gitblit v1.9.1