首页 新闻 会员 周边

这一句代码用emit如何实现

0
悬赏园豆:50 [已关闭问题] 关闭于 2011-06-23 16:31

我要动态实现的方法很简单

    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,打开该方法的源码时候爆错,说是数组索引超出范围。请高手指点。

lindping的主页 lindping | 初学一级 | 园豆:3
提问于:2011-06-22 15:30
< >
分享
所有回答(0)
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册