Emit学习-基础篇-HelloWorld

按照业界的惯例,我们用一个最简单的例子——“Hello World”,来开始我

们的Emit之旅。例子的相关代码及注释如下:

using System;

using System.Collections.Generic;

using System.Text;

using System.Reflection.Emit;

namespace EmitExamples.HelloWorld

{

    class Program

    {

        /// <summary>

        /// 用来调用动态方法的委托

        /// </summary>

        private delegate void HelloWorldDelegate();

        static void Main(string[] args)

        {

            //定义一个名为HelloWorld的动态方法,没有返回值,没有参数

            DynamicMethod helloWorldMethod = new DynamicMethod("HelloWorld", null, null);

            //创建一个MSIL生成器,为动态方法生成代码

            ILGenerator helloWorldIL = helloWorldMethod.GetILGenerator();

            //将要输出的Hello World!字符创加载到堆栈上

            helloWorldIL.Emit(OpCodes.Ldstr, "Hello World!");

            //调用Console.WriteLine(string)方法输出Hello World!

            helloWorldIL.Emit(OpCodes.Call, typeof(Console).GetMethod("WriteLine", new Type[] { typeof(string) }));

            //方法结束,返回

            helloWorldIL.Emit(OpCodes.Ret);

            //完成动态方法的创建,并且获取一个可以执行该动态方法的委托

            HelloWorldDelegate HelloWorld = (HelloWorldDelegate)helloWorldMethod.CreateDelegate(typeof(HelloWorldDelegate));

            //执行动态方法,将在屏幕上打印Hello World!

            HelloWorld();

        }

    }

}

这里我们只是用这个例子让大家对Emit以及IL有个直观的了解,其中用到的方

法将在以后的章节中具体讲解

本文配套源码

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索helloworld
, 方法
, 动态
, emit
, #DynamicMethod
, ILGenerator
, World
, Hello
$emit
,以便于您获取更多的相关知识。

时间: 2024-10-16 22:21:36

Emit学习-基础篇-HelloWorld的相关文章

Emit学习-基础篇-基本概念介绍

之前的Hello World例子应该已经让我们对Emit有了一个模糊的了解,那么 Emit到底是什么样一个东西,他又能实现些什么功能呢?昨天查了点资料,大致 总结了下,由于才开始学习肯定有不完善的地方,希望大家能够批评指正. 1.什么是反射发出(Reflection Emit) Emit应该是属于反射中的一个比较高级的功能,说到反射大家应该都不陌生, 反射是在运行时发现对象的相关信息,并且执行这些对象(创建对象实例,执行 对象上的方法).这个功能是由.NET的System.Reflection命

Emit学习-基础篇-为动态类添加属性、构造函数、方法

我们通过一个计算A+B的动态类来演示如何为一个动态类添加属性.构造函数 .方法,以及在方法中使用类中定义的属性,按照惯例,我们先给出要实现的动 态类的C#代码,然后再针对C#代码给出相应的实现,代码如下: Add public class Add { private int _a = 0; public int A { get { return _a; } set { _a = value; } } private int _b = 0; public int B { get { return

Emit学习-基础篇-使用循环

今天我们来研究下用IL书写For循环和Foreach循环,在书中一直看到说使用 Foreach循环比普通的For循环来的好,这次正好趁机来看看他们的IL代码有何不同 .按照惯例,我们先给出要实现的类的C#代码,如下: class Iterator { public int ForMethod(int[] ints) { int sum = 0; for (int i = 0; i < ints.Length; i++) { sum += ints[i]; } return sum; } publ

Emit学习-实战篇-实现一个简单的AOP框架(一)

周末两天窝在家里,使用Emit做了一个非常简单的AOP框架,当做是这几周学习Emit后的一个实践.东西出来了,自然要和大家分享一下,虽然框架做的比较粗糙.简单,但是也已经能够看到一点AOP的雏形了,用来自己无聊玩玩还是可以的,当然要用到产品中去肯定还需要长期的完善啦. 说起AOP相信园子里很多高手都研究过,园子里好像也有自己的开源AOP项目,不过我时间有限没有细找,同时也发现园子研究AOP理论方面的文章很多,但是好像并没有完整的实现一个简单AOP框架的例子(当然我只是简单的找了一下,如有遗漏恳请

Emit学习-进阶篇-定义事件

之前在研究如何用Emit为动态类添加事件,本来以为会非常简单,但是却碰到 了许多的问题,有些问题在之前的答疑篇中已经提到了,并予以了解决,虽然有 些地方自己也不是很明白,但毕竟还是解决了,最后比较我写的IL代码,和系统 自动生成的,总有一些地方无法做到一致.特别是在为事件添加add和remove方法 时,碰到了许多问题,下面我将针对这些问题进行讲解.按照惯例,先给出要实 现的类的C#代码,方便反编译后对照着进行IL代码的书写,代码如下: Publisher public class Publis

Emit学习-答疑篇-Call和Callvirt的区别

之前在Emit的学习过程中,多次碰到了方法的调用,发现有时候是使用Call而 有时候是使用Callvirt,一直对这两者的区别不甚了解.然后就查阅了MSDN, MSDN中对这两者的解释为: l Call:调用由传递的方法说明符指示的方法: l Callvirt:对对象调用后期绑定方法,并且将返回值推送到计算堆栈上. 但是看了之后还是很不明白,我想可能是因为中文版的缘故吧.今天下午再次 看到了对Callvirt指令的解释,"对对象调用后期绑定方法",突然想到,这个 好像是指多态的意思吧?

Emit学习-实战篇-实现一个简单的AOP框架(三)

今天来介绍配置文件的定义和加载,先给出配置文件的内容,然后在详细介绍里面各节的含义,以及如何用程序加载配置文件,内容如下: 配置文件 <?xml version="1.0" encoding="utf-8" ?> <AOP> <Regeisty> <IPreProcess> <Aspect id="AddPreProcessLog" value="YQL.TestProject:YQ

Emit学习-实战篇-实现一个简单的AOP框架(二)

已经9点了,就不废话了,直接开讲,今天就简单的介绍下框架中用到的一些接口和属性.昨天把我们关注的切面分成了三类,现在给出这3个接口的定义: 接口定义 /// <summary> /// 在调用方法体前执行的处理接口 /// </summary> public interface IPreProcess { bool PreProcess(MethodContext methodContext); } /// <summary> /// 在调用方法体后执行的处理接口 //

Emit学习-答疑篇-值类型和引用类型在使用时的区别

今天下午兴冲冲的写完一段IL代码,用Reflector转成C#代码看了下,没有问 题,于是引用持久化到硬盘上的动态程序集,想要试一下其中的方法,但是运行 后却出现了System.AccessViolationException,提示信息为:"尝试读取或写入 受保护的内存.这通常指示其他内存已损坏.".看着错误提示一阵头大,新配 的电脑内存损坏是不太可能了,只好从自己的程序中找原因. 经过一阵调试,终于找到了引发异常的地方,是在构造函数中用 DateTime.Now.Millisecon