Как интегрировать C# Scripting API (csi.exe) с хост-программой?
Ради простоты, если у меня есть игровой движок. Используйте C# скомпилировано. Как бы я вызвал C# скрипт, используя csi.exe (или какой-то другой метод). Как мне использовать C# Scripting API в другой программе, такой как Lua?
Изменить: разъяснение. Я не хочу звонить в C# csi.exe из Lua. Я хочу вызвать csi.exe из скомпилированной программы, будь то C# (скомпилированная программа C#), C++ или что-то еще. Я не имел в виду, что это похоже на вызов скриптового API от Lua. Я имею в виду, как другие программы используют Lua. Вот как я хочу использовать C# Scripting API. В основном меня интересует, как вызвать скрипт C# из скомпилированной программы на C#.
2 ответа
Вам не нужно использовать csi.exe, вы можете скомпилировать и выполнить C# в вашем приложении (с контекстом для ваших объектов решения, классов и методов).
Я не нашел какой-либо реальной документации об этом кроме некоторых сообщений в блоге.
Основные методы, на которые вы должны обратить внимание, находятся в Microsoft.CodeAnalysis.CSharp.Scripting
а также Microsoft.CodeAnalysis.Scripting
,
Оглянись CSharpScript.RunAsync
а также CSharpScript.EvaluteAsync
эти два скомпилируют и выполнят данный сценарий C# с синтаксисом, аналогичным синтаксису csi.exe.
Например, если вы хотите, чтобы пользователь ввел некоторый код, и ожидаете, что этот код вернет некоторую строку, в то же время предоставляя пользователю MyClass
монтаж:
private async void CompileAndExecuteLine(string userCode)
{
string output = "";
ScriptOptions scriptOptions = ScriptOptions.Default.WithReferences(typeof(MyClass).Assembly);
try
{
output = await CSharpScript.EvaluateAsync<string>(userCode, scriptOptions);
}
catch (CompilationErrorException cee)
{
string message = "You got errors:" + "\r\n";
foreach (Diagnostic dia in cee.Diagnostics)
{
message += dia.ToString() + "\r\n";
}
MessageBox.Show(message, "Compilation Error");
}
catch (Exception e)
{
MessageBox.Show(e.Message);
}
return output;
}
В этом примере код, который вы вводите, должен возвращать строку (необходимо завершить return someString;
), вы можете вызывать любой класс и метод из указанной сборки и даже объявлять ваши собственные классы в userCode
(но без пространств имен).
Если вы хотите иметь некоторую терминальную среду (= всегда возвращать некоторую строку), попробуйте манипулировать пользовательским кодом перед выполнением.
Чтобы позвонить в csi.exe из lua, вы должны использовать
os.execute("c:\\<csi.exe location>\csi.exe myscript.csx")
Если вам нужно передать входные аргументы, то
os.execute("c:\\<csi.exe location>\csi.exe myscript.csx myArg")
Внутри вашего файла myscript.csx вы можете получить доступ к аргументам через
Args[0] ... Args[n]