91手机视频在线-91手机视频在线观看-91手机在线-91手机在线播放-91手机在线观看

完善主體資料,免費贈送VIP會員!
* 主體類型
* 企業名稱
* 信用代碼
* 所在行業
* 企業規模
* 所在職位
* 姓名
* 所在行業
* 學歷
* 工作性質
請先選擇行業
您還可以選擇以下福利:
行業福利,領完即止!

下載app免費領取會員

NULL

ad.jpg

二次開發教程:Hello Emit

發布于:2019-07-24 16:37:06

網友投稿

更多

相關類如下,目標是用Emit生成一個Writer類,并返回一個IWriter接口,使用接口調用


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

}

}

實現如下:


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 放到棧里(?),這句從棧里取出來賦值給 Ldloc_0

iLGenerator.Emit(OpCodes.Ldarg_1);

iLGenerator.Emit(OpCodes.Ldarg_2);

iLGenerator.Emit(OpCodes.Ldloc_0);

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

 

iLGenerator.Emit(OpCodes.Stloc_1);//將計算結果取出來賦值給 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;

}

}

本文版權歸腿腿教學網及原創作者所有,未經授權,謝絕轉載。

未標題-1.jpg

上一篇:二次開發教程:Emit DynamicMethod

下一篇:二次開發教程:研究下WPF 數據binding 原理

主站蜘蛛池模板: 黄色大片播放 | 黄在线看| 9久re在线观看视频精品 | 久久精品日本免费线 | 日本高清动作片www欧美 | 国内精品自产拍在线观看91 | 亚洲国产99在线精品一区二区 | 亚洲欧美精选 | avav国产| 国产护士恋夜各种姿势视频 | 国产精品国产亚洲精品不卡 | 婷婷99视频精品全部在线观看 | 中文字幕不卡在线高清 | 久久精品亚洲一区二区三区浴池 | 欧美日本不卡 | 久久99国产精品免费观看 | 日本黄色片在线免费观看 | 欧美一级高清在线观看 | 在线观看日本污污ww网站 | 午夜性刺激小说 | 国产一区免费视频 | 青草国产在线视频 | 欧美视频一区 | 国产99精品一区二区三区免费 | 免费视频爱爱太爽了 | 日本99视频 | 99久久这里只精品国产免费 | 青青草国产一区二区三区 | 国产一区二区视频免费 | 特黄一级真人毛片 | 色婷婷免费视频 | 韩国一级特黄毛片大 | 精品国产免费第一区二区三区日韩 | 91三级在线观看 | 性欧美高清理论片 | 在线视频 91 | avav国产 | 99久久国产综合精品麻豆 | 91久久精一区二区三区大全 | 欧美日韩 国产区 在线观看 | 亚洲国产精品一区二区第一页 |