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);
完整流程说明
- 先定义PInvoke方法,得到
mbCryptEnumOIDInfo实例 - 定义Main方法,获取其ILGenerator
- 在Main方法的IL生成逻辑中,直接引用
mbCryptEnumOIDInfo生成Call指令 - 待Main方法的所有IL指令生成完成后,再调用
typeBuilder.CreateType()完成类型创建
这样既避免了获取未创建类型方法的错误,也不会出现方法无主体的问题。
额外注意事项
- 确保
mbCryptEnumOIDInfo的作用域覆盖到Main方法的IL生成代码(比如将其定义在类级别的变量,而非局部代码块内) - 确认PInvoke方法的签名、调用约定(Winapi)、字符集(Ansi)与原C#代码完全一致,避免后续调用时出现调用错误
内容的提问来源于stack exchange,提问作者elka-w00t
相关产品推荐
相关产品推荐

