0

SOに関する別の質問に対して、いくつかのテストコードを試しています。

複製するはずのコード:

(a, z) => a * b - Math.Log(z * b);

コード:

    static Func<int, int, double> IL_EmbedConst(int b)
    {
        var method = new DynamicMethod("EmbedConstIL", typeof(double), new[] { typeof(int), typeof(int) });

        var log = typeof(Math).GetMethod("Log", new Type[] { typeof(double) });

        var il = method.GetILGenerator();

        il.Emit(OpCodes.Ldarg_0);
        il.Emit(OpCodes.Ldc_I4, b);
        il.Emit(OpCodes.Mul);
        il.Emit(OpCodes.Conv_R8, b);

        il.Emit(OpCodes.Ldarg_1);
        il.Emit(OpCodes.Ldc_I4, b);
        il.Emit(OpCodes.Mul);
        il.Emit(OpCodes.Conv_R8, b);

        il.Emit(OpCodes.Call, log);

        il.Emit(OpCodes.Sub);

        il.Emit(OpCodes.Ret);

        return (Func<int, int, double>)method.CreateDelegate(typeof(Func<int, int, double>));
    }

使用:

        var mul1 = IL_EmbedConst(5);
        double res = mul1(4,6);

スロー:

Operation could destabilize the runtime.

何が悪いのかわかりません (最後に asm のような言語を使用したのは 25 年前だったので、何でもかまいません)。

4

1 に答える 1

3

問題は、次の2つの場所に変換することdoubleです。

il.Emit(OpCodes.Conv_R8, b);

MSDNから:

OpCodes.Conv_R8フィールド 評価スタックの最上位の値をfloat64に変換します。

そのオペコードは引数を取りません。代わりに、次を使用してください。

il.Emit(OpCodes.Conv_R8);

コードは正常に実行され、出力として16.5988026183378が生成されます。

于 2012-06-17T09:31:25.637 に答える