.method public hidebysig virtual instance void BuildUp_"methodname" (IBuilderContext context) cil managed
{
.maxstack 3
.locals init(
[0] class typeToBuild 'existingObjectLocal'
[1] class [mscorlib]System.String 'currentParameterName')
L_0000: ldarg.0
L_0001: callvirt 'Existing'
L_0002: cast class typeToBuild
L_0003: stloc.0 //完成获取方法所在类型的Type操作并存在局部变量existingObjectLocal中,
//Evaluation Stack为空
L_0004: ldloc.0 //将要构建的Type加载到局部变量区中
L_001f: ldnull
L_0005: ceq
L_0006: brfalse existingObjectNotNull //待构建类型为null则返回
L_0007: ldarg.0
L_0008: call 'ThrowForAttemptingToConstructInterface' //判断当前类型是否为接口
//是,则抛出异常
L_0009: BeginExceptionBlock
L_002e: nop
L_002f: ldstr 'parameters[i].Name' //获取当前参数名称并存储于局部变量
//currentParameterName中
L_0010: stloc.1
L_0012: ldarg.0 //将上下文实例压入Evaluation Stack
L_0013: callvirt 'Policies' //从上下文获取PolicyList
L_0014: ldtoken 'typeof (IDependencyResolverPolicy)'//从MetaData
//获取IDependencyResolverPolicy
//类型的token
L_0015: call System.Type.'GetTypeFromHandle' //执行call指令,依据句柄获取类型,
//返回值为类型,为什么要用这种方式?因为Policy在存的时候以<IDependencyResolverPolicy,Key>
//方式存储,所以需要去metaData中找到IDependencyResolverPolicy的Type
L_0016: ldstr 'key with GUID' //获取当前参数的BuildKey用来取出相应的Policy
L_0017: callvirt 'IPolicyList.Get' //调用其Get方法取出相应Policy
L_0018: cast class 'typeof(IDependencyResolverPolicy)'//完成Policy向
//IDependencyResolverPolicy的类型转换
L_0019: ldarg.0 //向Evaluation Stack中压入上下文
L_0020: callvirt 'Resolve' //调用找出的DependencyResolverPolicy的Resolve方法
//以生成参数并将参数压入Evaluation Stack
L_0021: brtrue L_002e //构造函数的所有参数都解析完毕则跳出
L_0022: ldnull
L_0023: stloc.1 //清空局部变量currentParameterName先
L_0024: newobj 'selectedCtor.Constructor' //其实就是将Evaluation Stack中参数先弹出,
//然后依据ConstructorInfo信息调用待构建
//类型的构造函数,并将生成的对象压入Evaluation Stack
L_0025: stloc.0 //将生成的对象保存到局部变量区中,保证Evaluation Stack为空
L_0026: BeginCatchBlock //传入类型为Exception
exceptionOccuredInResolution:
L_0027: ldloc.1
L_0028: ldnull
L_0029: ceq
L_0030: brfalse exceptionOccuredInResolution
L_0031: rethrow //处理完异常之后再将其抛出
L_0032: ldloc.1
L_0033: ldstr 'signatureString'
L_0034: ldarg.0
L_0035: call 'throwForResolutionFailed'
L_0036: EndExceptionBlock
existingObjectNotNull:
}