3

このコードは機能しますが、これが良い解決策かどうか知りたいですか? Expression Tree を使用したこのソリューションは、Emit や OpCodes よりも優れていると考えられますか?

var target = Expression.Lambda(
            Expression.Block(
                new ParameterExpression[] { },
                Expression.Call(
                    typeof(MessageBox).GetMethod("Show", new[] { typeof(string) }),
                   Expression.Constant(1.ToString(), typeof(string))
                )
            ),
            new ParameterExpression[] { }

        );
AssemblyName aName = new AssemblyName("DynamicAssemblyExample");

AssemblyBuilder ab =
            AppDomain.CurrentDomain.DefineDynamicAssembly(
                aName,
                AssemblyBuilderAccess.RunAndSave);

        ModuleBuilder mb =
            ab.DefineDynamicModule(aName.Name, aName.Name + ".dll");
TypeBuilder tb = mb.DefineType("MyDynamicType", TypeAttributes.Public);
        var method = tb.DefineMethod("dynamicMethod", MethodAttributes.Public     |         MethodAttributes.Static);
target.CompileToMethod(method);
4

1 に答える 1

0

あなたの例のコードは、単なる「例」コードのようです。式ツリーが必要だとは思いません。正しく読めば、単に定数式を作成しているだけ() => MessageBox.Show(1.ToString());です。)

式ツリーは、特に、実際の動的コードを作成する必要がある場合、つまり、プログラム内で他の言語を解釈する場合や、リフレクションが必要な操作 (たとえば、Automapper などのプログラム) に最適です。

オペコードを直接発行するよりも優れていますか。それは本当に依存します: コンパイラよりも優れた仕事をすることができますか? オペコードを発行することはアセンブリを書くようなもので、時間がかかり、最適なコードを書くために何をしているのかを本当に知る必要があります。コンパイラと手動で最適化されたコードのパフォーマンスの違いは、余分な努力をする価値がありますか?

于 2013-04-20T11:17:55.030 に答える