通过Emit(Opcodes.Call,methodinfo)创建类型的实例

弗兰克莫德

我正在使用Reflection和ilGenerator创建一个.Exe,它从DLL中调用一个方法。

我的问题是,当它是一个实例方法时,必须在调用该方法之前将实例放入堆栈。因此,我在C#中有一个创建并返回此实例的方法。它在扔System.MethodAccessException

我的问题是,这可能吗?它是如何工作的?通过在IL中执行此操作il.Emit(Opcodes.call, methodInfo),在创建.exe的调用中,在运行时,它如何知道要调用的方法?我要调用的方法是否转到.exe程序集?我对此很困惑。

我去DLL,获取类型,获取MethodInfo我要调用的。我创建一个新的Assembly-> AssemblyBuilder-> ModuleBuilder-> TypeBuilder,我正在创建的这个新类型是从DLL扩展Type:

 TypeBuilder tb = mb.DefineType("TypeApp" + typeName, baseType.Attributes, DLLType);

我创建了MethodBuilder作为新类型的入口点:

MethodBuilder metb = tb.DefineMethod("Main", MethodAttributes.Public |
            MethodAttributes.Static, typeof(void), argsArray);
ab.SetEntryPoint(metb);

然后为该Main方法生成IL

ILGenerator il = metb.GetILGenerator();

il.Emit(OpCodes.Call, callcreateInstanceMethodInfo);

IL仍在继续,但到目前为止我还不完全了解...

然后创建.exe

 tb.CreateType();
 ab.Save(typeName + methodName + ".exe");
布赖恩·赖希勒

它在扔System.MethodAccessException

您是否正在尝试调用通常对于所生成的类型不可见的方法(调用私有方法或内部方法,在未从其继承的类中调用受保护的方法)。我认为可以通过禁用验证来实现,但是这增加了代码的安全性要求,如果您需要在部分信任环境中运行,那么这将是一个问题。

在创建.exe的调用中,在运行时时,它如何知道调用哪种方法?

发出的IL包含一个4字节的元数据令牌,它本质上是对所生成模块中的一个元数据表(MethodDef或MemberRef表)中的一条记录的引用。如果是MethodDef令牌,则它是对方法定义的直接引用;如果是MemberRef令牌,则它将提供足够的信息以标识要调用的正确程序集/类/方法。

您显示的生成IL的代码表示您正在使用调用操作码。如果您正在调用虚拟方法,则应该改用callvirt(尽管您可以对非抽象方法使用call,但这将导致调用特定的实现...即使被重写,这也可能是意外的,我阅读了在某些地方增加了对在另一个对象的虚拟方法上使用调用的安全性要求。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

通过幻像类型创建(获取)值实例

来自分类Dev

通过幻像类型创建(获取)值实例

来自分类Dev

如何仅通过泛型类型 T 创建实例

来自分类Dev

当参数化类型通过层次结构传递时,在Java中创建泛型类型的实例吗?

来自分类Dev

如何获取Reflection.Emit类型的实例?

来自分类Dev

通过使用Reflection.Emit创建程序集运行时。在mvc5中

来自分类Dev

通过父类型获取类型类实例

来自分类Dev

如何使用Google Compute Python API通过GPU创建自定义计算机类型或实例?

来自分类Dev

创建未知类型的实例

来自分类Dev

创建未知类型的实例

来自分类Dev

如何通过泛型类型实例化?

来自分类Dev

通过枚举值+依赖注入创建实例

来自分类Dev

通过反射创建开放实例委托

来自分类Dev

节点通过构造函数创建实例

来自分类Dev

Scala创建别名类型的实例

来自分类Dev

为新类型创建实例

来自分类Dev

WPF:无法创建类型的实例

来自分类Dev

创建泛型类型的实例

来自分类Dev

如何创建未知类型的实例?

来自分类Dev

Scala创建别名类型的实例

来自分类Dev

意外的行为创建类型的实例

来自分类Dev

为新类型创建实例

来自分类Dev

无法创建 ViewModel 类型的实例

来自分类Dev

创建变量类型“T”的实例

来自分类Dev

通过关联通过has_many创建实例

来自分类Dev

通过反射实例化时,将类型的实例添加到该类型的列表中

来自分类Dev

通过注释从对象类型创建缓存

来自分类Dev

通过Factory创建实例时,隔离实例的依赖关系(以及该实例的依赖关系)

来自分类Dev

我如何从MethodInfo访问实例