CodeForge 1.4.0

dotnet add package CodeForge --version 1.4.0
                    
NuGet\Install-Package CodeForge -Version 1.4.0
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="CodeForge" Version="1.4.0" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="CodeForge" Version="1.4.0" />
                    
Directory.Packages.props
<PackageReference Include="CodeForge" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add CodeForge --version 1.4.0
                    
#r "nuget: CodeForge, 1.4.0"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package CodeForge@1.4.0
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=CodeForge&version=1.4.0
                    
Install as a Cake Addin
#tool nuget:?package=CodeForge&version=1.4.0
                    
Install as a Cake Tool

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 风格)。

C# 智能补全

⚡ 代码片段

内置 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 一个道理):

XAML 元素补全

hc: 前缀态只出 HC 组:

HandyControl 前缀

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 为补全必需,勿删

修改库后的流转(重要)

  1. CodeForge\CodeForge.csproj 改源码 → 编译

  2. 把新 CodeForge\bin\Debug\net48\CodeForge.dll 拷到各引用点:

    • Tools\CodeForge\libs\(本仓库 Demo 用)
    • 其他宿主工程各自的 libs\(如可视化设计器 DesignerKit)
  3. 重编各宿主

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 Compatible and additional computed target framework versions.
.NET Framework net48 is compatible.  net481 was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
1.4.0 98 10/2/2026
1.3.0 97 9/23/2026
1.1.0 115 9/4/2026
1.0.0 106 8/28/2026