使用反射创建动态模块
using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Reflection;
using System.Reflection.Emit;
namespace Emit
{
public class CModuleBuilder
{
public static void Demo(System.Windows.Controls.TextBlock outputBlock)
{
// 创建应用程序域.
AppDomain myCurrentDomain = AppDomain.CurrentDomain;
AssemblyName myAssemblyName = new AssemblyName("TempAssembly");
// 创建动态程序集
AssemblyBuilder myAssemblyBuilder = myCurrentDomain.DefineDynamicAssembly
(myAssemblyName, AssemblyBuilderAccess.Run);
// 动态模块.
ModuleBuilder myModuleBuilder = myAssemblyBuilder.
DefineDynamicModule("TempModule");
// 定义类.
TypeBuilder myTypeBuilder = myModuleBuilder.DefineType
("TempClass", TypeAttributes.Public);
// 添加字段.
FieldBuilder greetingField = myTypeBuilder.DefineField("Greeting",
typeof(String), FieldAttributes.Public);
Type[] myMethodArgs = { typeof(String) };
// 动态类的方法.
MethodBuilder myMethod = myTypeBuilder.DefineMethod("MyMethod",
MethodAttributes.Public, CallingConventions.Standard, typeof(String), myMethodArgs);
// 方法的属性.
MethodInfo stringConcat = typeof(String).GetMethod("Concat",
BindingFlags.Static | BindingFlags.Public, Type.DefaultBinder,
new Type[] { typeof(String), typeof(String) },
null);
ILGenerator methodIL = myMethod.GetILGenerator();
methodIL.EmitWriteLine("In the method...");
methodIL.Emit(OpCodes.Ldarg_0);
methodIL.Emit(OpCodes.Ldarg_1);
methodIL.Emit(OpCodes.Stfld, greetingField);
methodIL.Emit(OpCodes.Ldstr, "Hello, ");
methodIL.Emit(OpCodes.Ldarg_1);
methodIL.Emit(OpCodes.Call, stringConcat);
methodIL.Emit(OpCodes.Ret);
Type myType = myTypeBuilder.CreateType();
MethodInfo myMethodInfo =
myType.GetMethod("MyMethod");
// Get the token used to identify the method within this module.
MethodToken myMethodToken =
myModuleBuilder.GetMethodToken(myMethodInfo);
outputBlock.Text += String.Format(
"Token used to identify the method of 'myType' within the module is {0:x}\n",
myMethodToken.Token);
object[] args = { "World!" };
object myObject = Activator.CreateInstance(myType);
outputBlock.Text += "Return value from MyMethod(\"World!\"): " +
myMethodInfo.Invoke(myObject, args);
}
}
}
目前维护的开源产品:https://gitee.com/475660
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从二进制到误差:逐行拆解C语言浮点运算中的4008175468544之谜
· .NET制作智能桌面机器人:结合BotSharp智能体框架开发语音交互
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· C# 13 中的新增功能实操
· 万字长文详解Text-to-SQL
· Ollama本地部署大模型总结
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(4)
· 卧槽!C 语言宏定义原来可以玩出这些花样?高手必看!