Dynamisch kompilierten C # -Code mit nativer Geschwindigkeit ausführen ... wie?

Ich habe mehrere Posts über das Schreiben und Kompilieren von dynamischem C # -Code auf SO gelesen. Zum Beispiel,dieser Beitrag. Ich verstehe, es kann auf verschiedene Arten geschehen.

Das Aufrufen des Codeaufrufers ist jedoch langsam. Ich habe ein einfaches Benchmarking durchgeführt und es ist ungefähr 500 Mal langsamer als das Aufrufen einer nativen Methode.

Ich möchte in der Lage sein, eine DLL zu laden und eine ihrer Methoden direkt ("nativ") aufzurufen, wodurch sich die gewünschten Geschwindigkeitsvorteile ergeben.

Was ist der einfachste Weg, dies zu tun? Den dynamischen Code in eine DLL kompilieren und dann laden? Kann es im Gedächtnis geschehen?

BEARBEITEN

Die Kompilierungszeit ist mir egal. Nur Hinrichtung.

EDIT 2, 3

Hier ist der Benchmark-Code, den ich geschrieben habe:

    public static int Execute(int i) { return i * 2; }

    private void button30_Click(object sender, EventArgs e)
    {
        CSharpCodeProvider foo = new CSharpCodeProvider();

        var res = foo.CompileAssemblyFromSource(
            new System.CodeDom.Compiler.CompilerParameters()
            {
                GenerateInMemory = true,
                CompilerOptions = @"/optimize",                    
            },
            @"public class FooClass { public static int Execute(int i) { return i * 2; }}"
        );

        var type = res.CompiledAssembly.GetType("FooClass");
        var obj = Activator.CreateInstance(type);
        var method = type.GetMethod("Execute");
        int i = 0, t1 = Environment.TickCount, t2;
        //var input = new object[] { 2 };

        //for (int j = 0; j < 10000000; j++)
        //{
        //    input[0] = j;
        //    var output = method.Invoke(obj, input);
        //    i = (int)output;
        //}

        //t2 = Environment.TickCount;

        //MessageBox.Show((t2 - t1).ToString() + Environment.NewLine + i.ToString());

        t1 = Environment.TickCount;

        for (int j = 0; j < 100000000; j++)
        {
            i = Execute(j);
        }

        t2 = Environment.TickCount;

        MessageBox.Show("Native: " + (t2 - t1).ToString() + Environment.NewLine + i.ToString());

        var func = (Func<int, int>) Delegate.CreateDelegate(typeof (Func<int, int>), method);

        t1 = Environment.TickCount;

        for (int j = 0; j < 100000000; j++)
        {
            i = func(j);
        }

        t2 = Environment.TickCount;

        MessageBox.Show("Dynamic delegate: " + (t2 - t1).ToString() + Environment.NewLine + i.ToString());

        Func<int, int> funcL = Execute;

        t1 = Environment.TickCount;

        for (int j = 0; j < 100000000; j++)
        {
            i = funcL(j);
        }

        t2 = Environment.TickCount;

        MessageBox.Show("Delegate: " + (t2 - t1).ToString() + Environment.NewLine + i.ToString());
    }

Antworten auf die Frage(3)

Ihre Antwort auf die Frage