2016-04-18 12 views
2

Ich habe mehrere Anwendungen gesehen, die den Benutzer die Anpassung über Vb-Skript oder Javascript hinzufügen lassen. Ein schweres Beispiel dafür wären Office Addons via VBScript oder RPG Maker mit Ruby Scripting.Benutzer Scripting-Engine zu meiner App hinzufügen

Ich wollte die Möglichkeit, in einem meiner apps hinzufügen die Benutzer schreiben einige benutzerdefinierte Regeln in einigen Skriptsprache, die jede Zeit sie versuchen, laufen zu lassen und speichern/Senden, um die Homepage zu

weiß, dass ich diese Frage irgendwie tief, aber nachdem ich ungefähr eine Stunde auf Google verbracht habe, weiß ich immer noch nicht einmal, wo ich anfangen soll, diese Art von Problem zu lösen. Ich weiß, dass es eine Menge zu berücksichtigen gibt.

Bitte zeigen Sie mir in die richtige Richtung.

+0

Auf welcher Ebene erwarten Ihre Benutzer die Sprache und/oder Programmierung? Mit anderen Worten, wie fortgeschritten ist Ihre Engine (und ihre Sprache)? –

+0

Das Scripting-Addon würde IT-Mitarbeitern, die etwas programmieren können, besser gerecht werden. Visual Basic ist, was der Projektmanager will – Atomhax

+0

Sie könnten in das [Roslyn-Projekt] (https://github.com/dotnet/roslyn) schauen. Ich glaube, es kann als Skript-Host verwendet werden. Es sieht likes aus [andere haben Roslyn bereits für ähnliche Zwecke verwendet] (http://stackoverflow.com/questions/11159007/roslyn-visualbasic-scriptengine-doesnt-recognize-hostobject-written-on-c-sharp). –

Antwort

1

Wenn Sie möchten, dass die Codierung auf der Client-Seite ist, können Sie Javascript und einfach eval(userCode) verwenden, wobei usercode eine Zeichenfolge ist.

Wenn Sie den Benutzercode mit C# auf der Serverseite ausführen möchten, können Sie den integrierten Compiler mit den Bibliotheken Microsoft.CSharp und System.CodeDom.Compiler verwenden. Es kann so geschehen:

string code = @" 
    using System; 

    namespace First 
    { 
     public class Program 
     { 
      public static void Main() 
      { 
      " + 
       "Console.WriteLine(\"Hello, world!\");" 
       + @" 
      } 
     } 
    } 
"; //Assume this is the code the client gave you 
CSharpCodeProvider provider = new CSharpCodeProvider(); 
CompilerParameters parameters = new CompilerParameters(); 

parameters.GenerateInMemory = true; //You can add references to libraries using parameters.ReferencedAssemblies.Add(string - name of the assembly). 

CompilerResults results = provider.CompileAssemblyFromSource(parameters, code); //Compiling the string to an assembly 

if (results.Errors.HasErrors) 
{ 
    StringBuilder sb = new StringBuilder(); 

    foreach (CompilerError error in results.Errors) 
    { 
     sb.AppendLine(String.Format("Error ({0}): {1}", error.ErrorNumber, error.ErrorText)); 
    } 

    throw new InvalidOperationException(sb.ToString()); 
} //Error checking 

Assembly assembly = results.CompiledAssembly; 
Type program = assembly.GetType("First.Program"); //Getting the class object 
MethodInfo main = program.GetMethod("Main"); //Getting the main method to invoke 

main.Invoke(null, null); //Invoking the method. first null - because the method is static so there is no specific instance to run in, second null tells us there are no parameters. 

-Code-Schnipsel aus Codeproject genommen wurde: http://www.codeproject.com/Tips/715891/Compiling-Csharp-Code-at-Runtime

Hoffe, es half!

3

Je nachdem, welche Sprache (n) Sie unterstützen möchten, gibt es verschiedene Optionen. VB Script kann mit MSScriptControl durchgeführt werden und C# kann mit Microsoft.CSharp erfolgen.

Hier ist ein kurzes Beispiel für etwas, das ich gerade gemacht habe, um ein C# -Skript aus einer Datenbank zu ziehen und auszuführen. Bitte beachten Sie, dass dies nur Zeichenketten enthält, die Sie anpassen müssten, wenn Sie möchten, dass Ihre Argumente eine Sammlung oder ein anderer Datentyp sind.

value = CreateTransformMethodInfo(_script.ScriptBody).Invoke(null, args.Select(x => x.Value).ToArray()); //args would be the arguments in your script 

public static MethodInfo CreateTransformMethodInfo(string script) 
    { 
     using (var compiler = new CSharpCodeProvider()) 
     { 
      var parms = new CompilerParameters 
      { 
       GenerateExecutable = false, 
       GenerateInMemory = true, 
       CompilerOptions = "/optimize", 
       ReferencedAssemblies = { "System.Core.dll" } 
      }; 

      return compiler.CompileAssemblyFromSource(parms, script) 
       .CompiledAssembly.GetType("Transform") 
       .GetMethod("Execute"); 
     } 
    } 

Dann wird das eigentliche Skript wie folgt aussieht:

public class Transform 
{ 
    public static string Execute(string firstName) 
    { 
     return "Test"; 
    } 
} 

Die einzige Einschränkung ist, dass Sie die Klasse nennen müßten ‚verwandeln‘ und die Methode auszuführen ‚Ausführen‘ jedes Mal, seit Sie können sehen, dass wir diese beiden Werte beim Kompilieren der auszuführenden Methode verwenden. Sie können Helper-Klassen oder -Methoden jedoch beliebig benennen, solange die 'ausführende' Klasse und Methode 'Transformieren/Ausführen' bleibt.

Verwandte Themen