动态写出一个类然后加载执行

2021-03-04  本文已影响0人  价值投机168

这里使用到了MSIL指令。
可以使用C:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\bin\NETFX 4.5.1 Tools\ildasm.exe
文件来打开一个exe程序,然后看msil指令和代码的关系。

class Program
{
    static void Main(string[] args)
    {
        //动态创建的类类型  
        Type classType = DynamicCreateType();
        //调用有参数的构造函数  
        Type[] ciParamsTypes = new Type[] { typeof(string) };
        object[] ciParamsValues = new object[] { "Hello World" };
        ConstructorInfo ci = classType.GetConstructor(ciParamsTypes);
        object Vector = ci.Invoke(ciParamsValues);
        //调用方法  
        object[] methedParams = new object[] { "     methedParams" };
        Console.WriteLine(classType.InvokeMember("get_Field", BindingFlags.InvokeMethod, null, Vector, methedParams));
        Console.ReadKey();
    }

    //动态创建的动态类型  
    public static Type DynamicCreateType()
    {
        //动态创建程序集  
        AssemblyName DemoName = new AssemblyName("DynamicAssembly");
        AssemblyBuilder dynamicAssembly = AppDomain.CurrentDomain.DefineDynamicAssembly(DemoName, AssemblyBuilderAccess.RunAndSave);
        //动态创建模块  
        ModuleBuilder mb = dynamicAssembly.DefineDynamicModule(DemoName.Name, DemoName.Name + ".dll");
        //动态创建类MyClass  
        TypeBuilder tb = mb.DefineType("MyClass", TypeAttributes.Public);
        //动态创建字段  
        FieldBuilder fb = tb.DefineField("myField", typeof(System.String), FieldAttributes.Private);
        //动态创建构造函数  
        Type[] clorType = new Type[] { typeof(System.String) };
        ConstructorBuilder cb1 = tb.DefineConstructor(MethodAttributes.Public, CallingConventions.Standard, clorType);
        //生成指令  
        ILGenerator ilg = cb1.GetILGenerator();//生成 Microsoft 中间语言 (MSIL) 指令  
        ilg.Emit(OpCodes.Ldarg_0);
        ilg.Emit(OpCodes.Call, typeof(object).GetConstructor(Type.EmptyTypes));
        ilg.Emit(OpCodes.Ldarg_0);
        ilg.Emit(OpCodes.Ldarg_1);
        ilg.Emit(OpCodes.Stfld, fb);
        ilg.Emit(OpCodes.Ret);
        //动态创建属性  
        PropertyBuilder pb = tb.DefineProperty("MyProperty", PropertyAttributes.HasDefault, typeof(string), null);
        //动态创建方法  
        MethodAttributes getSetAttr = MethodAttributes.Public | MethodAttributes.SpecialName;
        MethodBuilder myMethod = tb.DefineMethod("get_Field", getSetAttr, typeof(string), new Type[] { typeof(string) });
        //生成指令  
        ILGenerator numberGetIL = myMethod.GetILGenerator();
        numberGetIL.Emit(OpCodes.Ldarg_0);
        numberGetIL.Emit(OpCodes.Ldfld, fb);
        numberGetIL.Emit(OpCodes.Ldarg_1);
        numberGetIL.Emit(OpCodes.Call, typeof(string).GetMethod("Concat", new Type[] { typeof(string), typeof(string) }));
        numberGetIL.Emit(OpCodes.Ret);
        //使用动态类创建类型  
        Type classType = tb.CreateType();
        //保存动态创建的程序集 (程序集将保存在程序目录下调试时就在Debug下)  
        dynamicAssembly.Save(DemoName.Name + ".dll");//也可以不保存
        //创建类  
        return classType;
    }
}
上一篇 下一篇

猜你喜欢

热点阅读