CodeForge 1.4.0
dotnet add package CodeForge --version 1.4.0
NuGet\Install-Package CodeForge -Version 1.4.0
<PackageReference Include="CodeForge" Version="1.4.0" />
<PackageVersion Include="CodeForge" Version="1.4.0" />
<PackageReference Include="CodeForge" />
paket add CodeForge --version 1.4.0
#r "nuget: CodeForge, 1.4.0"
#:package CodeForge@1.4.0
#addin nuget:?package=CodeForge&version=1.4.0
#tool nuget:?package=CodeForge&version=1.4.0
CodeForge —— WPF C#/XAML 代码编辑器控件
面向 WPF 的 C# / XAML 代码编辑器控件库:Roslyn 智能补全、编译诊断波浪线、签名帮助、悬停提示、代码片段、折叠、鸟瞰图、搜索、亮暗主题、即时编译与脚本运行。单文件分发(全部依赖嵌入 DLL),宿主只需部署一个 CodeForge.dll。
所属:
TeamPLT工具链。本仓库是库本体 + 演示工程。
当前版本 1.4.0 —— 包随构建生成于本仓库
nuget\(CodeForge.1.4.0.nupkg+.snupkg),接入方式见下方「快速开始」。
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 验证过)
- .NET Framework 4.8(
net48,WPF) - 无需外网:NuGet 依赖仅 AvalonEdit + Roslyn 5.9.0 家族 + System.Composition(MEF)
解决方案结构(CodeForgeTools.sln)
Tools\CodeForge\
├─ CodeForge\ 库本体
│ ├─ Controls\ 编辑器控件(CodeEditorControl 多 partial:补全/搜索/主题/鸟瞰图/API)
│ │ └─ Completion\ 补全浮层、签名帮助、QuickInfo、图标
│ ├─ Core\ Roslyn 引擎(CodeCompletionService / CodeForgeEngine / MEF 宿主 / 依赖嵌入加载器)
│ └─ Models\ 补全条目、片段、签名模型
├─ CodeForgeDemo\ 演示(C# + XAML 两个示例窗口、引用管理器、编译运行)
├─ 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改源码 → 编译把新
CodeForge\bin\Debug\net48\CodeForge.dll拷到各引用点:Tools\CodeForge\libs\(本仓库 Demo 用)- 其他宿主工程各自的
libs\(如可视化设计器 DesignerKit)
重编各宿主
Demo 引用的是
libs里的静态 dll,改了库不拷贝 = 白改。
从源码构建
msbuild CodeForgeTools.sln -t:Restore,Build -p:Configuration=Debug
产物:CodeForge\bin\Debug\net48\CodeForge.dll(约 34MB,单文件自包含)、CodeForgeDemo\bin\...\CodeForgeDemo.exe。
相关项目
| 项目 | 位置 | 状态 |
|---|---|---|
| DesignerKit(可视化 XAML 表单设计器) | 独立工程 | 本控件作为其代码编辑层 |
| TeamPLT 平台 | TeamPLT 工具链仓库 |
生产环境 |
版本
当前 1.4.0(本轮为 XAML 模式闭环 + 补全浮层生命周期修复,nuget\ 下同名 nupkg/snupkg)。
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET Framework | net48 is compatible. net481 was computed. |
-
.NETFramework 4.8
- AvalonEdit (>= 6.3.0.90)
- 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.