Napisałem pakiet SharpByte.Dynamic , aby uprościć zadanie kompilowania i dynamicznego wykonywania kodu. Kod można wywołać na dowolnym obiekcie kontekstu przy użyciu metod rozszerzających, jak opisano szczegółowo tutaj .
Na przykład,
someObject.Evaluate<int>("6 / {{{0}}}", 3))
zwraca 3;
someObject.Evaluate("this.ToString()"))
zwraca reprezentację ciągu obiektu kontekstu;
someObject.Execute(@
"Console.WriteLine(""Hello, world!"");
Console.WriteLine(""This demonstrates running a simple script"");
");
uruchamia te instrukcje jako skrypt itp.
Pliki wykonywalne można łatwo uzyskać za pomocą metody fabrycznej, jak pokazano na poniższym przykładzie - wszystko , czego potrzebujesz, to kod źródłowy i lista wszelkich oczekiwanych nazwanych parametrów (tokeny są osadzane przy użyciu notacji z potrójnym nawiasem, np. {{{0}} }, aby uniknąć kolizji z string.Format (), a także składniami podobnymi do Handlebars):
IExecutable executable = ExecutableFactory.Default.GetExecutable(executableType, sourceCode, parameterNames, addedNamespaces);
Każdy obiekt wykonywalny (skrypt lub wyrażenie) jest bezpieczny dla wątków, może być przechowywany i ponownie używany, obsługuje logowanie z poziomu skryptu, przechowuje informacje o czasie i ostatnim wyjątku, jeśli zostanie napotkany itp. Istnieje również skompilowana metoda Copy (), która umożliwia tworzenie tanich kopii, czyli używanie obiektu wykonywalnego skompilowanego ze skryptu lub wyrażenia jako szablonu do tworzenia innych.
Narzut związany z wykonaniem już skompilowanego skryptu lub instrukcji jest stosunkowo niski, znacznie poniżej mikrosekundy na skromnym sprzęcie, a już skompilowane skrypty i wyrażenia są buforowane do ponownego wykorzystania.