CodeForge 1.5.0
dotnet add package CodeForge --version 1.5.0
NuGet\Install-Package CodeForge -Version 1.5.0
<PackageReference Include="CodeForge" Version="1.5.0" />
<PackageVersion Include="CodeForge" Version="1.5.0" />
<PackageReference Include="CodeForge" />
paket add CodeForge --version 1.5.0
#r "nuget: CodeForge, 1.5.0"
#:package CodeForge@1.5.0
#addin nuget:?package=CodeForge&version=1.5.0
#tool nuget:?package=CodeForge&version=1.5.0
CodeForge —— WPF C#/XAML 代码编辑器控件
面向 WPF 的 C# / XAML 代码编辑器控件库:Roslyn 智能补全、编译诊断波浪线、签名帮助、悬停提示、代码片段、折叠、鸟瞰图、搜索、亮暗主题、即时编译与脚本运行。单文件分发(全部依赖嵌入 DLL),宿主只需部署一个 CodeForge.dll。
所属:
TeamPLT工具链。本仓库是库本体 + 演示工程。
当前版本 1.5.0 —— 包随构建生成于本仓库
nuget\(CodeForge.1.5.0.nupkg+.snupkg,同一个包内含lib\net48与lib\net10.0-windows两个目标),接入方式见下方「快速开始」。
1.5.0 版本要点
采纳补全自动补 using + 双目标发布(net48 / net10.0-windows 同一个包):
- 采纳时自动补 using:补全列表里选了「引用集里有、但本文件没导入」的类型(如
Debugger)时, 自动在 using 区另起一行补上using System.Diagnostics;—— 不再出现「名字能选、选完却没成员、F5 报 CS0103」; 只插整行、不动任何已有代码行,一次 Ctrl+Z 可把「补全词 + 新 using」一起撤销; 脚本方法体模式(ScriptBodyControl)下 using 加到包装头ScriptUsings,可见正文不被写入 - 双目标:同一份源码出
net48与net10.0-windows两个资产的包 —— .NET Framework 宿主(如 DesignerKit)与 net10 宿主都能用

代码导航(dnSpy 式「转到定义 + 反编译」)
- 引用类型悬停显示完整
///注释:悬停引用 DLL 的方法(如Helper.Add)时, 弹窗显示该方法summary+ 每个参数的<param>说明(灰色斜体参数行),与脚本内符号同链路; 引用 DLL 旁挂.xml自动索引(XmlDocumentationProvider按 docId 查) - 转到定义:
F12/Ctrl+点击/ 右键菜单「转到定义」—— 源码符号 → 跳转文件对应行列(当前文档内直接滚动定位); 元数据符号(引用库)→ 打开反编译源码窗口 - 反编译转定义内容:引用程序集无源码时,用 ICSharpCode.Decompiler 7.2(dnSpy/ILSpy 同款内核) 反编译目标类型/成员并以只读编辑器展示(窗口标题带「反编译自 xxx」),内核程序集随单文件分发一并内嵌
AddReferenceFromBytes落盘归档:内存字节引用先落References\再挂旁挂.xml文档, 拿不到 xml 时提示「悬停无注释」,宿主可改ReferenceArchiveDirectory指向别处- Demo 演示:
CodeForgeDemo启动即自动引用References\DemoUserLibrary.dll(演示类库源码在SampleLibraries\DemoUserLibrary\,开<GenerateDocumentationFile>产 xml); 默认代码含引用库调用,悬停看注释、Ctrl+点击/F12 看反编译定义 - 冒烟测试:
NavSmokeTest\控制台工程直接调引擎 API 验证 QuickInfo 注释 / 转定义 / 反编译输出

