我要动态实现的方法很简单
public DbConnection CreateConnection(string connectionString)
{
return new Oracle.DataAccess.Client.OracleConnection(connectionString);
}
对应生成的il代码
.method public hidebysig newslot virtual final
instance class [System.Data]System.Data.Common.DbConnection
CreateConnection(string connectionString) cil managed
{
// Code size 12 (0xc)
.maxstack 2
.locals init ([0] class [System.Data]System.Data.Common.DbConnection CS$1$0000)
IL_0000: nop
IL_0001: ldarg.1
IL_0002: newobj instance void [Oracle.DataAccess]Oracle.DataAccess.Client.OracleConnection::.ctor(string)
IL_0007: stloc.0
IL_0008: br.s IL_000a
IL_000a: ldloc.0
IL_000b: ret
} // end of method OracleComponentFactory::CreateConnection
我用emit的实现代码
ilGen.Emit(OpCodes.Nop);
ilGen.Emit(OpCodes.Ldarg_1);
ilGen.Emit(OpCodes.Newobj, Type.GetType(typeName).GetConstructor(paraTypes));
ilGen.Emit(OpCodes.Stloc_0);
Label lab = ilGen.DefineLabel();
ilGen.Emit(OpCodes.Br_S, lab);
ilGen.MarkLabel(lab);
ilGen.Emit(OpCodes.Ldloc_0);
ilGen.Emit(OpCodes.Ret);
执行 Type target = typeBuilder.CreateType(); 总是报错 说方法没有实现(这个方法要实现接口),用reflector查看动态生成的dll,打开该方法的源码时候爆错,说是数组索引超出范围。请高手指点。