返回顶部
c

csharp-dotnetcore-natasha C#动态编译

This skill should be used when developers need to create dynamic C# features at runtime, including dynamic class generation, dynamic method creation, accessing private members through dynamic compilation, and managing compilation metadata strategies using the Natasha library.

作者: admin | 来源: ClawHub
源自
ClawHub
版本
V 3.3.0
安全检测
已通过
116
下载量
免费
免费
0
收藏
概述
安装方式
版本历史

csharp-dotnetcore-natasha

Natasha C# 动态编译技能

目的

该技能使开发者能够使用 Natasha 库在运行时动态生成和编译 C# 代码。它支持创建动态类、生成高性能委托、访问现有类型的私有成员、管理隔离编译上下文以及精确控制元数据加载策略。

何时使用此技能

在以下情况下使用此技能:

  • - 在运行时动态创建具有自定义属性和方法的类
  • 为计算代码生成高性能委托,避免反射开销
  • 从动态编译的代码访问现有类型的私有字段或方法
  • 构建需要运行时 C# 编译的表达式树或代码生成工具
  • 创建行为在运行时确定的可扩展插件系统
  • 通过动态方法生成优化性能关键代码路径
  • 需要精细控制元数据和使用代码范围(精简元数据模式)

如何使用此技能

先决条件

在项目中安装所需的 NuGet 包:

bash

核心编译包(基础编译单元)


dotnet add package DotNetCore.Natasha.CSharp.Compiler

域实现包(域实现包)

dotnet add package DotNetCore.Natasha.CSharp.Compiler.Domain

注意: DotNetCore.Natasha.CSharp.Compiler.Domain 继承自 DotNetCore.Natasha.Domain,并实现了 Natasha 编译器所需的编译绑定接口。所有包均以 DotNetCore. 为前缀。

框架支持: .NET Core 3.1+、.NET 5.0+、.NET 6.0+、.NET 7.0+、.NET 8.0+



三种编译模式

模式 1:智能模式 — 推荐用于大多数情况

智能模式自动合并默认域和当前域的元数据及 using 代码,并启用语义检查。

关键决策:内存程序集 vs 引用程序集

维度内存程序集引用程序集
元数据覆盖范围仅运行时类型完整元数据(包括未加载的程序集)
内存使用
较低 | 较高 |
| 启动速度 | 较快 | 较慢 |
| 推荐用于 | 大多数场景 | 需要完整元数据,不关心内存/大小 |

内存程序集初始化(内存程序集预热):
csharp
NatashaManagement
.GetInitializer()
.WithMemoryUsing() // 从内存程序集中提取 using 代码
.WithMemoryReference() // 从内存程序集中提取元数据
.Preheating();

引用程序集初始化(引用程序集预热):
csharp
NatashaManagement
.GetInitializer()
.WithRefUsing() // 从引用程序集文件中提取 using 代码
.WithRefReference() // 从引用程序集文件中提取元数据(最完整)
.Preheating();

经验法则: 如果用户不关心程序大小或内存消耗,使用 WithRefUsing().WithRefReference() — 引用程序集提供最完整的元数据覆盖。

使用文件缓存(文件缓存优化):

当项目稳定后(不再添加新依赖),启用 WithFileUsingCache() 将 using 代码写入 Natasha.Namespace.cache 文件。后续运行时 Natasha 从缓存读取,无需扫描程序集,显著加快启动速度:

csharp
NatashaManagement
.GetInitializer()
.WithMemoryUsing()
.WithMemoryReference()
.WithFileUsingCache() // 将 using 代码缓存到磁盘(依赖稳定时使用)
.Preheating();

智能模式下的使用:
csharp
AssemblyCSharpBuilder builder = new();
builder
.UseRandomLoadContext()
.UseSmartMode() // 合并当前域和默认域引用,启用语义检查
.Add(public class A { public int Value { get; set; } });

var assembly = builder.GetAssembly();

模式 2:精简模式(自管理元数据模式)

当需要精确控制哪些元数据参与编译时,使用精简模式。不使用全局预热元数据 — 通过 ConfigLoadContext 仅添加所需内容。

csharp
// 精简模式不需要全局 Preheating()
NatashaManagement.RegistDomainCreator();

AssemblyCSharpBuilder builder = new();
builder
.UseRandomLoadContext()
.UseSimpleMode() // 不合并引用,不进行语义检查
.ConfigLoadContext(ldc => ldc
.AddReferenceAndUsingCode(typeof(Math).Assembly) // 添加 Math 及其所有依赖
.AddReferenceAndUsingCode(typeof(MathF)) // 添加 MathF 的程序集
.AddReferenceAndUsingCode(typeof(object))) // 添加核心运行时
.Add(public static class A { public static double Calc(double v) { return Math.Floor(v/0.3); } });

var assembly = builder.GetAssembly();