1.4.1 版本要点
引用 DLL 的 /// 注释打通(悬停提示 / 签名帮助都能看到引用库里写的文档):
- 引用挂文档:添加引用时若 DLL 旁有同名
.xml文档(类库开<GenerateDocumentationFile>或 csc/doc的产物),自动挂给 Roslyn——悬停引用库的类型/方法即显示 summary,与脚本内符号同一条链路;此前只有脚本内///可见 - 签名帮助带参数说明:弹窗新增当前参数说明行(敲到哪个参数显示哪个参数的
<param>文本),源码与引用库都生效 InstallAndReferenceDll同步归档 xml:文档文件跟着 DLL 一起进References\,缺 xml 时状态消息会提示「悬停无注释」CompileToFile顺带产出 xml:脚本编译落盘时在旁边生成同名.xml,别的脚本引用它也能看到注释
1.4.0 版本要点
XAML 模式闭环与补全浮层稳定性(本轮补充,排在前面):
</闭合标签提示:打闭合标签时列出当前未闭合的标签(内层在前),直接补齐</Grid>- 嵌套标签补尾修复:内层新建同名元素(Grid 里再开 Grid)敲
>时不再漏补尾巴 —— 补尾判定改为全文深度配对,外层已配对的尾巴不再被误认作"轮得到新标签的那个" - 标签改名跟随防误伤:新敲到一半的标签(
<G等补全途中)不再参与闭合配对, 避免把外层真正的</Grid>改写成残缺的</G> - 补全浮层生命周期:宿主窗口失焦/最小化、编辑器卸载(关窗体/换页)时强制关闭全部浮层, 点选签名帮助里的重载项后也收层 —— 不再有浮层悬在外面或窗体关了还留残影
其它要点:
- 签名帮助「采纳重载」:只插入参数名(不再带类型),
out/ref修饰符自动保留 - XAML 模式(为 DesignerKit 预研):
ExternalCompletionProvider词表接管 +SetSyntaxHighlighting;>自动补闭合标签、Enter 闭合标签平齐换行、=直接出取值、改起始标签名闭合实时跟随(深度配对)、xmlns 前缀声明门禁 - 补全图标修正:Segoe MDL2 缺字形码位(类/接口/常量渲染成空框、方法为音符字形)替换为核对存在的码位
- 搜索条:自绘顶栏(命中计数/回绕/主题跟随宿主 HandyControl)、Ctrl+F、150ms 防抖
- 深滚动瞄词修正:滚动偏移补偿(长文档滚轮滚下去后悬停词检测错位)
- 线程安全:引擎文本同步顺序修正(先落工作区再更新指纹,失败自动重试)
- 引用最小化:移除 HandyControl 依赖(主题色按资源键跟随宿主)
- 修复:删字换词补全不恢复(残影浮层)、片段过滤词偏移、XAML 片段在成员访问位只敲文本
功能一览
C# 智能补全
Roslyn 驱动:类型/成员/关键字补全,顶部描述条显示 XML 文档摘要与完整签名,行右灰色签名小字 + 可访问性/静态/扩展方法特性图标(dnSpy 风格)。

⚡ 代码片段
内置 for / foreach / try / tryf / prop / cw 等片段(⚡ 标识),Tab 展开、占位符高亮、双 Tab 快捷展开。列表与 Roslyn 片段自动去重,成员访问位(sum.)同样可展开。

