public TypeBuilder GenerateType() // 返回动态代理类的Type
...{
string className = GetNewClassName();
TypeAttributes typeAttributes = TypeAttributes.Class | TypeAttributes.Public |
TypeAttributes.Sealed;TypeBuilder typeBuilder = m_EmitClassInfo.Module.DefineType(className,
typeAttributes, m_EmitClassInfo.BaseType);
return typeBuilder;
}
private void GenerateMethod() // 生成普通的方法
...{
MethodAttributes methodAttributes = MethodAttributes.Public;
MethodBuilder methodBuilder =
m_TypeBuilder.DefineMethod("__GetMethodInvocation", methodAttributes, typeof(IMethodInvocation),
new Type[] ...{ typeof(ICallable), typeof(MethodInfo) });m_EmitClassInfo.__GetMethodInvocation = methodBuilder;
![]()
ILGenerator ilGenerator = methodBuilder.GetILGenerator();
Label execIfLabel = ilGenerator.DefineLabel();
Label endIfLabel = ilGenerator.DefineLabel();
LocalBuilder methodInvocation = ilGenerator.DeclareLocal(typeof(IMethodInvocation));
ilGenerator.Emit(OpCodes.Ldarg_0);
... ...
}
private void GenerateConstructor() // 生成构造方法
...{
try
...{
MethodAttributes methodAttributes = MethodAttributes.Public;
CallingConventions callingConventions = CallingConventions.Standard;
m_BaseConstructorParams = m_EmitClassInfo.ConstructorArgumentsType;
m_ConstructorParams = new Type[m_BaseConstructorParams.Length + 1];
m_BaseConstructorParams.CopyTo(m_ConstructorParams, 0);
m_ConstructorParams[m_BaseConstructorParams.Length] = typeof(IInterceptor);
m_constructorBuilder = m_TypeBuilder.DefineConstructor(methodAttributes, callingConventions,
m_ConstructorParams);m_EmitClassInfo.Constructor = m_constructorBuilder;
m_IlGenerator = m_constructorBuilder.GetILGenerator();
}
catch (Exception e)
...{
throw e;
}
}
| 第1页: AOP的概念和原理 | 第2页: C#限制颇多,实现AOP框架困难重重 |
| 第3页: 如何拦截构造方法 | 第4页: 偶遇通往MSIL世界的“魔比斯环”,C#... |
| 第5页: C#编译器来改变C#的规则 | 第6页: 在MSIL世界建立起强大的AOP帝国 |