首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过DynamicMethod调用varargs方法

通过DynamicMethod调用varargs方法
EN

Stack Overflow用户
提问于 2015-04-05 15:00:53
回答 1查看 983关注 0票数 6

我试图使用DynamicMethod调用非托管printf类函数。在运行时,我得到一个

BadImageFormatException:未找到索引。(HRESULT例外: 0x80131124)

这是运行时的限制还是我发布的代码错了?

代码语言:javascript
复制
public class Program
{
    [DllImport("msvcrt40.dll",CallingConvention = CallingConvention.Cdecl)]
    public static extern int printf(string format, __arglist);

    static void Main(string[] args) {

        var method = new DynamicMethod("printf", typeof(void), new Type[0], true);
        var il = method.GetILGenerator();

        il.Emit(OpCodes.Ldstr, " %s=%d\n");
        il.Emit(OpCodes.Ldstr, "a");
        il.Emit(OpCodes.Ldc_I4_0);
        il.EmitCall(OpCodes.Call, typeof(Program).GetMethod("printf", BindingFlags.Public | BindingFlags.Static), new Type[] { typeof(string), typeof(int) });
        il.Emit(OpCodes.Pop);
        il.Emit(OpCodes.Ret);

        var action = (Action)method.CreateDelegate(typeof(Action));
        action.Invoke();
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-04-24 10:49:57

虽然异常异常非常神秘,但我想它是由于与调用varargs方法相关的一些安全检查而引发的,或者可能是它们中的一个bug。有效的方法是提供逻辑关联的类型或模块:

代码语言:javascript
复制
var method = new DynamicMethod("printf", typeof(void), new Type[0], typeof(Program), true);

那就完美无缺了。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29458616

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档