签名帮助(重载导航)
输入 ( / , 自动弹出参数签名,上下键切换重载,当前参数高亮;Enter/Tab 采纳重载时只插入参数名(out/ref 修饰符自动保留)。

搜索条(Ctrl+F)
自绘顶栏:增量高亮全部命中、命中计数(3/17)、回车/F3 下一个、Shift+Enter/Shift+F3 上一个、到头回绕、Esc 关闭。颜色跟随宿主 HandyControl 主题。

亮暗双主题 + 代码配色
EditorSkin 一键切亮/暗基调;ApplyCodeTheme 套用整套代码配色(背景/语法/行号/鸟瞰图联动)。

XAML 补全模式(为 DesignerKit 预研)
两行代码把编辑器切到 XAML 模式:
editor.SetSyntaxHighlighting("XML");
editor.ExternalCompletionProvider = myXamlProvider; // 词表接管,弹层/过滤/采纳复用 C# 管线
< 出元素(WPF + HandyControl 前缀组,文档声明了 xmlns:hc 才提示 hc: 项,跟 using 一个道理):

hc: 前缀态只出 HC 组:

XAML 模式专属行为(与 C# 补全刻意不同之处):
| 输入 | 行为 |
|---|---|
<Grid> |
自动补 </Grid>,光标钉在 >< 中间。嵌套里再开同名元素同样补;自闭合、已有闭合尾巴(头删重打场景)、属性值内一律不误补 |
| 标签内空格 | 出该元素属性表(特有属性 + 通用属性 + Grid.Row 等附加属性) |
Grid. |
出附加属性短名(Row/Column/RowSpan/ColumnSpan) |
</ |
提示当前未闭合的标签(内层在前),补齐 </Grid> |
Height= |
直接弹取值列表,选中写入 ="Auto"(含等号引号) |
| 回车 | 闭合标签与起始标签平齐换行,内容缩进一级 |
| 改起始标签名 | 闭合标签实时跟随(深度配对,多层嵌套不误伤);新敲一半未闭合的标签不参与配对 |
其他内置能力
- 即时编译与脚本运行:
Compile()/Run()/CompileAndRun(),诊断波浪线映射回编辑器 ///文档注释生成:敲三斜杠自动生成 XML 注释骨架- 代码折叠:大括号 /
#region折叠(200ms 防抖) - 鸟瞰图(Minimap):点击/拖动定位,可关
- 当前行高亮、C# 缩进策略、Ctrl+滚轮字号缩放(8~48)
- 编辑器皮肤/配色:
EditorSkin、SetCodeHighlightPalette、ApplyCodeTheme - 自制搜索条:
ShowSearch()公开方法,宿主工具栏可直接调
快速开始(宿主集成)
1. 引用
方式 A(NuGet 包):
dotnet add package CodeForge
方式 B(本地源分发,直接引用编译产物):
<ItemGroup>
<Reference Include="CodeForge">
<HintPath>..\libs\CodeForge.dll</HintPath>
<Private>true</Private>
</Reference>
</ItemGroup>
2. 初始化(一行)
// App 静态构造 / Startup 里:注册内嵌依赖的 AssemblyResolve 自举
CodeForge.CodeForgeRuntime.Initialize();
3. 使用
xmlns:cf="clr-namespace:CodeForge;assembly=CodeForge"
<cf:CodeEditorControl x:Name="Editor" />
Editor.Code = "Console.WriteLine(\"hi\");";
Editor.CompileRequested += (_, __) => { /* F6 */ };
部署:宿主输出目录放 CodeForge.dll 一个文件即可(Roslyn/AvalonEdit 等 30+ 依赖已全部嵌入,运行期自举)。若宿主自身使用 HandyControl,把自己的 HC.dll 一并部署(库本体不依赖 HC,搜索条主题色按资源键自动跟随宿主)。
4. 编译并运行
var compile = _editor.CompileCode(_editor.Code);
if (compile.Success)
{
var run = _editor.Run(compile.AssemblyBytes);
}
开发指南(本仓库内开发)
环境要求
- Visual Studio 2022+ / MSBuild(VS 18 Community 验证过)
- 双目标:
net48(.NET Framework 4.8,WPF)与net10.0-windows - 无需外网:NuGet 依赖为 AvalonEdit + Roslyn 5.9.0 家族 + System.Composition(MEF)+ ICSharpCode.Decompiler(反编译内核)
解决方案结构(CodeForgeTools.sln)
Tools\CodeForge\
├─ CodeForge\ 库本体
│ ├─ Controls\ 编辑器控件(CodeEditorControl 多 partial:补全/搜索/主题/鸟瞰图/API)
│ │ └─ Completion\ 补全浮层、签名帮助、QuickInfo、图标
│ ├─ Core\ Roslyn 引擎(CodeCompletionService / CodeForgeEngine / MEF 宿主 / 依赖嵌入加载器)
│ └─ Models\ 补全条目、片段、签名模型
├─ CodeForgeDemo\ 演示(C# + XAML 两个示例窗口、引用管理器、编译运行、自动引用演示类库)
├─ SampleLibraries\ 演示类库源码(DemoUserLibrary:带完整 /// 文档,产物落 CodeForgeDemo\References\)
├─ NavSmokeTest\ 引擎 API 冒烟测试(QuickInfo 注释 / 转定义 / 反编译)
├─ libs\ CodeForge.dll 产物(Demo 引用此处的 dll —— 无项目引用,需入库)
├─ docs\images\ README 截图
└─ nuget\ 构建产物(nupkg/snupkg,已 gitignore,不入库)
关键设计
| 机制 | 说明 |
|---|---|
| 单文件分发 | 构建时把全部 CopyLocal 依赖嵌入为资源(CodeForge.deps.*.dll),运行期 EmbeddedDependencyLoader 经 AssemblyResolve 自举;exe 旁有物理 dll 则探测先行 |
| MEF 进程级共享 | RoslynMefHostFactory 组合一次全进程复用(多编辑器不重复付组合成本) |
| XAML 模式扩展点 | ExternalCompletionProvider(词表接管,绕开 Roslyn)+ SetSyntaxHighlighting;XAML 专属行为(自动闭合、Enter 平齐、= 取值、改名跟随)在 provider 非空时生效 |
| 引用最小化 | 库不依赖 HandyControl(主题色按资源键字符串跟随宿主);Roslyn 家族与 MEF 为补全必需,勿删 |
修改库后的流转(重要)
CodeForge\CodeForge.csproj改源码 → 编译(-c Debug -p:Platform=x64)把新
CodeForge\bin\x64\Debug\net10.0-windows\CodeForge.dll拷到各引用点:Tools\CodeForge\libs\(本仓库 Demo 用)- 其他宿主工程各自的
libs\(如可视化设计器 DesignerKit) - net48 宿主用
bin\x64\Debug\net48\CodeForge.dll
重编各宿主
Demo 引用的是
libs里的静态 dll,改了库不拷贝 = 白改。
从源码构建
msbuild CodeForgeTools.sln -t:Restore,Build -p:Configuration=Debug
产物:CodeForge\bin\x64\Release\net48\CodeForge.dll(约 38MB)与 ...\net10.0-windows\CodeForge.dll(约 33MB),均为单文件自包含;nuget\CodeForge.1.5.0.nupkg 内含两个目标;CodeForgeDemo\bin\...\CodeForgeDemo.exe。
相关项目
| 项目 | 位置 | 状态 |
|---|---|---|
| DesignerKit(可视化 XAML 表单设计器) | 独立工程 | 本控件作为其代码编辑层 |
| TeamPLT 平台 | TeamPLT 工具链仓库 |
生产环境 |
版本
当前 1.5.0(双目标 net48 / net10.0-windows 同一个包;含「采纳补全自动补 using」与代码导航:引用类型悬停注释 + 转到定义 + 反编译。nuget\ 下同名 nupkg/snupkg)。
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net10.0-windows7.0 is compatible. |
| .NET Framework | net48 is compatible. net481 was computed. |
-
.NETFramework 4.8
- AvalonEdit (>= 6.3.0.90)
- ICSharpCode.Decompiler (>= 7.2.1.6856)
- Microsoft.CodeAnalysis (>= 5.9.0)
- Microsoft.CodeAnalysis.CSharp (>= 5.9.0)
- Microsoft.CodeAnalysis.CSharp.Features (>= 5.9.0)
- Microsoft.CodeAnalysis.CSharp.Workspaces (>= 5.9.0)
- Microsoft.CodeAnalysis.Features (>= 5.9.0)
- Microsoft.CodeAnalysis.Workspaces.Common (>= 5.9.0)
- System.Composition (>= 10.0.12)
- System.Composition.Hosting (>= 10.0.12)
-
net10.0-windows7.0
- AvalonEdit (>= 6.3.0.90)
- ICSharpCode.Decompiler (>= 7.2.1.6856)
- Microsoft.CodeAnalysis (>= 5.9.0)
- Microsoft.CodeAnalysis.CSharp (>= 5.9.0)
- Microsoft.CodeAnalysis.CSharp.Features (>= 5.9.0)
- Microsoft.CodeAnalysis.CSharp.Workspaces (>= 5.9.0)
- Microsoft.CodeAnalysis.Features (>= 5.9.0)
- Microsoft.CodeAnalysis.Workspaces.Common (>= 5.9.0)
- System.Composition (>= 10.0.12)
- System.Composition.Hosting (>= 10.0.12)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.