I'm trying to call unmanaged printf-like function using DynamicMethod. At runtime I get a
BadImageFormatException:Index not found. (Exception from HRESULT: 0x80131124)
Is this a limitation of runtime or my emited code is wrong?
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();
}
}
printf(" %s=%d\n", __arglist("a", 0));
generated by the C# compiler, and which works. It's... exactly the same than what your code generates except formaxstack
. That's weird, it's the same IL, it should work the same. :/ – Huddle-Builder
types) and then invoke the method. Weird. – Trivia