参考链接:

https://pieterderycke.wordpress.com/tag/reflection-emit/

http://www.moon-soft.com/doc/23252.htm

http://www.codeproject.com/Articles/18677/Dynamic-Assemblies-using-Reflection-Emit-Part-II-o

示例一:

  public interface IProxy
{
void GetProxyInstance();
} public static class Util
{
public static void Before(string message)
{
Console.WriteLine( $"dynamic message: {message}" );
}
} public class TypeCreator
{
private readonly Type _targetType; public TypeCreator(Type targetType)
{
this._targetType = targetType;
} public Type Build()
{
var currentAppDomain = AppDomain.CurrentDomain;
var assemblyName = new AssemblyName {
Name = "_Aop_Assembly_" + this._targetType.Name
};
var assemblyBuilder = currentAppDomain.DefineDynamicAssembly( assemblyName, AssemblyBuilderAccess.Run );
var moduleBuilder = assemblyBuilder.DefineDynamicModule( "_Aop_Module_" + this._targetType.Name );
var implTypeName = "_Impl_" + this._targetType.Name;
var implTypeAttribute = TypeAttributes.Class | TypeAttributes.Public;
Type implTypeParent;
Type[] implTypeInterfaces; if( this._targetType.IsInterface )
{
implTypeParent = null;
implTypeInterfaces = new[] {
this._targetType
};
}
else
{
implTypeParent = this._targetType;
implTypeInterfaces = new Type[];
} var typeBuilder = moduleBuilder.DefineType( implTypeName, implTypeAttribute, implTypeParent, implTypeInterfaces );
var implTargetMethods = this._targetType.GetMethods(); foreach( var implTargetMethod in implTargetMethods )
{
if( implTargetMethod.IsVirtual )
{
var parameters = implTargetMethod.GetParameters();
var parameterTypes = new Type[parameters.Length]; for( var i = ; i < parameters.Length; i++ )
{
parameterTypes[i] = parameters[i].ParameterType;
} var methodBuilder = typeBuilder.DefineMethod( implTargetMethod.Name, MethodAttributes.Public | MethodAttributes.Virtual, implTargetMethod.ReturnType, parameterTypes ); var ilGen = methodBuilder.GetILGenerator(); ilGen.Emit( OpCodes.Ldstr, "Before Execute " + this._targetType.Name + ";" );
ilGen.Emit( OpCodes.Call, typeof( Util ).GetMethod( "Before", new Type[] {
typeof( string )
} ) );
ilGen.Emit( OpCodes.Ret );
}
} return typeBuilder.CreateType();
}
} // 调用示例:
var tc = new TypeCreator( typeof( IProxy ) );
var dynamicType = tc.Build();
var proxy = (IProxy) Activator.CreateInstance( dynamicType ); proxy.GetProxyInstance();