精简模式的关键点:

  • - AddReferenceAndUsingCode(typeof(T)) — 加载 T 的程序集及其依赖程序集,并从中提取所有 using 代码
  • AddReferenceAndUsingCode(typeof(T).Assembly) — 相同,但接受 Assembly 对象
  • 在精简模式下,using 指令会自动从添加的程序集中收集,因此无需在脚本中显式编写(除非使用 WithoutCombineUsingCode)
  • 使用 AppendExceptUsings(System.IO, MyNamespace) 显式排除某些 using 命名空间,使其不被注入语法树

模式 3:自定义编译模式

当您提供自己的完整元数据集(例如来自 Basic.Reference.Assemblies NuGet 包)并自行处理 using 代码时使用。

csharp
// 您自行准备元数据集合,例如来自 Basic.Reference.Assemblies
IEnumerable myRefs = Basic.Reference.Assemblies.Net80.References.All;

AssemblyCSharpBuilder builder = new();
builder
.UseRandomDomain()
.WithSpecifiedReferences(myRefs) // 仅使用这些引用(不使用域引用)
.WithoutCombineUsingCode() // 不自动注入 using 代码
.WithReleaseCompile()
.Add(using System; using static System.Math; public static class A { public static int Test(int a, int b) { return a + b; } });
// 注意:使用 WithoutCombineUsingCode() 时,请在脚本中手动包含 using 指令

var assembly = builder.GetAssembly();

WithSpecifiedReferences 使构建器忽略默认域和当前域的元数据,仅使用显式提供的引用。



核心工作流

  1. 1. 初始化 Natasha(每个应用程序启动时执行一次)
- 根据需求选择智能模式或精简模式 - 参考:参见 references/initialization-patterns.md 了解所有支持的初始化方法
  1. 2. 创建 AssemblyCSharpBuilder
- 实例化 new AssemblyCSharpBuilder() - 配置加载上下文:使用 UseRandomLoadContext() 实现隔离,使用 UseNewLoadContext(name) 实现持久化 - 选择编译模式:UseSmartMode() / UseSimpleMode() / 自定义 - 设置编译级别:WithReleaseCompile() 或 WithDebugCompile()
  1. 3. 添加并编译代码
- 使用 .Add(csharpCode) 添加代码字符串 - 调用 .GetAssembly() 编译并获取程序集 - 或调用 .CompileWithoutAssembly() 编译但不注入域
  1. 4. 提取并使用生成的类型
- 使用 GetTypeFromShortName(ClassName) 检索编译后的类型 - 使用 GetDelegateFromShortName(ClassName, MethodName) 获取委托

三种核心使用模式

模式 1:动态类生成

csharp
// 初始化(应用程序启动时执行一次)
NatashaManagement
.GetInitializer()
.WithMemoryUsing()
.WithMemoryReference()
.Preheating();

AssemblyCSharpBuilder builder = new();
builder
.UseRandomLoadContext()
.UseSmartMode();

builder.Add(@
public class DynamicPerson {
public string Name { get; set; }
public int Age { get; set; }
public string Greet() => $Hello, Im {Name}, age {Age};
}
);

var assembly = builder.GetAssembly();
var personType = assembly.GetTypeFromShortName(DynamicPerson);
var instance = Activator.CreateInstance(personType);
personType.GetProperty(Name)!.SetValue(instance, Alice);
var greeting = personType.GetMethod(Greet)!.Invoke(instance, null);

模式 2:动态委托生成

csharp
AssemblyCSharpBuilder builder = new();
builder
.UseRandomLoadContext()
.UseSmartMode()
.Add(@
public class MathHelper {
public static int Add

标签

skill ai

通过对话安装

该技能支持在以下平台通过对话安装:

OpenClaw WorkBuddy QClaw Kimi Claude

方式一:安装 SkillHub 和技能

帮我安装 SkillHub 和 csharp-dotnetcore-natasha-1775936447 技能

方式二:设置 SkillHub 为优先技能安装源

设置 SkillHub 为我的优先技能安装源,然后帮我安装 csharp-dotnetcore-natasha-1775936447 技能

通过命令行安装

skillhub install csharp-dotnetcore-natasha-1775936447

下载

⬇ 下载 csharp-dotnetcore-natasha v3.3.0(免费)

文件大小: 62.78 KB | 发布时间: 2026-4-12 09:37

v3.3.0 最新 2026-4-12 09:37
csharp-dotnetcore-natasha 3.3.0

- Added an extensive SKILL.md with clear documentation on dynamic runtime C# code generation using Natasha.
- Details provided for three distinct compilation modes: Smart Mode, Simple Mode, and Custom Compilation Mode.
- Included setup instructions, code samples, and explanations for each usage scenario.
- Outlined prerequisites, supported frameworks (.NET Core 3.1+ through .NET 8.0+), and optimization strategies.
- Clarified common workflows, cache usage, and fine-grained metadata management options.

Archiver·手机版·闲社网·闲社论坛·羊毛社区· 多链控股集团有限公司 · 苏ICP备2025199260号-1

Powered by Discuz! X5.0   © 2024-2025 闲社网·线报更新论坛·羊毛分享社区·http://xianshe.com

p2p_official_large
返回顶部