6

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();
    }
}
4

1 に答える 1

4

例外は非常に不可解ですが、varargs メソッドの呼び出しに関連するいくつかのセキュリティ チェックが原因でスローされるか、それらのバグである可能性があります。機能するのは、論理的に関連付けられた型またはモジュールを提供することです。

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

その後、問題なく動作します。

于 2015-04-24T10:49:57.020 に答える