完善主體資料,免費(fèi)贈(zèng)送VIP會(huì)員!
    * 主體類型
    * 企業(yè)名稱
    * 信用代碼
    * 所在行業(yè)
    * 企業(yè)規(guī)模
    * 所在職位
    * 姓名
    * 所在行業(yè)
    * 學(xué)歷
    * 工作性質(zhì)
    請(qǐng)先選擇行業(yè)
    您還可以選擇以下福利:
    行業(yè)福利,領(lǐng)完即止!

    下載app免費(fèi)領(lǐng)取會(huì)員

    NULL

    ad.jpg

    二次開發(fā)教程:Hello Emit

    發(fā)布于:2019-07-24 16:37:06

    網(wǎng)友投稿

    更多

    相關(guān)類如下,目標(biāo)是用Emit生成一個(gè)Writer類,并返回一個(gè)IWriter接口,使用接口調(diào)用


    public interface IWriter

    {

    void Write(string msg, string msg1);

    }

     

    public class Writer: IWriter

    {

    public  void Write(string msg,string msg1)

    {

    string ex = "ex";

    string str = msg + msg1 + ex;

    Console.WriteLine(str);

    }

    }

    實(shí)現(xiàn)如下:


    class Program

    {

    static void Main(string[] args)

    {

    IWriter writer = GetWriter();

    writer.Write("test1", "test2");

    Console.ReadLine();

    }

     

    private static IWriter GetWriter()

    {

    var assemblyName = new AssemblyName("DynamicAssembly");

     

    var assemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(assemblyName,

    AssemblyBuilderAccess.RunAndCollect);

    var moduleBuilder = assemblyBuilder.DefineDynamicModule(assemblyName.Name);

     

     

    var typeBuilder = moduleBuilder.DefineType("DefaultType", TypeAttributes.Public| TypeAttributes.Class);

     

    typeBuilder.AddInterfaceImplementation(typeof(IWriter));

     

    Type strType = typeof(string);

     

    var methodBuilder = typeBuilder.DefineMethod("Write", MethodAttributes.Public| MethodAttributes.Virtual,typeof(void),new Type[]{ strType , strType });

     

    methodBuilder.DefineParameter(1, ParameterAttributes.In, "msg");//Ldarg_1

     

    methodBuilder.DefineParameter(2, ParameterAttributes.In, "msg1");//Ldarg_1

     

    var iLGenerator = methodBuilder.GetILGenerator();

     

    iLGenerator.DeclareLocal(typeof(string));//Ldloc_0

    iLGenerator.DeclareLocal(typeof(string));//Ldloc_1

     

    ///https://docs.microsoft.com/en-us/dotnet/api/system.reflection.emit.opcodes.ldarg_1?view=netframework-4.7.2

     

    iLGenerator.Emit(OpCodes.Nop);

    iLGenerator.Emit(OpCodes.Ldstr,"ex");//Pushes a new object reference to a string literal stored in the metadata.

    iLGenerator.Emit(OpCodes.Stloc_0); // Pops the current value from the top of the evaluation stack and stores it in a the local variable list at index 0.

      // 上一句是將ex 放到棧里(?),這句從棧里取出來(lái)賦值給 Ldloc_0

    iLGenerator.Emit(OpCodes.Ldarg_1);

    iLGenerator.Emit(OpCodes.Ldarg_2);

    iLGenerator.Emit(OpCodes.Ldloc_0);

    iLGenerator.Emit(OpCodes.Call, GetStringConcat());//計(jì)算結(jié)果保存在了棧里(?)

     

    iLGenerator.Emit(OpCodes.Stloc_1);//將計(jì)算結(jié)果取出來(lái)賦值給 Ldloc_1

    iLGenerator.Emit(OpCodes.Ldloc_1);//將 Ldloc_1 放入棧

     

    iLGenerator.Emit(OpCodes.Call, GetWriteLine());

     

    iLGenerator.Emit(OpCodes.Nop);

    iLGenerator.Emit(OpCodes.Ret);

     

    var type = typeBuilder.CreateType();

     

    return (IWriter)Activator.CreateInstance(type);

    }

     

    private static MethodInfo GetStringConcat()

    {

    Type type = typeof(string);

    MethodInfo method =type.GetMethod("Concat", new Type[] {type, type, type});

    return method;

    }

    private static MethodInfo GetWriteLine()

    {

    Type type = typeof(Console);

    MethodInfo method = type.GetMethod("WriteLine", new Type[] {typeof(string) });

    return method;

    }

    }

    本文版權(quán)歸腿腿教學(xué)網(wǎng)及原創(chuàng)作者所有,未經(jīng)授權(quán),謝絕轉(zhuǎn)載。

    未標(biāo)題-1.jpg

    上一篇:二次開發(fā)教程:Emit DynamicMethod

    下一篇:二次開發(fā)教程:研究下WPF 數(shù)據(jù)binding 原理

    主站蜘蛛池模板: 国产一区风间由美在线观看| 少妇人妻精品一区二区三区| 亚洲综合一区二区精品导航 | 国产内射在线激情一区| 亚洲福利一区二区精品秒拍| 国产一区麻豆剧传媒果冻精品| 日韩一区二区三区射精| 人妻AV中文字幕一区二区三区 | 日韩最新视频一区二区三| 三上悠亚亚洲一区高清| 一区二区三区影院| 无码国产亚洲日韩国精品视频一区二区三区 | 在线视频精品一区| 无码人妻av一区二区三区蜜臀 | 国产精品视频无圣光一区| 日本精品无码一区二区三区久久久| 国产丝袜无码一区二区三区视频 | 亚洲欧洲日韩国产一区二区三区| 国产亚洲福利精品一区| 国模大尺度视频一区二区| 亚洲欧洲一区二区三区| 一区二区视频免费观看| 亚洲福利视频一区二区| 国产在线精品一区二区| 国产AV天堂无码一区二区三区| 一区二区传媒有限公司| 亚洲色一区二区三区四区| 亚洲av乱码一区二区三区| 黑人大战亚洲人精品一区| 国产精品xxxx国产喷水亚洲国产精品无码久久一区| 在线精品亚洲一区二区| 无码日本电影一区二区网站| 国产福利酱国产一区二区| 日本免费一区尤物| 一区二区三区在线观看中文字幕| 在线观看国产一区| 蜜臀AV免费一区二区三区| 日日摸夜夜添一区| 午夜在线视频一区二区三区| 天堂一区二区三区在线观看| 动漫精品一区二区三区3d|