XFESystem C# 重构
工作分支:codex/csharp-system。解决方案:根目录的 XFESystem.slnx。用户已明确选择 C# 裸机内核,先实现 .NET 10 中间交互层,完整 .NET Framework 4.8 留待后续兼容阶段。
当前第五轮预览(Preview5)加入有限 CSS 布局与绘制、外部 classic 脚本/样式、DOM/browser 事件及真实 Monaco 核心编辑器。最终宿主 575 项(含 Browser184)、私有运行时 36 项、默认生产 Monaco11 项均通过;真实原生浏览器在 1 GiB / 4K / 200% 配置通过 8 组,同镜像 TCG 桌面 28 项通过。完整 WHPX51 组验收也已通过,全部最终范围以 Validation/CSharpBrowserPreview5-20261014-Final.json 为准。发行入口为 dist/XFESystem-CSharp-Preview5-Final-20261014.zip,Preview4 及此前包、日志和报告保留,不覆盖历史结果。
实现结构
| 项目 | 职责 |
|---|---|
Source/XFESystem.Kernel |
C# NativeAOT 内核入口、实际 framebuffer、键鼠适配及控制台平台接口 |
Source/XFESystem.Core |
X:\System、X:\Programs、X:\Users 命名空间与明确的 RAM-live 文件后端 |
Source/XFESystem.Desktop |
桌面、窗口拖动/缩放/最大化、任务栏与快捷键、文件浏览、文本编辑、图形终端、EDID 时序解析及脏帧调度 |
Source/XFESystem.Console |
增量 ANSI 终端、16/256/24 位色、光标与中文宽字符模型 |
Source/XFESystem.ConsoleDemo |
使用真正 XFEExtension.NetCore.XFEConsole 2.6.0 的共享演示业务 |
Source/XFESystem.ManagedRuntime |
读取真实托管 PE/IL 的受限解释执行层及 Console/XFEConsole 绑定 |
Source/XFESystem.Documents |
指定网站的 Markdig/HtmlSanitizer 管线与真实离线高亮、数学和流程图资源 |
Source/XFESystem.Browser |
AngleSharp HTML、Jint JavaScript、有限 DOM/事件循环、CSS 级联/布局/绘制与输入命中、受控外部资源及真实 Monaco core |
Samples |
独立编译的控制台、托管 IL 和浏览器组件示例 |
Tools/CSharpBoot |
Windows 原生构建、C# GPT/FAT32 镜像生成及独立 QEMU 验收 |
内核与用户界面使用 C#。当前复用固定版本 Cosmos 3.0.94 的 NativeAOT 构建/运行时 plugs、GC、底层驱动与 Limine 启动链,遵守 BSD-3-Clause 等依赖许可证;版本、源码归档 SHA256 与复用范围见 Tools/CSharpBoot/Dependencies.json。这是运行于裸机的托管系统原型,不使用 Linux 或 Windows 作为来宾内核。构建时的 linux-x64 RID 用于选择 System V/ELF 目标,宿主编译器运行于 Windows。
旧 Rust 源码已从当前工作树删除;Git 历史、旧验收记录及发行包保留,供历史回查。它们不证明新的 C# 内核具有相同的驱动、进程隔离或持久化能力。
.NET 兼容范围
XFESystem.Net10.ConsoleIL.v1 从独立编译的 net10.0 PE 程序读取入口、元数据与 IL,再解释执行。它不会借助 Windows 的 Assembly.Load 代跑程序。初期支持常量、Int32/Boolean 局部变量、有限整数运算、分支及显式白名单平台调用;支持 Console 文本、前背景颜色、重置与真实 XFEConsole.WriteLine 绑定。
解释器拒绝不支持的指令、签名、异常区、原生入口、P/Invoke、实例/泛型调用及未知平台接口。分支必须落在指令边界,执行步数、栈、字符串分配和终端输出均有上限。它仍是与内核同一地址空间的受限兼容组件,不具备独立进程隔离。
这不是完整 CoreCLR/.NET 10 安装环境,也不是 .NET Framework 4.8。 不能据此承诺任意现成 .NET 程序、WPF、WinForms、动态库、反射或 NuGet 包均能运行。完整运行时、独立用户地址空间和系统库兼容仍需要继续移植。
当前上游裸机异常展开还存在 finally 清理未完整执行的缺口,因此也不能声称具有完整 .NET 异常语义。网络句柄、浏览器同步锁和 XFEConsole 的全局重定向已针对本项目路径显式处理清理;第三方库内部的所有异常资源路径尚未全面保证。某次来宾 JavaScript 错误或超时后仍能继续运行,只证明该验收覆盖的恢复路径,不证明通用程序集的异常兼容或资源回收已完成。受限 IL 执行层直接拒绝异常处理区,不将它们默默当作已支持。
Preview5 另在项目私有运行时副本中修补已核查的 Jint 清理路径和 GC 精确扫描栈尾截断出口,保留原 GC 与精确扫描,不修改全局 NuGet。活动 catch 记录容量从原来的 64 提高到 4096,并在真正超限时明确停止,避免继续进入已无法记录的处理器。原生 81 层重抛及异常后的 4 项恢复检查已通过,另有 321 帧独立闭包/父对象在两次强制 GC 后逐层校验通过。Jint 复杂嵌套异常区等未覆盖清理形态仍明确排除;这些补丁不是通用 .NET 异常/GC 兼容声明。
两处分配失败防护在最终分配仍返回空指针时输出 XFE_RUNTIME_OOM 并停止整个来宾,避免把无效对象继续交给托管代码;这不是页面恢复或进程级 OOM 隔离。独立 512 MiB 来宾负测申请 1 GiB ArrayBuffer 后,验证该标记、无 CPU 页错误及 QMP 清理通过。
早期完整 AMD Monaco 的 512 MiB 压力错误、4K core 首次事件泵的 ArgumentNull(destinationArray) 和随后 OOM 日志均保留。最终 512 MiB 仍在编辑申请 46,368 字节时失败,Monaco512MiB 目标未达成;本轮真实 Monaco 使用 1 GiB 验收。2 GiB 对照、宿主成功及局部运行时回归不推广为 512 MiB 通过。
桌面、文件和网页
开机进入桌面。界面参考 XFEToolBox 的实际 XAML,采用浅色卡片、圆角窗口和 XFE 蓝色强调;Settings 可切换 Light/Dark、预设强调色和 #RRGGBB,Dark 延续深蓝终端配色。Files、Editor、Browser、Terminal、Settings 可从桌面入口打开;顶部系统栏已移除,标题右侧仅最小化与关闭按钮,双击标题仍最大化/还原,标题可拖动,右下角可调整大小。最大化与贴靠使用扣除底部任务栏后的工作区,任务栏用于切换、最小化和恢复窗口。抗锯齿标题图标与拖动/缩放入口提供悬停、按下及连续反向动画。
Win 打开开始菜单;Win+E、Win+D、Win+方向键提供文件管理器、显示桌面、贴靠及最大化/还原入口。Alt+Tab 按稳定的最近使用顺序切换窗口,Shift 反向,松开 Alt 结束该轮;Alt+F4 请求关闭。QEMU 必须获得输入焦点;宿主 Windows 是否截获组合键仍取决于虚拟机的键盘捕获状态。编辑器继续支持定位与方向键编辑、Delete/Backspace、Ctrl+S 保存及 F5 预览;有未保存修改时关闭会提示,Escape 明确丢弃并关闭。
箭头光标在交点加粗并向端点渐细,拖尾缩短,保留更明显的蓝色光晕;文本输入区和调整窗口大小时显示对应光标。9 个应用与文件类型图标由内置 Imagegen 分别生成,原始透明 PNG、提示词、来源和哈希保存在 assets/DesktopIcons,应用入口、任务栏、文件列表等使用同一套编译资产。文件窗口打开 .dll 或 .exe 时通过明确的托管程序集适配器交给受限 IL 执行层,不借用宿主启动程序。系统路径使用 Windows 风格及 PascalCase 的系统目录名,用户文件名称不强制改写。
当前工作区是 RAM live:文件存于内存,关机后消失,保存提示不会伪称已落盘。新 C# 持久化存储尚未取代旧 Rust ext2 实现。
Terminal 当前用于程序集输出和演示,尚未迁入旧 Shell 的命令解释、管道和后台作业;文件操作通过图形文件管理器完成。
浏览器组件真实解析 HTML、执行受限 JavaScript 并更新显式 DOM。Preview5 使用本项目的 CSS 级联、盒布局、display list、字体绘制和命中测试,呈现页面背景、文字、边框与实际编辑区;没有嵌入 Chromium、Edge、宿主 WebView 或通过宿主浏览器代跑页面。地址栏或 Ctrl+L 选择地址,输入替换后按 Enter 导航。HTML/DOM 解析使用 AngleSharp 1.7.1,脚本使用 Jint 4.11.0,第三方来源和许可证保留。
CSS 支持有界选择器匹配与级联、继承、盒模型、块/行内布局、单行 flex、absolute/fixed 定位、颜色/字体/溢出裁切,以及有限二维平移;不支持完整 Grid、flex 换行、任意变换或全部现代 CSS。有界解析缓存复用未变化的样式,style/link 内容、顺序或相关 DOM 变化时失效,动态修改仍参与重新布局,避免每帧重复解析全部 Monaco CSS。布局尺寸同时用于 getBoundingClientRect、输入命中和 Range/caret 位置,未支持的属性或选择器保留诊断。
外部 classic 脚本和样式经受控资源加载器读取,检查 MIME、字数/数量预算、重定向和协议降级;不支持原生 <script type="module">。DOM 支持实际 insertAdjacentHTML、insertAdjacentText、insertAdjacentElement,保持真实节点身份、位置和有界输入检查。事件包括实际 EventTarget 捕获/冒泡、once、preventDefault、鼠标、键盘、焦点和表单输入;定时器、requestAnimationFrame、microtask、MutationObserver/ResizeObserver 有界调度。Canvas2D 仅提供已实现的像素/文字子集,字体测量和光栅使用真实字体后端。仍无 Worker、JavaScript Fetch、WebAssembly 或完整浏览器 API,也无独立浏览器进程隔离。声明 CSP 时脚本采取保守拒绝策略,不能称为完整 CSP 实现。
about:Monaco 直接加载真正的 Monaco 0.52.2 editor.api 核心和官方 JavaScript Monarch 配置/语法。官方 ESM 用固定 esbuild 0.25.11 打包为 2,289,080 字节 classic IIFE,CSS 为 66,405 字节;浏览器程序集只嵌入这两个实际加载资源和许可证,以减少来宾常驻内存。原 AMD 资源和原 Manifest.json 不删改,留在源码及发行包的 BrowserAssets/Monaco/0.52.2/,不再整体占用内核常驻资源。assets/Browser/Monaco/0.52.2/Core/TransformationManifest.json 保存转换工具、归档、581 个实际输入和输出哈希,以及 MIT/第三方通知。模型 set/get、实际键盘输入编辑、行号、着色与鼠标移动文字位置采用真实 Monaco 对象。Worker 和完整 TypeScript 语言服务未纳入当前 profile;不以假的 monaco 对象替代未实现功能。
最终默认生产 new BrowserService() / about:Monaco 宿主探针在 build/BrowserProbe/Production-1791957404072/Result.json 通过 11 项,不使用资源替换或手工 create 回退,实际仅加载内嵌 core JS/CSS。真实初始画面、编辑后画面和 DOM 保留在同目录;宿主成功、耗时及内存测量不推广为其他 RAM 配置的裸机成功,来宾实测由 Preview5 发行报告单独绑定镜像、内核和源快照。此前生产探针和内存测量也保留为历史对照。
最终原生浏览器记录为 build/CSharpBoot/Proof-1791957529461874000/Result.json:1 GiB RAM、3840×2160 原生分辨率和独立 200% 倍率,8 组检查通过。实际 QEMU 输入新增第四行 xfenativeedit,Monaco 模型更新并产生 734 个新增文字墨迹像素。绑定内核 SHA256 为 4bea6cbfc43c19a5c50c8a9fa29fb409cd8b31df7c69e1ea67be4b8b85b7a159,镜像为 140021a13d1088253fd4b71cb3dc29d58200b66a4b54dc091d2dfce8a1004967;不能将其换用其他 RAM/profile 后沿用通过结论。
没有接入来宾网络适配器时,HTTP/HTTPS 导航明确失败;宿主 loopback HTTP/TLS 测试不构成裸机公网浏览通过。原生 HTTP 适配器仍须实际来宾联网验收后计入镜像。原生 HTTPS/TLS 尚未实现,HTTPS 明确拒绝,不跳过证书验证;不能据此保证任意公网网站兼容。
早期 C# 预览已实际通过 E1000e/QEMU NAT 的来宾 HTTP 验收,覆盖独立受控服务的随机 nonce、中文正文、JavaScript/DOM、分块传输、重定向、CSP 及错误/超时后恢复,记录为 Validation/CSharpPreview-20261014.json。Preview5 的新增 CSS、外部资源、事件和 Monaco 不借用该历史记录冒充本轮通过,详见本轮 Final 报告;两者均不等同于公网所有站点、DNS 全面验收或现代浏览器兼容。
Markdown 使用 XFEStudioWebSite 的实际渲染管线:Markdig 0.44.0 的 AdvancedExtensions 与 AutoIdentifiers,HtmlSanitizer 9.1.968-beta 使用网站相同的标签和属性清理配置。网站源码快照固定在 commit 95b43e16776aa648bca19d0060d01d3d2a52196e,导入不修改网站仓库,71 个资源的来源、变换与 SHA256 保留在 Documents 的快照/清单。完整网站风格 HTML、高亮、数学及 Mermaid 在独立宿主浏览器中验收;来宾预览目前只从同一清理后的 HTML 提取文本,不应把宿主 HTML 渲染结果当作来宾 CSS/数学/图表绘制完成。Markdown 中的 HTML 继续清理,普通文档不自动执行嵌入脚本;本地 JavaScript 预览使用新的上下文,不能访问已浏览页面的 DOM。
验收与启动
运行 dotnet sln XFESystem.slnx list 查看解决方案。使用项目固定 .NET SDK 与 Tools/CSharpBoot 中的脚本构建及启动;运行脚本使用独立镜像和固件变量,测试不打开宿主物理磁盘。Tools/TestCSharp.ps1 在独立输出目录顺序运行宿主测试,使用 -BrowserDom 追加离线浏览器资源验收;这些宿主测试与裸机启动测试分别保留记录。
验收记录严格区分:宿主 .NET 单元测试、宿主 NativeAOT、宿主 Edge DOM、实际 QEMU 裸机启动及来宾应用执行。真实来宾记录同时保存内核、镜像和程序 SHA256、串口成功标记、截图、QEMU 清理及完整镜像前后哈希。
当前 C# 裸机镜像的目标是 x86_64 QEMU q35、UEFI/Limine、一个 CPU;Preview5 Monaco 验收使用 1024 MiB RAM,启动器从绑定的通过记录读取 RAM。512 MiB 的桌面或轻量网页能力不构成 Monaco 编辑通过,历史 ARM64/i686 记录也不计作新内核双架构通过。启动链使用独立 C# UEFI 显示初始化助手,选择最高匹配几何,并对共享 framebuffer 的重复 GOP 记录去重。引导助手、内核和桌面的项目实现均为 C#。framebuffer 原生像素与界面倍率分开,4K 默认使用 200% 界面;完整 EDID 从固件交接数据读取,支持 base/CTA DTD 和 DisplayID 1.3 Type I,且只采用与当前分辨率匹配的时序。缺失或错误的扩展不提供刷新率,监视器范围描述符的上限也不冒充具体模式。当前默认拉丁字体为 Cascadia Mono,中文使用现有 Unifont 字形。
绘制调度优先采用驱动确认值,否则使用当前分辨率的 EDID 声明值;无法取得时序时采用明确的 60 Hz 绘制调度回退,并不将屏幕刷新率标记为 60 Hz。调度器使用 tick 精度,支持 239.760 Hz 等非整数频率,仅在画面变脏时提交;超期跳过陈旧期限,避免补画无意义的空帧。鼠标移动只恢复和提交光标区域,拖动、调整大小、滚动和编辑采用局部损伤,字体与图标缓存减少重复栅格化。滚动进一步按文字覆盖宽度收窄重绘列,未移动且不与损伤相交的光标无需重画。细节与诊断方式见 CSharpDesktopPreview2.md。
EDID 声明、绘制目标、实际绘制提交 FPS 和屏幕扫描刷新率分别记录。GOP 没有可靠的当前扫描时钟或 VSync 接口,因此这些改进不保证实体屏幕按最高刷新率同步输出;QEMU TCG、虚拟显示设备和 GTK 展示也可能限制可见帧率。当前仍是单输出桌面,完整 EDID/DPI 缩放、多显示器窗口管理和原生 GPU 模式/VSync 控制尚需移植。
实体 USB 键盘/鼠标、4K 多输出、完整账号权限、独立用户进程和持久化等旧功能尚需逐项迁移;QEMU 中的 PS/2 验证不能替代用户电脑上的 Corsair/xHCI 验证。双语界面切换、剪贴板与拖动选区、闪烁文本插入光标和旧版点击星辰效果也尚未全部迁入新桌面。局部刷新与缓存已经实现,具体性能仍须依据对应镜像和显示配置的实测记录判断,不能由目标刷新率推断。
专用 U 盘每版自动更新授权继续有效,目标身份和安全流程以根 AGENTS.md 为准;历史 256 KiB 故障不能当作设备当前状态,也不能只写镜像开头伪称成功。新 C# 原型尚未经过实体设备发行验收,是否写入本轮实体启动介质需依据实际目标核验和发行验收记录,不把 QEMU 或宿主结果冒充真机通过。