反射发出

反射用来获取程序集及其相关信息。

反射发出是在运行时动态构造元数据和MSIL语言还可生产PE文件。

使用反射发出的步骤基本是固定的 ,用HELLO  WORD 做开始

        public void BuildeMthod()
        {
            //1.构建程序集
            AppDomain myDomain = AppDomain.CurrentDomain;
            AssemblyName asmName = new AssemblyName();
            asmName.Name = "MyDom";
            AssemblyBuilder myAsmBuilder = myDomain.DefineDynamicAssembly(
                                           asmName,
                                           AssemblyBuilderAccess.RunAndSave);

            //模块和类型
            ModuleBuilder myModule = myAsmBuilder.DefineDynamicModule("MyDom",
                                                                "MyDom.dll");
            //类型
            TypeBuilder myTypeBld = myModule.DefineType("MyDomType",
                                                        TypeAttributes.Public);

            //方法
            MethodBuilder myMthdBld = myTypeBld.DefineMethod(
                                           "SampleC",
                                           MethodAttributes.Public |
                                           MethodAttributes.Static
                                           );

            //生成MSIL语言
            ILGenerator ILout = myMthdBld.GetILGenerator();
            ILout.Emit(OpCodes.Nop);
            ILout.Emit(OpCodes.Ldstr, "Hello World!");
            MethodInfo mi = typeof(System.Console).GetMethod("Write", new Type[] { typeof(string) });
            ILout.Emit(OpCodes.Call,mi);
            ILout.Emit(OpCodes.Nop);
            ILout.Emit(OpCodes.Ret);

            Type myType = myTypeBld.CreateType();

            myAsmBuilder.Save("MyDom.dll");

            MethodInfo myMthdInfo = myType.GetMethod("SampleC");
            myMthdInfo.Invoke(myType,null);

        }
时间: 2025-01-05 09:20:20

反射发出的相关文章

转鹤冲天兄反射性能比较

替代反射调用的几种方式及性能测试 2013-03-31 17:25 by 鹤冲天, 6065 阅读, 21 评论, 收藏, 编辑 园子里和这个话题的相关文章比较多,本文是旧话重提,外加个小的总结.主要因为近期看到很多同事.朋友都已经使用 VS2012 进行 .NET 4.5 开发了,却还在大量使用反射,不知道用新的方式.或有所了解,但又害怕性能不好不敢大胆去用. 本文以如下类为例: public class MyMath { public int Add(int a, int b) { retu

一个简易的反射类库NMSReflector

转自:http://blog.csdn.net/lanx_fly/article/details/53914338 背景简介 以前看过一些代码,是简单的读取SqlReader然后赋值给Model,我不是不赞同这种做法,只是看到大篇幅的赋值操作真的有点浪费时间和精力,尤其是一些老项目居多.我看到的还好,多的也就60多个字段且不用其他ORM,如果涉及到变更的话,那么对维护人员来说可能不仅仅是眼力活甚至还是....体力活.另外就是表格的操作,因为鄙人之前也是写过类似的项目,列名对应着Model属性名,

如何:使用反射将委托挂钩

如何:使用反射将委托挂钩 .NET Framework 4.5 其他版本 当使用反射来加载和运行程序集时,不能使用 C# += 运算符或 Visual Basic AddHandler 语句等语言功能将事件挂钩. 以下过程显示如何通过用反射获取所需的全部类型将现有方法挂钩到事件,以及如何使用反射发出来创建动态方法并将其挂钩到事件.  说明 有关事件处理委托的其他挂钩方式,请参见 EventInfo 类的 AddEventHandler 方法的代码示例. 使用反射挂钩委托 加载包含引发事件的类型的

JAVA 一顿乱猜

最近把JAVA 语言规范 稍微的浏览下,本着毫不负责任的态度,对一些模式进行推测性猜测.后期可能会对猜测做验证. JAVA 和C#的语言和设计思想高度相似度. 1.JAVA 字节码与IL语言 2.JVM 与CLR AOP与DI 一..net的AOP与DI的主流方式 是动态注入即使 诸如 反射发出 EMIT .MEF  等方式 构建对象进行注入. 猜测: JAVA 也可以通过动态构建类来注入 二..NET 通过修改已经生成的程序集的MSIL,自定义msbuild 进行重新构建,实现静态注入 猜测:

执行Sql语句,包括存储过程,可以动态生成返回实体

1 /// <summary> 2 /// 执行Sql语句 3 /// </summary> 4 public static class DatabaseExtend 5 { 6 /// <summary> 7 /// 执行任何SQL语句,通用所有的数据库(SQLServer,MySql,Oracle等),利用EMIT快速反射,得到动态类型实体,支持参数查询,防止sql注入. Created by ZhangQC 8 /// </summary> 9 ///

.net 开源组件推荐 之 StackExchange

已经两年没更新过博客了!!! StackExchange,地址:https://github.com/StackExchange,开源的这些项目都是在StackOverflow线上使用的. 说起StackOverflow,扯两句闲话,所有码农应该都不陌生,特别是对.net的开发者,它可能是应用了.net里仅存的不多还能拿的出手的知名网站了.MySpace的远去,某东的彻底转身,就连以前的老东家某二流IM,很早的时候也是转向了Java.感觉用.net很少技术氛围很好的公司,其实老东家的技术氛围还是

C# 2.0 新特性(上)

C# 2.0新特性 1. 泛型 1.1 泛型介绍 泛型类和泛型方法同时具备可重用性.类型安全和效率,这是非泛型类和非泛型方法无法具备的.泛型通常用在集合和在集合上运行的方法中..NET Framework 2.0 版类库提供一个新的命名空间 System.Collections.Generic,其中包含几个新的基于泛型的集合类.建议面向 2.0 版的所有应用程序都使用新的泛型集合类,而不要使用旧的非泛型集合类,如 ArrayList.有关更多信息,请参见 .NET Framework 类库中的泛

.NET 新标准介绍

本文介绍如何使用 .NET 标准,更容易地实现向 .NET Core 迁移.文中会讨论计划包含的 APIs,跨构架兼容性如何工作以及这对 .NET Core 意味着什么. 如果你对细节感兴趣,这篇文章正是为你准备的:如果你没有那么多时间或者对细节并不感兴趣,你可以仅仅只阅读 TL;DR 章节. TL;DR 对于跨平台的 .NET 开发者来说,.NET 标准解决了编码共享的问题..NET 标准带来了所有你所需要的和期待的,跨环境的 APIs:桌面应用,移动应用/游戏和云服务. .NET 标准是一组

AOP 实现

软件中 与业务无关的公共模块如日志系统,权限验证 等等会大量的存在于系统方法里.AOP 目的是分离这部分公共模块与业务逻辑之间的关系. 先定义业务接口: public interface IVehInfo { int GetVehicleCount(); } public class Car : IVehInfo { public int GetVehicleCount() { Console.Write("Log Begian");//记录日志 var i = 100; Consol