SharpCodePad 2.0.0.3
dotnet add package SharpCodePad --version 2.0.0.3
NuGet\Install-Package SharpCodePad -Version 2.0.0.3
<PackageReference Include="SharpCodePad" Version="2.0.0.3" />
<PackageVersion Include="SharpCodePad" Version="2.0.0.3" />
<PackageReference Include="SharpCodePad" />
paket add SharpCodePad --version 2.0.0.3
#r "nuget: SharpCodePad, 2.0.0.3"
#:package SharpCodePad@2.0.0.3
#addin nuget:?package=SharpCodePad&version=2.0.0.3
#tool nuget:?package=SharpCodePad&version=2.0.0.3
SharpCodePad
SharpCodePad 是一个面向 WPF 的 C# 代码编辑控件,基于 AvalonEdit,内置编译、运行、错误标记、签名帮助、悬停提示和变量展示能力。
适用场景:
- 在桌面工具里嵌入脚本编辑器
- 提供 C# 片段编辑、编译和导出 DLL 能力
- 需要对象浏览、运行输出和变量可视化
- 需要在宿主应用中扩展签名帮助、悬停提示或变量展示插件
功能概览
- 基于 AvalonEdit 的代码编辑与语法高亮
- C# 代码格式化、错误诊断、代码修复预览
- 编译并导出 DLL
- 导入外部 DLL 和命名空间
- 方法签名帮助
- 鼠标悬停信息提示
- 运行输出和变量查看
- VariableDisplayPlugin 变量展示插件机制
环境要求
- .NET Framework 4.8
- WPF
快速接入
- 引用
SharpCodePad.dll及其依赖。 - 在 XAML 中声明命名空间:
xmlns:scp="clr-namespace:SharpCodePad;assembly=SharpCodePad"
- 放入控件:
<scp:CodeEditor x:Name="CodeEditor" />
- 在窗口加载后初始化工程:
using SharpCodePad;
private async void Window_Loaded(object sender, RoutedEventArgs e)
{
await CodeEditor.InitEmptyProject();
}
最小示例
<Window
x:Class="LibraryDemo.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:scp="clr-namespace:SharpCodePad;assembly=SharpCodePad">
<Grid>
<scp:CodeEditor x:Name="CodeEditor" />
</Grid>
</Window>
using System.Windows;
using SharpCodePad;
namespace LibraryDemo;
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
Loaded += MainWindow_Loaded;
}
private async void MainWindow_Loaded(object sender, RoutedEventArgs e)
{
await CodeEditor.InitEmptyProject();
}
}
公共 API
下面只列宿主集成最常用、最稳定的公共 API。更细的内部类型不建议直接依赖。
CodeEditor
命名空间:SharpCodePad
继承:UserControl
主要属性
| 成员 | 说明 |
|---|---|
IsSaveMenuVisible |
控制顶部保存菜单是否显示。 |
IsExportMenuVisible |
控制顶部导出菜单是否显示。 |
IsRunSectionVisible |
控制运行按钮和对象浏览区域是否显示。 |
SignatureHelpProvider |
自定义签名帮助提供者,类型为 ISignatureHelpProvider。 |
HoverInfoProvider |
自定义悬停信息提供者,类型为 IHoverInfoProvider。 |
CurrentLicenseValidationResult |
当前授权校验结果,类型为 LicenseValidationResult。 |
Code |
当前编辑器中的代码文本,只读。 |
Logger |
可挂接自定义日志器,类型为 AsyncLoggerLib.Core.ICustomLogger。 |
主要方法
| 成员 | 说明 |
|---|---|
AddLogger(ICustomLogger logger) |
注册日志器,内部编译、加载等流程会写日志。 |
InitEmptyProject() |
初始化空工程。首次嵌入时通常先调用它。 |
LoadProject(string file) |
加载 .csp 工程文件。 |
SaveProject(string file) |
保存当前工程到 .csp 文件。 |
ImportDllAsync(string dllPath) |
导入外部 DLL,并刷新引用和命名空间列表。 |
ExportDllAsync(string outDllPath) |
编译当前代码并导出 DLL。 |
CompileAsync(string outDllPath) |
当前实现等价于 ExportDllAsync。 |
InitDocumentForFirstTime() |
预热 XML 文档和编译相关信息,适合首次加载时调用。 |
GetVariables() |
获取当前变量面板中的变量集合。 |
SetScriptVariable(string key, object value) |
为当前编辑器设置单个宿主变量。 |
SetScriptVariables(IDictionary<string, object> variables) |
批量设置当前编辑器的宿主变量。 |
TryGetScriptVariable(string key, out object value) |
尝试读取当前编辑器中的单个宿主变量。 |
GetScriptVariablesSnapshot() |
获取当前编辑器全部宿主变量快照。 |
ClearScriptVariables() |
清空当前编辑器中的全部宿主变量。 |
AddErrorMarker(int startLine, int startColumn, int endLine, int endColumn, DiagnosticModel message) |
在编辑器中添加错误标记。 |
ClearErrorMarkers() |
清空当前错误标记。 |
TriggerSignatureHelp() |
手动触发签名帮助弹窗。 |
HideAllPopups() |
关闭当前编辑器中的提示弹窗。 |
使用示例
private async Task ExportAsync()
{
await CodeEditor.ExportDllAsync(@"D:\Temp\Sample.dll");
}
private async Task OpenProjectAsync()
{
await CodeEditor.LoadProject(@"D:\Temp\Sample.csp");
}
宿主变量接口
CodeEditor 现在支持一套实例级的宿主变量系统。宿主可在运行前调用 SetScriptVariable / SetScriptVariables 写入变量,脚本运行时通过 ScriptVariables 静态类读取或回写;运行结束后,宿主再用 TryGetScriptVariable 或 GetScriptVariablesSnapshot 取回结果。
示例:
codeEditor.SetScriptVariables(new Dictionary<string, object>
{
["count"] = 12,
["name"] = "SharpCodePad",
["payload"] = new byte[] { 1, 2, 3 },
["config"] = new Dictionary<string, object>
{
["Threshold"] = 0.8,
["Enabled"] = true
}
});
编辑器中的用户代码可直接调用:
using SharpCodePad;
using System.Collections.Generic;
public class DemoRunner
{
public void Run()
{
int count = 0;
string name = "";
object configObject = null;
ScriptVariables.GetIntValue("count", ref count);
ScriptVariables.GetStringValue("name", ref name);
if (ScriptVariables.GetObjectValue("config", ref configObject)
&& configObject is Dictionary<string, object> config)
{
config["Threshold"].Dump("threshold");
}
ScriptVariables.SetStringValue("resultMessage", $"{name}:{count}");
ScriptVariables.SetIntArrayValue("resultNumbers", new[] { count, count + 1 });
}
}
宿主回读示例:
if (codeEditor.TryGetScriptVariable("resultMessage", out var resultMessage))
{
Console.WriteLine(resultMessage);
}
var snapshot = codeEditor.GetScriptVariablesSnapshot();
ProjectModel
命名空间:SharpCodePad
用途:描述 .csp 工程元数据。
| 成员 | 说明 |
|---|---|
Language |
当前工程语言,类型为 EPLanguage。 |
References |
引用程序集路径列表。 |
CodeFilePath |
代码文件路径。 |
Description |
工程描述。 |
Path |
工程文件路径。 |
SDKVersion |
目标 SDK 版本字符串,默认 Latest。 |
ISignatureHelpProvider
命名空间:SharpCodePad.View
用途:自定义方法签名帮助。
public interface ISignatureHelpProvider
{
Task<SignatureHelpInfo> GetSignatureHelpAsync(string code, int line, int column);
Task<SignatureInfo> GetSignatureInfoAsync(IMethodSymbol methodSymbol);
}
相关数据类型:
SignatureHelpInfoSignatureInfo
默认实现:
CSharpSignatureHelpProvider
IHoverInfoProvider
命名空间:SharpCodePad.Compile.Hover
用途:自定义悬停提示。
public interface IHoverInfoProvider
{
Task<HoverInfo> GetHoverInfoAsync(string code, int line, int column);
}
相关数据类型:
HoverInfoParameterInfoTypeParameterInfoExceptionInfo
默认实现:
CSharpHoverInfoProvider
工程文件格式
SharpCodePad 使用 .csp 保存工程元数据,内容本质上是 ProjectModel 的 JSON 序列化结果。
通常包含:
- 工程路径
- 代码文件路径
- 描述信息
- 引用 DLL 列表
- 语言与 SDK 配置
- 顶级语句相关配置
VariableDisplayPlugin 扩展
如果你需要自定义变量展示 UI,重点看 SharpCodePad.VariableDisplayPluginCore。
核心公开类型
| 类型 | 说明 |
|---|---|
DataBase |
所有可展示数据的基类,包含 Title、Content 和 DisplayControl。 |
Variable |
变量数据模型,继承自 DataBase。 |
Output |
输出数据模型,继承自 DataBase。 |
DisplayControlBase |
自定义展示控件基类。 |
DisplayControlBase 关键成员
| 成员 | 说明 |
|---|---|
Title |
展示标题。 |
Content |
展示内容。 |
DataType |
当前展示控件支持的数据类型。 |
DisplayType |
当前展示控件自身类型。 |
GetDisplayHost() |
返回实际用于承载显示内容的 ContentControl。 |
AddDisplayType<T>(T t, out string message) |
注册新的展示控件类型。 |
Get<T>(T obj) |
根据数据内容返回合适的展示控件。 |
插件开发步骤
- 新建一个类继承
DisplayControlBase。 - 指定
DataType和DisplayType。 - 返回自定义
UserControl作为展示宿主。 - 在启动时调用
DisplayControlBase.AddDisplayType(...)注册,或者放到DisplayPlugins目录走动态加载。
更详细的插件开发说明见:
授权相关
当前版本带授权校验。
宿主侧可通过下面两个入口感知授权状态:
CodeEditor.CurrentLicenseValidationResultLicenseConstants.DefaultLicenseFileName
LicenseValidationResult 主要字段:
| 成员 | 说明 |
|---|---|
IsValid |
是否校验通过。 |
Message |
校验结果说明。 |
ExpireUtc |
到期时间,永久授权时为空。 |
BindToMachine |
是否为机器绑定授权。 |
IsExpired |
当前是否已过期。 |
依赖
| 依赖 | 用途 |
|---|---|
| AvalonEdit | 编辑器基础能力 |
| Microsoft.CodeAnalysis.CSharp | 编译、诊断、格式化 |
| ICSharpCode.NRefactory | 补全相关能力 |
| CommunityToolkit.Mvvm | MVVM 基础设施 |
| Newtonsoft.Json | 工程文件与插件相关序列化 |
相关项目
SharpCodePad:WPF 控件本体SharpCodePad.CodeCompletion:代码补全SharpCodePad.Compile:编译与诊断SharpCodePad.VariableDisplayPluginCore:变量展示插件核心LibraryDemo:宿主接入示例
说明
- README 中的公共 API 基于当前仓库代码整理。
- 我这里假设宿主主要通过
CodeEditor作为集成入口,因此文档优先覆盖控件 API 和扩展接口,没有枚举全部公开类型。
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET Framework | net48 is compatible. net481 was computed. |
-
.NETFramework 4.8
- AsyncLoggerLib (>= 1.0.14)
- AvalonEdit (>= 6.3.1.120)
- CommunityToolkit.Mvvm (>= 8.4.0)
- Dirkster.AvalonDock (>= 4.72.1)
- Dirkster.AvalonDock.Themes.VS2013 (>= 4.72.1)
- ICSharpCode.NRefactory (>= 5.5.1)
- MahApps.Metro (>= 3.0.0-rc0516)
- MahApps.Metro.IconPacks (>= 5.1.0)
- Microsoft.Build.Utilities.Core (>= 17.14.28)
- Microsoft.CodeAnalysis.Analyzers (>= 3.11.0)
- Microsoft.CodeAnalysis.CSharp (>= 5.0.0)
- Microsoft.CodeAnalysis.CSharp.Scripting (>= 5.0.0)
- Microsoft.CodeAnalysis.CSharp.Workspaces (>= 5.0.0)
- Microsoft.CodeAnalysis.Workspaces.Common (>= 5.0.0)
- Microsoft.CSharp (>= 4.7.0)
- Microsoft.Xaml.Behaviors.Wpf (>= 1.1.135)
- Newtonsoft.Json (>= 13.0.3)
- SharpBoxesCore (>= 1.1.4.9)
- SharpBoxesCore.Wpf (>= 1.2.9)
- SharpCodePad.CodeCompletion (>= 2.0.0.3)
- SharpCodePad.Compile (>= 2.0.0.3)
- SharpCodePad.ScriptShared (>= 2.0.0.3)
- SharpCodePad.Shared (>= 2.0.0.3)
- SharpCodePad.VariableDisplayPluginCore (>= 2.0.0.3)
- System.Data.DataSetExtensions (>= 4.5.0)
- Wpf.InputDialogs (>= 1.0.0)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.