Frage

Ich frage mich, ob es möglich war, zu kompilieren und gespeicherte Code ausführen, ohne eine exe zu erzeugen oder jede Art von anderen Dateien, im Grunde die Datei aus dem Speicher ausgeführt werden.

Grundsätzlich ist die Hauptanwendung, einige gespeicherte Code haben (Code, die möglicherweise geändert werden), und es müssen den Code kompilieren und ausführen. ohne Dateien zu erstellen.

, um die Dateien zu erstellen, das Programm ausgeführt wird, und dann das Löschen der Dateien ist keine Option. der kompilierte Code muß ran aus dem Speicher sein.

Code-Beispiele oder Zeiger, oder so ziemlich alles ist willkommen:)

War es hilfreich?

Lösung

using (Microsoft.CSharp.CSharpCodeProvider foo = 
           new Microsoft.CSharp.CSharpCodeProvider())
{
    var res = foo.CompileAssemblyFromSource(
        new System.CodeDom.Compiler.CompilerParameters() 
        {  
            GenerateInMemory = true 
        }, 
        "public class FooClass { public string Execute() { return \"output!\";}}"
    );

    var type = res.CompiledAssembly.GetType("FooClass");

    var obj = Activator.CreateInstance(type);

    var output = type.GetMethod("Execute").Invoke(obj, new object[] { });
}

Dies stellt eine einfache Klasse aus dem Quellcode-String enthalten ist, dann wird die Klasse instanziiert und ruft reflektiv eine Funktion auf sich.

Andere Tipps

Hier ist ein Beispiel dafür, wie System.Linq.Expressions zu verwenden, um Tims Antwort hinzuzufügen. Offensichtlich ist es nicht der schönste Code aber in diesem schönen mit baumartiger Form macht die Entwicklung so einfach.

private  Expression<IsWordChar> CreateIsWordCharExpression()
{
    var e = Expression.Parameter(typeof(int), "e");
    var c = Expression.Variable(typeof(char), "c");
    var returnLabel = Expression.Label(Expression.Label(typeof(bool)), _falseConstant);
    var lambda = Expression.Lambda<IsWordChar>(
        Expression.Block(
            new[] { c },
            Expression.IfThen(
                Expression.OrElse(
                    Expression.Equal(e, Expression.Constant(-1)),
                    Expression.Equal(e, _inputLengthVar)
                ),
                Expression.Return(returnLabel.Target, _falseConstant)
            ),
            Expression.Assign(c, Expression.MakeIndex(_str, _stringCharsPropertyInfo, new[] { e })),
            Expression.IfThenElse(
                Expression.OrElse(
                    Expression.OrElse(
                        Expression.OrElse(
                            Expression.AndAlso(
                                Expression.GreaterThanOrEqual(c, Expression.Constant('a')),
                                Expression.LessThanOrEqual(c, Expression.Constant('z'))
                            ),
                            Expression.AndAlso(
                                Expression.GreaterThanOrEqual(c, Expression.Constant('A')),
                                Expression.LessThanOrEqual(c, Expression.Constant('Z'))
                            )
                        ),
                        Expression.AndAlso(
                            Expression.GreaterThanOrEqual(c, Expression.Constant('0')),
                            Expression.LessThanOrEqual(c, Expression.Constant('1'))
                        )
                    ),
                    Expression.Equal(c, Expression.Constant('_'))
                ),
                Expression.Return(returnLabel.Target, _trueConstant),
                Expression.Return(returnLabel.Target, _falseConstant)
            ),
            returnLabel
        ),
        "IsWordChar",
        new[] { e }
    );
    return lambda;
}

Es ist möglich. Es ist leicht oder schwer, je nachdem, wie viel und welche Art von Code, den Sie schreiben möchten.

Bearbeiten Hinweis, dass vor dem .NET 4.0 ist System.Linq.Expressions darauf beschränkt, was Sie auf einer einzigen Zeile von C # passen kann: das heißt, nicht wenn, während, variable Zuordnung etc.

Ja, Sie können dies tun. Es ist sehr langsam, aber man kann es auf jeden Fall tun. Schauen Sie sich die CodeDOM oder (new CSharpCodeProvider().CreateCompiler()) in .Net.

Schauen Sie in System.CodeDom. Es wird genau das tun, was Sie suchen.

In Mono verwenden Sie CSharp.Evaluator. Es funktioniert wirklich im Speicher v. Einige der anderen Lösungen, die Schreib erwähnt und lesen in einer Datei unter der Haube zurück.

Werfen Sie auch einen Blick auf eine Skriptsprache wie Python einbetten, Ruby, Lua, etc .. all die Unterstützung aus dem Speicher Ausführung von Code, ohne etwas auf die Platte geschrieben werden.

Es ist schwierig, wenn nicht unmöglich, C # kompilieren und ausführen, ohne eine Datei zu erstellen, weil ... Nun, das ist, was Kompilation ist-Sprache in eine ausführbare Datei drehen. Was Sie suchen, ist eine Art von Scripting-Funktionalität. Was Sie in Ihrer Frage beschrieben ist im Wesentlichen der Unterschied zwischen einer interpretiert Sprache und einer zusammengestellt Sprache. Siehe Wikipedia. Skriptsprache

Je nachdem, was Sie diese Funktion für verwenden, könnte man große Verwendung einer Skriptsprache wie Python, Ruby oder Lua machen. Hier ein Beispiel: Wie kann ich einen Python-Skript ausführen von C # ?

Dies würde Ihre Anwendung abhängig von python.exe machen (oder was auch immer ausführbar müssen Sie die Skriptsprache Sie wählen laufen). Wenn Sie das vermeiden wollen, könnte es nicht allzu schwer sein, Ihre eigene Skriptsprache zu machen, dass Ihre Anwendung funktioniert die Laufzeit für die, je nachdem, was müssen Sie mit Ihrem injizierte Skript zu tun.

Edit: Der erste Absatz Müll ist. Es tut uns leid. Siehe http://msdn.microsoft.com /en-us/library/8ffc3x75%28v=vs.110%29.aspx

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top