SharpCodePad 2.0.0.3

dotnet add package SharpCodePad --version 2.0.0.3
                    
NuGet\Install-Package SharpCodePad -Version 2.0.0.3
                    
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="SharpCodePad" Version="2.0.0.3" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="SharpCodePad" Version="2.0.0.3" />
                    
Directory.Packages.props
<PackageReference Include="SharpCodePad" />
                    
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 SharpCodePad --version 2.0.0.3
                    
#r "nuget: SharpCodePad, 2.0.0.3"
                    
#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 SharpCodePad@2.0.0.3
                    
#: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=SharpCodePad&version=2.0.0.3
                    
Install as a Cake Addin
#tool nuget:?package=SharpCodePad&version=2.0.0.3
                    
Install as a Cake Tool

SharpCodePad

SharpCodePad 是一个面向 WPF 的 C# 代码编辑控件,基于 AvalonEdit,内置编译、运行、错误标记、签名帮助、悬停提示和变量展示能力。

适用场景:

  • 在桌面工具里嵌入脚本编辑器
  • 提供 C# 片段编辑、编译和导出 DLL 能力
  • 需要对象浏览、运行输出和变量可视化
  • 需要在宿主应用中扩展签名帮助、悬停提示或变量展示插件

功能概览

  • 基于 AvalonEdit 的代码编辑与语法高亮
  • C# 代码格式化、错误诊断、代码修复预览
  • 编译并导出 DLL
  • 导入外部 DLL 和命名空间
  • 方法签名帮助
  • 鼠标悬停信息提示
  • 运行输出和变量查看
  • VariableDisplayPlugin 变量展示插件机制

环境要求

  • .NET Framework 4.8
  • WPF

快速接入

  1. 引用 SharpCodePad.dll 及其依赖。
  2. 在 XAML 中声明命名空间:
xmlns:scp="clr-namespace:SharpCodePad;assembly=SharpCodePad"
  1. 放入控件:
<scp:CodeEditor x:Name="CodeEditor" />
  1. 在窗口加载后初始化工程:
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 静态类读取或回写;运行结束后,宿主再用 TryGetScriptVariableGetScriptVariablesSnapshot 取回结果。

示例:

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);
}

相关数据类型:

  • SignatureHelpInfo
  • SignatureInfo

默认实现:

  • CSharpSignatureHelpProvider

IHoverInfoProvider

命名空间:SharpCodePad.Compile.Hover

用途:自定义悬停提示。

public interface IHoverInfoProvider
{
    Task<HoverInfo> GetHoverInfoAsync(string code, int line, int column);
}

相关数据类型:

  • HoverInfo
  • ParameterInfo
  • TypeParameterInfo
  • ExceptionInfo

默认实现:

  • CSharpHoverInfoProvider

工程文件格式

SharpCodePad 使用 .csp 保存工程元数据,内容本质上是 ProjectModel 的 JSON 序列化结果。

通常包含:

  • 工程路径
  • 代码文件路径
  • 描述信息
  • 引用 DLL 列表
  • 语言与 SDK 配置
  • 顶级语句相关配置

VariableDisplayPlugin 扩展

如果你需要自定义变量展示 UI,重点看 SharpCodePad.VariableDisplayPluginCore

核心公开类型

类型 说明
DataBase 所有可展示数据的基类,包含 TitleContentDisplayControl
Variable 变量数据模型,继承自 DataBase
Output 输出数据模型,继承自 DataBase
DisplayControlBase 自定义展示控件基类。

DisplayControlBase 关键成员

成员 说明
Title 展示标题。
Content 展示内容。
DataType 当前展示控件支持的数据类型。
DisplayType 当前展示控件自身类型。
GetDisplayHost() 返回实际用于承载显示内容的 ContentControl
AddDisplayType<T>(T t, out string message) 注册新的展示控件类型。
Get<T>(T obj) 根据数据内容返回合适的展示控件。

插件开发步骤

  1. 新建一个类继承 DisplayControlBase
  2. 指定 DataTypeDisplayType
  3. 返回自定义 UserControl 作为展示宿主。
  4. 在启动时调用 DisplayControlBase.AddDisplayType(...) 注册,或者放到 DisplayPlugins 目录走动态加载。

更详细的插件开发说明见:

授权相关

当前版本带授权校验。

宿主侧可通过下面两个入口感知授权状态:

  • CodeEditor.CurrentLicenseValidationResult
  • LicenseConstants.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 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
2.0.0.3 97 7/6/2026
2.0.0.2 263 12/4/2025
2.0.0.1 449 11/20/2025