使用反射创建动态模块

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

    }
}

posted @   昕友软件开发  阅读(246)  评论(0编辑  收藏  举报
编辑推荐:
· 从二进制到误差:逐行拆解C语言浮点运算中的4008175468544之谜
· .NET制作智能桌面机器人:结合BotSharp智能体框架开发语音交互
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
阅读排行:
· C# 13 中的新增功能实操
· 万字长文详解Text-to-SQL
· Ollama本地部署大模型总结
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(4)
· 卧槽!C 语言宏定义原来可以玩出这些花样?高手必看!
欢迎访问我的开源项目:xyIM企业即时通讯
点击右上角即可分享
微信分享提示