通过DynamicMethod调用varargs方法

use*_*926 6 c# cil reflection.emit .net-4.0 dynamicmethod

我正在尝试使用DynamicMethod调用非托管类似printf的函数.在运行时我得到一个

BadImageFormatException:找不到索引.(HRESULT异常:0x80131124)

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

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

Ill*_*ack 4

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

var method = new DynamicMethod("printf", typeof(void), new Type[0], typeof(Program), true);
Run Code Online (Sandbox Code Playgroud)

那么工作就完美无缺了。