示例二:

  public class ViewModelBase
{
protected void RaisePropertyChanged( string propertyName )
{
Console.WriteLine( $"PropertyName: {propertyName}" );
}
} [AttributeUsage(AttributeTargets.Property)]
public class RaisePropertyChangedAttribute : Attribute
{ } public class SampleViewModel : ViewModelBase
{
[RaisePropertyChanged]
public virtual string SomeProperty { get; set; }
} public static class ReflectionEmitViewModelFactory
{
public static T CreateInstance<T>()
where T : ViewModelBase
{
Type vmType = typeof(T); VerifyViewModelType(vmType); // Create everything required to get a module builder
AssemblyName assemblyName = new AssemblyName("SmartViewModelDynamicAssembly");
AppDomain domain = AppDomain.CurrentDomain;
AssemblyBuilder assemblyBuilder = domain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Run);
//AssemblyBuilderAccess.RunAndSave);
ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule(assemblyName.Name); string dynamicTypeName = Assembly.CreateQualifiedName(vmType.AssemblyQualifiedName, "Smart" + vmType.Name); TypeBuilder typeBuilder = moduleBuilder.DefineType(dynamicTypeName,
TypeAttributes.Public | TypeAttributes.Class, vmType); MethodInfo raisePropertyChangedMethod = typeof(ViewModelBase).GetMethod("RaisePropertyChanged",
BindingFlags.NonPublic | BindingFlags.Instance, null, new Type[] { typeof(string) }, null); foreach( PropertyInfo propertyInfo in FindNotifyPropertyChangCandidates<T>() )
UpdateProperty(propertyInfo, typeBuilder, raisePropertyChangedMethod); Type dynamicType = typeBuilder.CreateType(); return (T)Activator.CreateInstance(dynamicType);
} private static void VerifyViewModelType( Type vmType )
{
if( vmType.IsSealed )
throw new InvalidOperationException("The specified view model type is not allowed to be sealed.");
} private static IEnumerable<PropertyInfo> FindNotifyPropertyChangCandidates<T>()
{
return from p in typeof(T).GetProperties()
where p.GetSetMethod() != null && p.GetSetMethod().IsVirtual &&
p.GetCustomAttributes(typeof(RaisePropertyChangedAttribute), false).Length >
select p;
} private static void UpdateProperty( PropertyInfo propertyInfo, TypeBuilder typeBuilder,
MethodInfo raisePropertyChangedMethod )
{
// Update the setter of the class
PropertyBuilder propertyBuilder = typeBuilder.DefineProperty(propertyInfo.Name,
PropertyAttributes.None, propertyInfo.PropertyType, null); // Create set method
MethodBuilder builder = typeBuilder.DefineMethod("set_" + propertyInfo.Name,
MethodAttributes.Public | MethodAttributes.Virtual, null, new Type[] { propertyInfo.PropertyType });
builder.DefineParameter(, ParameterAttributes.None, "value");
ILGenerator generator = builder.GetILGenerator(); // Add IL code for set method
generator.Emit(OpCodes.Nop);
generator.Emit(OpCodes.Ldarg_0);
generator.Emit(OpCodes.Ldarg_1);
generator.Emit(OpCodes.Call, propertyInfo.GetSetMethod()); // Call property changed for object
generator.Emit(OpCodes.Nop);
generator.Emit(OpCodes.Ldarg_0);
generator.Emit(OpCodes.Ldstr, propertyInfo.Name);
generator.Emit(OpCodes.Callvirt, raisePropertyChangedMethod);
generator.Emit(OpCodes.Nop);
generator.Emit(OpCodes.Ret);
propertyBuilder.SetSetMethod(builder);
}
} //调用示例:
SampleViewModel viewModel = ReflectionEmitViewModelFactory.CreateInstance<SampleViewModel>();
viewModel.SomeProperty = "";

