通过 DynamicMethod 调用可变参数方法
Calling varargs method via DynamicMethod
我正在尝试使用 DynamicMethod 调用类似 printf 的非托管函数。在运行时我得到一个
BadImageFormatException:Index not found. (Exception from 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();
}
}
虽然该异常异常隐蔽,但我猜它是由于与调用可变参数方法相关的一些安全检查而抛出的,或者它可能是其中的错误。有效的是提供逻辑关联的类型或模块:
var method = new DynamicMethod("printf", typeof(void), new Type[0], typeof(Program), true);
那就完美无缺了。
我正在尝试使用 DynamicMethod 调用类似 printf 的非托管函数。在运行时我得到一个
BadImageFormatException:Index not found. (Exception from 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();
}
}
虽然该异常异常隐蔽,但我猜它是由于与调用可变参数方法相关的一些安全检查而抛出的,或者它可能是其中的错误。有效的是提供逻辑关联的类型或模块:
var method = new DynamicMethod("printf", typeof(void), new Type[0], typeof(Program), true);
那就完美无缺了。