元素码农
基础
UML建模
数据结构
算法
设计模式
网络
TCP/IP协议
HTTPS安全机制
WebSocket实时通信
数据库
sqlite
postgresql
clickhouse
后端
rust
go
java
php
mysql
redis
mongodb
etcd
nats
zincsearch
前端
浏览器
javascript
typescript
vue3
react
游戏
unity
unreal
C++
C#
Lua
App
android
ios
flutter
react-native
安全
Web安全
测试
软件测试
自动化测试 - Playwright
人工智能
Python
langChain
langGraph
运维
linux
docker
工具
git
svn
🌞
🌙
目录
▶
C#运行时环境
▶
CLR基础架构
CLR组成与生命周期
托管代码执行流程
应用程序域机制
▶
程序集体系
程序集元数据结构
强名称与版本控制
动态程序集生成
▶
类型系统
CTS核心规范
值类型与引用类型
类型加载与验证
▶
编译与执行
▶
编译过程
从源代码到IL
JIT编译原理
AOT编译机制
▶
执行引擎
方法表结构
栈帧与调用约定
尾调用优化
▶
IL深入解析
IL指令集解析
元数据表结构
调试符号处理
▶
内存管理
▶
垃圾回收
分代回收算法
终结器机制
GC句柄类型
▶
内存模型
托管堆结构
栈内存管理
大对象堆优化
▶
内存优化
内存碎片处理
ArrayPool机制
Span内存视图
发布时间:
2025-03-24 14:04
↑
☰
# C# Emit API 详解 ## 概述 Emit API是.NET运行时提供的动态代码生成工具,允许开发者在运行时创建和修改类型、方法等程序元素。本文将深入介绍Emit API的核心概念和实践应用。 ## 基础组件 ### 动态程序集 动态程序集是运行时生成的程序集,可以选择保存到磁盘或仅在内存中使用。 ```csharp // 创建动态程序集 AssemblyName assemblyName = new AssemblyName("DynamicAssembly"); AssemblyBuilder assemblyBuilder = AssemblyBuilder .DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Run); // 创建模块 ModuleBuilder moduleBuilder = assemblyBuilder .DefineDynamicModule("MainModule"); ``` ### 类型构建 TypeBuilder用于定义新的类型,包括类、接口、结构等。 ```csharp // 创建类型 TypeBuilder typeBuilder = moduleBuilder.DefineType( "DynamicType", TypeAttributes.Public | TypeAttributes.Class); // 添加字段 FieldBuilder fieldBuilder = typeBuilder.DefineField( "_field", typeof(string), FieldAttributes.Private); // 创建属性 PropertyBuilder propertyBuilder = typeBuilder.DefineProperty( "Property", PropertyAttributes.None, typeof(string), null); ``` ### IL指令生成 ILGenerator用于生成方法体的IL指令。 ```csharp // 创建方法 MethodBuilder methodBuilder = typeBuilder.DefineMethod( "Add", MethodAttributes.Public | MethodAttributes.Static, typeof(int), new Type[] { typeof(int), typeof(int) }); // 获取IL生成器 ILGenerator il = methodBuilder.GetILGenerator(); // 生成加法运算的IL代码 il.Emit(OpCodes.Ldarg_0); // 加载第一个参数 il.Emit(OpCodes.Ldarg_1); // 加载第二个参数 il.Emit(OpCodes.Add); // 执行加法运算 il.Emit(OpCodes.Ret); // 返回结果 ``` ## 高级特性 ### 构造函数生成 ```csharp // 定义构造函数 ConstructorBuilder ctorBuilder = typeBuilder.DefineConstructor( MethodAttributes.Public, CallingConventions.Standard, new Type[] { typeof(string) }); ILGenerator ctorIL = ctorBuilder.GetILGenerator(); // 调用基类构造函数 ctorIL.Emit(OpCodes.Ldarg_0); ctorIL.Emit(OpCodes.Call, typeof(object).GetConstructor(Type.EmptyTypes)); // 初始化字段 ctorIL.Emit(OpCodes.Ldarg_0); ctorIL.Emit(OpCodes.Ldarg_1); ctorIL.Emit(OpCodes.Stfld, fieldBuilder); ctorIL.Emit(OpCodes.Ret); ``` ### 泛型类型支持 ```csharp // 创建泛型类型 TypeBuilder genericTypeBuilder = moduleBuilder.DefineType( "GenericType", TypeAttributes.Public | TypeAttributes.Class); // 定义类型参数 GenericTypeParameterBuilder[] typeParams = genericTypeBuilder.DefineGenericParameters("T"); // 添加泛型约束 typeParams[0].SetGenericParameterAttributes( GenericParameterAttributes.ReferenceTypeConstraint); ``` ### 事件处理 ```csharp // 定义事件 EventBuilder eventBuilder = typeBuilder.DefineEvent( "OnEvent", EventAttributes.None, typeof(EventHandler)); // 创建事件字段 FieldBuilder eventField = typeBuilder.DefineField( "_event", typeof(EventHandler), FieldAttributes.Private); // 实现add和remove方法 MethodBuilder addMethod = typeBuilder.DefineMethod( "add_OnEvent", MethodAttributes.Public | MethodAttributes.SpecialName, null, new Type[] { typeof(EventHandler) }); ``` ## 性能优化 ### 缓存和重用 ```csharp // 缓存常用类型和方法 public static class TypeCache { public static readonly Type[] CommonTypes = { typeof(string), typeof(int), typeof(object) }; public static readonly MethodInfo[] CommonMethods = { typeof(Console).GetMethod("WriteLine", new[] { typeof(string) }) }; } ``` ### IL优化技巧 1. 减少局部变量使用 ```csharp // 优化前 il.DeclareLocal(typeof(int)); il.Emit(OpCodes.Stloc_0); il.Emit(OpCodes.Ldloc_0); // 优化后 il.Emit(OpCodes.Dup); // 复制栈顶值 ``` 2. 使用短格式指令 ```csharp // 优化前 il.Emit(OpCodes.Ldc_I4, 1); // 优化后 il.Emit(OpCodes.Ldc_I4_1); // 使用短格式加载常量1 ``` ## 最佳实践 ### 错误处理 ```csharp public class EmitHelper { public static Type CreateType(string typeName) { try { TypeBuilder typeBuilder = GetTypeBuilder(typeName); return typeBuilder.CreateType(); } catch (ArgumentException ex) { throw new EmitException("类型名称无效", ex); } catch (TypeLoadException ex) { throw new EmitException("类型创建失败", ex); } } } ``` ### 资源管理 ```csharp public class DynamicAssemblyScope : IDisposable { private AssemblyBuilder _assemblyBuilder; public DynamicAssemblyScope(string name) { var assemblyName = new AssemblyName(name); _assemblyBuilder = AssemblyBuilder.DefineDynamicAssembly( assemblyName, AssemblyBuilderAccess.Run); } public void Dispose() { // 清理资源 _assemblyBuilder = null; } } ``` ## 应用场景 ### 动态代理 ```csharp public class ProxyGenerator { public static T CreateProxy<T>(IInvocationHandler handler) where T : class { TypeBuilder typeBuilder = CreateTypeBuilder(typeof(T)); // 实现接口方法 foreach (var method in typeof(T).GetMethods()) { ImplementProxyMethod(typeBuilder, method, handler); } Type proxyType = typeBuilder.CreateType(); return (T)Activator.CreateInstance(proxyType, handler); } } ``` ### 热更新 ```csharp public class HotReloader { public static void UpdateMethod(Type type, string methodName, byte[] ilCode) { // 创建动态方法 DynamicMethod newMethod = new DynamicMethod( methodName, typeof(void), Type.EmptyTypes, type); // 更新IL代码 var il = newMethod.GetILGenerator(); il.Emit(OpCodes.Ldtoken, type); il.EmitCalli(OpCodes.Calli, CallingConventions.Standard, typeof(void), Type.EmptyTypes); } } ``` ## 总结 Emit API是.NET平台提供的强大动态代码生成工具,通过合理使用可以实现运行时类型生成、方法注入等高级功能。在使用过程中,需要注意以下几点: 1. 理解IL指令和类型系统 2. 注意性能优化和资源管理 3. 实现适当的错误处理 4. 遵循最佳实践指南 通过本文的介绍,开发者可以更好地理解和使用Emit API,为应用程序添加动态特性和扩展能力。