<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-Hans-CN">
	<id>https://wiki2.lessokaji.com/index.php?action=history&amp;feed=atom&amp;title=%E6%A0%B8%E5%BF%83%E5%BC%80%E5%8F%91%E6%8C%87%E5%8D%97</id>
	<title>核心开发指南 - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="https://wiki2.lessokaji.com/index.php?action=history&amp;feed=atom&amp;title=%E6%A0%B8%E5%BF%83%E5%BC%80%E5%8F%91%E6%8C%87%E5%8D%97"/>
	<link rel="alternate" type="text/html" href="https://wiki2.lessokaji.com/index.php?title=%E6%A0%B8%E5%BF%83%E5%BC%80%E5%8F%91%E6%8C%87%E5%8D%97&amp;action=history"/>
	<updated>2026-05-16T16:55:40Z</updated>
	<subtitle>本wiki上该页面的版本历史</subtitle>
	<generator>MediaWiki 1.40.0</generator>
	<entry>
		<id>https://wiki2.lessokaji.com/index.php?title=%E6%A0%B8%E5%BF%83%E5%BC%80%E5%8F%91%E6%8C%87%E5%8D%97&amp;diff=1051&amp;oldid=prev</id>
		<title>Artheru：​Initial bilingual draft (auto-published)</title>
		<link rel="alternate" type="text/html" href="https://wiki2.lessokaji.com/index.php?title=%E6%A0%B8%E5%BF%83%E5%BC%80%E5%8F%91%E6%8C%87%E5%8D%97&amp;diff=1051&amp;oldid=prev"/>
		<updated>2026-05-16T14:00:53Z</updated>

		<summary type="html">&lt;p&gt;Initial bilingual draft (auto-published)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;lt;languages/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 概述 / Overview ==&lt;br /&gt;
