参考链接:

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. iOS开发项目之MVC与MVVM

    MVC MVC,Model-View-Controller,我们从这个古老而经典的设计模式入手.采用 MVC 这个架构的最大的优点在于其概念简单,易于理解,几乎任何一个程序员都会有所了解,几乎每一所计 ...

  2. 轨迹记录App是怎样对定位轨迹进行过滤、优化和平滑处理的

    https://www.zhihu.com/question/39983016 卡尔曼滤波原理 卡尔曼滤波学习笔记 卡尔曼滤波的原理说明 http://www.cs.unc.edu/~welch/ka ...

  3. Spark算上下基线

    def baseLine(sc: SparkContext): Unit = { println("--------------------baseLine start----------- ...

  4. vs 配置宏

    Win_$(PROCESSOR_ARCHITECTURE)_$(PlatformArchitecture) <==> Win_x86_64 OR Win_x86_32$(Configura ...

  5. [ActionScript 3.0] 两个AIR之间的通信示例LocalConnection

    发送方AIR程序: package { import flash.display.DisplayObjectContainer; import flash.display.Sprite; import ...

  6. iOS开发 - OC - 实现本地数据存储的几种方式一

    iOS常用的存储方式介绍 在iOS App开发过程中经常需要操作一些需要持续性保留的数据,比如用户对于App的相关设置.需要在本地缓存的数据等等.本文针对OC中经常使用的一下存储方式做了个整理. 常用 ...

  7. python 日期相关的各种操作总结

    用 Python 做项目时,经常会遇到与日期转换相关,日期计算相关的功能,动不动就要去查python手册,感觉麻烦,因此把自己常用的一些东西,总结了一下,总体说来到目前为止遇到如下一些需求: 1. 用 ...

  8. 剖析JavaScript函数作用域与闭包

    在我们写代码写到一定阶段的时候,就会想深究一下js,javascript是一种弱类型的编程语言,而js中一个最为重要的概念就是执行环境,或者说作用域.作用域重要性体现在哪呢?首先,函数在执行时会创建作 ...

  9. 解决触摸屏设备click事件300ms的延迟的问题

    从点击屏幕上的元素到触发元素的 click 事件,移动浏览器(触摸屏)会有大约 300 毫秒的等待时间.为什么这么设计呢? 因为它想看看你是不是要进行双击(double tap)操作.300ms的等待 ...

  10. 转来的emacs配置文件,自动安装插件

    网上转来的emacs配置文件,便于自动安装插件,收藏起来 http://www.gogae.org/post-7/ EMACS是一个伪装成代码编辑器的操作系统. EMACS是一个非常强大的代码编辑器, ...