MSIL Emit AOP的更多相关文章

  1. .net动态代理-EMIT,AOP实现

    动态代理实现原理: 通过动态基础目标类,重写目标虚方法,.net中实现手段-il Emit.Proxy项目源码,https://github.com/1448376744/Emit.Proxy 以下是 ...

  2. 常见的 emit 实现 AOP demo

    0. 前言 上接:思想无语言边界:以 cglib 介绍 AOP 在 java 的一个实现方式 作为第四篇,我们回顾一下 csharp 里面比较常见动态编织实现方式emit 内容安排如下: emit a ...

  3. C#基础之泛型

    1.泛型的本质 泛型的好处不用多说,在.NET中我看到有很多技术都是以泛型为基础的,不过因为不懂泛型而只能对那些技术一脸茫然.泛型主要用于集合类,最主要的原因是它不需要装箱拆箱且类型安全,比如很常用的 ...

  4. ILGenerator.Emit动态 MSIL编程(一)之基础

    首先在Framework中,Emit相关的类基本都存在于System.Reflection.Emit命名空间下.可见Emit是作为反射的一个元素存在的. Emit能够实现什么?为什么要学习Emit?首 ...

  5. C#利用Emit反射实现AOP,以及平台化框架封装思路

    C#利用Emit反射实现AOP,以及平台化框架封装思路 这是前两天扒的一段动态代理AOP代码,用的Emit反射生成子类来实现代理模式,在这里做个小笔记,然后讨论一下AOP框架的实现思路. 首先是主函数 ...

  6. AOP从静态代理到动态代理 Emit实现

    [前言] AOP为Aspect Oriented Programming的缩写,意思是面向切面编程的技术. 何为切面? 一个和业务没有任何耦合相关的代码段,诸如:调用日志,发送邮件,甚至路由分发.一切 ...

  7. C# 使用Emit实现动态AOP框架 (三)

    目  录 C# 使用Emit实现动态AOP框架 (一) C# 使用Emit实现动态AOP框架 (二) C# 使用Emit实现动态AOP框架 (三) C# 使用Emit实现动态AOP框架 进阶篇之异常处 ...

  8. C# 使用Emit实现动态AOP框架 (二)

    目  录 C# 使用Emit实现动态AOP框架 (一) C# 使用Emit实现动态AOP框架 (二) C# 使用Emit实现动态AOP框架 (三) C# 使用Emit实现动态AOP框架 进阶篇之异常处 ...

  9. C# 使用Emit实现动态AOP框架 (一)

    目  录 C# 使用Emit实现动态AOP框架 (一) C# 使用Emit实现动态AOP框架 (二) C# 使用Emit实现动态AOP框架 (三) C# 使用Emit实现动态AOP框架 进阶篇之异常处 ...

随机推荐

  1. day1作业--登录入口

    作业概述: 编写一个登录入口,实现如下功能: (1)输入用户名和密码 (2)认证成功后显示欢迎信息 (3)输错三次后锁定 流程图: readme: 1.程序配置文件: 黑名单文件blacklist.t ...

  2. if、if elif判断

    1.if.py #coding=utf-8 user = 'alex' passwd = 'alex3714' username = input('username:') password = inp ...

  3. 【转】easyui $.message.alert 点击右上角的关闭按钮时,不执行定义的回调函数

    今天發現這個問題 easyui  $.message.alert  点击右上角的关闭按钮时,不执行定义的回调函数

  4. Knock: 使用压电传感器来检测敲击

    原文链接:https://www.arduino.cc/en/Tutorial/Knock 敲击检测 本教程介绍如何使用压电传感器检测振动,比如敲门.桌子或其他固体表面. 压电传感器是一种能够在振动. ...

  5. Retina Display and Eclipse Mac视网膜屏和Eclipse

    I have a Retina Display and Eclipse looks blurry. How can I fix it? You need to tell Mac OS that Ecl ...

  6. IBM Power PC安装sysbench 执行mysql基准测试 --- sysbench安装

    第一步:下载Sysbench http://dev.mysql.com/downloads/benchmarks.html 第二步:解压sysbench 第三步:执行安装步骤 1. ./autogen ...

  7. OpenCV的数据类型---Cv

    CvScalar就是一个包含四个元素的结构体变量. CvScalar定义可存放1—4个数值的数值,其结构如下. typedef struct CvScalar{    double val[4];}C ...

  8. 修改Oracle字符集为 ZHS16GBK

    SQL*Plus: Release 11.2.0.1.0 Production on Wed Aug 10 13:12:48 2016 Copyright (c) 1982, 2009, Oracle ...

  9. openscales实现漂亮的冒泡效果

    使用的时候openscales 默认的冒泡效果确实有点简陋,想实现那种看着比较舒服的效果,只能自己定义了.参考现有的openscales实现的方式,它是通过控件的状态实现的,每个状态中使用Path绘制 ...

  10. variably modified 'dist' at file scope|

    转自:http://blog.csdn.net/wusuopubupt/article/details/18408227 错误原因: The reason for this warning is th ...