本页是 MDCS '''核心平台开发'''的总入口，面向 ''修改 MDCS 本身''的开发者（添加新的 SLAM 后端、扩展 LadderLogic、修改 DPS 调度算法等）。完整离线副本见 `D:\src\cookbook\HOW_TO_DEV_CORE.md`。&lt;br /&gt;
&lt;br /&gt;
This is the hub for '''MDCS core platform development''' — for developers ''modifying MDCS itself'' (adding a new SLAM backend, extending LadderLogic, modifying DPS scheduling, etc.). Offline mirror: `D:\src\cookbook\HOW_TO_DEV_CORE.md`.&lt;br /&gt;
&lt;br /&gt;
== 1. 仓库布局 / Repo layout ==&lt;br /&gt;
7 个并列仓库，按依赖自底向上构建：&lt;br /&gt;
7 sibling repositories, built bottom-up by dependency:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 仓库 / Repo !! 产物 / Output !! 作用 / Role&lt;br /&gt;
|-&lt;br /&gt;
| `D:\src\Fundamentals\` || `FundamentalLib.dll`, `FundamentalLib2.dll`, `LessokajiProtect.dll` || 通用类型 + IPC + 日志 + 许可&lt;br /&gt;
|-&lt;br /&gt;
| `D:\src\LessokajiWeaver\` || `LessokajiWeaver.Fody.dll` || 编译期 IL 注入&lt;br /&gt;
|-&lt;br /&gt;
| `D:\src\CycleGUI\` || `CycleGUI.dll`, `libVRender.dll`（C++）|| 懒协程 UI 框架&lt;br /&gt;
|-&lt;br /&gt;
| `D:\src\M2\` || `MedullaCore.dll`, `OfficialPlugins/*.dll` || 硬件抽象内核 + 一方插件&lt;br /&gt;
|-&lt;br /&gt;
| `D:\src\Detour\` || `Detour.exe`, `DetourLite.exe`, `DetourCore.dll` || 定位系统&lt;br /&gt;
|-&lt;br /&gt;
| `D:\src\Clumsy\` || `ClumsyCore.dll`, `ClumsyDance.dll` || 车载自动驾驶&lt;br /&gt;
|-&lt;br /&gt;
| `D:\src\Simple\` || `SimpleCore.dll`, `SimpleComposer.exe` || 车队管理&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
详细的内核子页：&lt;br /&gt;
Per-subsystem deep-dive pages:&lt;br /&gt;
&lt;br /&gt;
* [[Special:MyLanguage/MDCS仓库布局与构建链|MDCS仓库布局与构建链]]&lt;br /&gt;
* [[Special:MyLanguage/DObject共享内存协议|DObject共享内存协议]] — Fundamentals 内核&lt;br /&gt;
* [[Special:MyLanguage/CycleGUI|CycleGUI]] — UI 框架&lt;br /&gt;
* [[Special:MyLanguage/Medulla软件架构|Medulla软件架构]] — 加载器 + 脚本引擎&lt;br /&gt;
* [[Special:MyLanguage/LadderLogic框架|LadderLogic框架]] — 周期循环&lt;br /&gt;
* [[Special:MyLanguage/Detour软件架构|Detour软件架构]] — 定位流水线&lt;br /&gt;
* [[Special:MyLanguage/DriveTask调度循环|DriveTask调度循环]] — Movement 宿主&lt;br /&gt;
* [[Special:MyLanguage/SimpleAgvInterface Queue机制|SimpleAgvInterface Queue机制]] — 任务流水线&lt;br /&gt;
* [[Special:MyLanguage/Simple软件架构|Simple软件架构]] — 调度内核&lt;br /&gt;
* [[Special:MyLanguage/调度内核运行原理|调度内核运行原理]] — DPS + 包络 + 可达性&lt;br /&gt;
* [[Special:MyLanguage/DPS调度算法详解|DPS调度算法详解]] — 死锁规避算法&lt;br /&gt;
* [[Special:MyLanguage/LessokajiWeaver编译后处理工具|LessokajiWeaver编译后处理工具]] — Fody 织入&lt;br /&gt;
* [[Special:MyLanguage/MDCS跨切面约定|MDCS跨切面约定]] — 命名 / 线程 / 错误处理 / 版本&lt;br /&gt;
* [[Special:MyLanguage/MDCS平台发布流程|MDCS平台发布流程]] — Release 流程&lt;br /&gt;
&lt;br /&gt;
== 2. 构建工具链 / Build chain ==&lt;br /&gt;
=== 顺序 / Order ===&lt;br /&gt;
1. LessokajiWeaver — 构建时依赖 / build-time dep&lt;br /&gt;
2. Fundamentals — 用 Weaver / uses Weaver&lt;br /&gt;
3. CycleGUI — 用 Fundamentals + 需要 `libVRender` C++ 先构建&lt;br /&gt;
4. M2 / MedullaCore — 用 Fundamentals + CycleGUI&lt;br /&gt;
5. M2 / OfficialPlugins/* — 用 MedullaCore&lt;br /&gt;
6. Detour / DetourCore&lt;br /&gt;
7. Clumsy / ClumsyCore，然后 ClumsyDance&lt;br /&gt;
8. Simple / SimpleCore，然后 SimpleComposer&lt;br /&gt;
&lt;br /&gt;
=== 引用程序集分发 / Reference-assembly distribution ===&lt;br /&gt;
每个核心 DLL 都同时产生一个 ''引用程序集''（`Ref&amp;lt;Name&amp;gt;.dll`），通过 [refasmer](https://github.com/JetBrains/Refasmer) 生成。插件 csproj 引用 `Ref&amp;lt;Name&amp;gt;.dll`，不引用 impl，所以：&lt;br /&gt;
Each core DLL also emits a '''reference-only assembly''' (`Ref&amp;lt;Name&amp;gt;.dll`) via [refasmer]. Plugins reference the `Ref` assembly, not the impl. Therefore:&lt;br /&gt;
&lt;br /&gt;
* 插件构建不会拉入 Costura 织入的传递依赖。&lt;br /&gt;
* 公共 API 由 `Ref` assembly 固定 —— `internal` 成员对插件不可见。&lt;br /&gt;
&lt;br /&gt;
【注意】 改动 `MedullaCore` 公共面后必须重新构建 impl + ref；插件用旧 `Ref` 构建后会静默缺失新成员。&amp;lt;br&amp;gt;&lt;br /&gt;
After any change to a `MedullaCore` public surface, rebuild both impl and ref assemblies; plugins built against the old ref will silently miss new members.&lt;br /&gt;
&lt;br /&gt;
=== Costura.Fody 胖 DLL ===&lt;br /&gt;
插件输出是单 `.dll`（所有依赖嵌入为 base64 资源）。核心 DLL 自身 ''不要''加 Costura.Fody，因为多个插件都要共载它们。&lt;br /&gt;
&lt;br /&gt;
Plugin outputs are fat DLLs (all deps embedded). Core DLLs themselves '''should not''' use Costura.Fody since multiple plugins co-load them.&lt;br /&gt;
&lt;br /&gt;
=== LessokajiWeaver IL 注入 ===&lt;br /&gt;
* `[AsInitParam] / [AsUpperIO] / [AsLowerIO]` → 字段重写为同步到 DObject 的 property&lt;br /&gt;
* `[ReplaceWithCompileInfo]` → 编译时戳 + git 哈希&lt;br /&gt;
* `[Translatable] / [T(zh=, en=)]` → getter 按 `CultureInfo.CurrentUICulture` 分派&lt;br /&gt;
&lt;br /&gt;
详见 [[Special:MyLanguage/LessokajiWeaver编译后处理工具|LessokajiWeaver编译后处理工具]] 与 [[Special:MyLanguage/如何使用LessokajiWeaver的多语言功能|如何使用LessokajiWeaver的多语言功能]]。&lt;br /&gt;
&lt;br /&gt;
== 3. 跨切面约定 / Cross-cutting conventions ==&lt;br /&gt;
=== 命名 / Naming ===&lt;br /&gt;
* 插件入口类: `MainIOObject`（精确匹配）。&lt;br /&gt;
* 引用程序集: `Ref&amp;lt;Name&amp;gt;.dll`。&lt;br /&gt;
* DObject 槽名: `&amp;lt;Producer&amp;gt;&amp;lt;Tag&amp;gt;`（如 `MedullaCartLowerIO&amp;lt;tag&amp;gt;`）。&lt;br /&gt;
&lt;br /&gt;
=== 线程 / Threading ===&lt;br /&gt;
* `LadderLogic` 每个 `[UseLadderLogic]` 类自己的线程。&lt;br /&gt;
* `DriveTask` 每个 Movement 自己的线程。&lt;br /&gt;
* DObject `Wait()` 阻塞；要并行多个就用 worker 线程。&lt;br /&gt;
* CycleGUI `Draw*` 调用从任意线程都安全。&lt;br /&gt;
&lt;br /&gt;
=== 错误处理三层 / 3-layer error model ===&lt;br /&gt;
# 插件级 `[UseLadderLogic(resume=true)]` —— 捕获并重启循环（默认）。&lt;br /&gt;
# 进程级 `Hedingben.ToastText` —— UI 弹窗。&lt;br /&gt;
# 看门狗级（Wawa）—— 进程崩了由 Wawa 重启。&lt;br /&gt;
&lt;br /&gt;
不要同时做三层；选合适的级别。&amp;lt;br&amp;gt;&lt;br /&gt;
Don't do all three — pick the right level.&lt;br /&gt;
&lt;br /&gt;
=== 版本助记词 / Version mnemonics ===&lt;br /&gt;
每次修改编译产物，AssemblyInformationalVersion 加一个单词（如 `1.4.0+kindling`）。便于在调试时区分两个数字相同的二进制。&lt;br /&gt;
&lt;br /&gt;
Each modification adds a single mnemonic word (e.g. `1.4.0+kindling`) to AssemblyInformationalVersion. Lets you disambiguate two binaries with the same number in the field.&lt;br /&gt;
&lt;br /&gt;
== 4. 测试 / Tests ==&lt;br /&gt;
* 单元测试稀疏；机器人代码本质上靠 ''集成测试''。&lt;br /&gt;
* `D:\src\Fundamentals\Test\` 覆盖 DObject + DLog（最关键）。&lt;br /&gt;
* 多数&amp;quot;测试&amp;quot;通过 `[MovementTest]` / `[IOObjectUtility]` 在 UI 上点按钮跑。&lt;br /&gt;
* 修改 `DObject` 后必跑 Fundamentals 单元测试 —— IPC bug 是灾难性的。&lt;br /&gt;
* 修改任一 `*Core` 后跑模拟车 SimpleComposer 集成测试。&lt;br /&gt;
&lt;br /&gt;
== 5. 发布 / Release ==&lt;br /&gt;
见 [[Special:MyLanguage/MDCS平台发布流程|MDCS平台发布流程]]。&lt;br /&gt;
&lt;br /&gt;
== 6. 关联文档 / See also ==&lt;br /&gt;
* [[Special:MyLanguage/操作指南|操作指南]] — 运维者视角&lt;br /&gt;
* [[Special:MyLanguage/插件开发指南|插件开发指南]] — 插件作者视角&lt;br /&gt;
* [[Special:MyLanguage/车体抽象原理|车体抽象原理]] — 三层模型&lt;br /&gt;
&lt;br /&gt;
[[Category:开发手册]]&lt;br /&gt;
[[Category:二次开发相关说明]]&lt;/div&gt;</summary>
		<author><name>Artheru</name></author>
	</entry>
</feed>