Как интегрировать 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]
Другие вопросы по тегам