You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Reflection.Emit调用未创建类型成员报错问题求助

解决Reflection.Emit中PInvoke方法调用的"The invoked member is not supported before the type is created"错误

核心矛盾是:你试图通过typeBuilder.GetMethod()获取未完成创建的类型的方法,该操作要求类型必须先调用CreateType()完成构建,但提前构建类型又会导致Main方法因未生成完主体而报错。

直接解决方案

不要通过TypeBuilder.GetMethod()获取PInvoke方法,直接使用你已经定义好的mbCryptEnumOIDInfo(MethodBuilder实例)作为OpCodes.Call的参数。因为MethodBuilder继承自MethodBase,完全符合Emit(OpCodes.Call, ...)的参数要求,且不需要依赖已创建的类型。

修改后的调用代码:

// 直接使用已定义的MethodBuilder实例,无需通过TypeBuilder获取
ilgen.Emit(OpCodes.Call, mbCryptEnumOIDInfo);

完整流程说明

  1. 先定义PInvoke方法,得到mbCryptEnumOIDInfo实例
  2. 定义Main方法,获取其ILGenerator
  3. 在Main方法的IL生成逻辑中,直接引用mbCryptEnumOIDInfo生成Call指令
  4. 待Main方法的所有IL指令生成完成后,再调用typeBuilder.CreateType()完成类型创建

这样既避免了获取未创建类型方法的错误,也不会出现方法无主体的问题。

额外注意事项

  • 确保mbCryptEnumOIDInfo的作用域覆盖到Main方法的IL生成代码(比如将其定义在类级别的变量,而非局部代码块内)
  • 确认PInvoke方法的签名、调用约定(Winapi)、字符集(Ansi)与原C#代码完全一致,避免后续调用时出现调用错误

内容的提问来源于stack exchange,提问作者elka-w00t

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 21:01:22