【发布时间】:2015-04-05 15:00:53
【问题描述】:
我正在尝试使用 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();
}
}
【问题讨论】:
-
我将其与 C# 编译器生成的
printf(" %s=%d\n", __arglist("a", 0));的 IL 进行了比较,并且哪个有效。除了maxstack之外,它...与您的代码生成的完全相同。这很奇怪,它是相同的 IL,它应该工作相同。 :// -
如果我手动创建程序集、模块和类型(使用
-Builder类型)然后调用该方法,这实际上可以工作。很奇怪。
标签: c# .net-4.0 cil reflection.emit dynamicmethod