Можно ли использовать C# codeDOM для обратного вызова предварительно скомпилированных функций?

Я работаю над глупой игрой, в которой игрок управляет своим персонажем, программируя процедуры, которым он должен следовать. Я использую C# codeDOM для компиляции кода, который пишет игрок, и я хотел бы, чтобы игрок мог вызывать функции, написанные в предварительно скомпилированной части программного обеспечения. Например:

Код, написанный игроком, который будет компилироваться во время выполнения с помощью codeDOM:

namespace AutoCrawl
{
    public class Player
    {
        public void Go_Up()
        {
            Move("Up");
        }
    }
}    

Мой предварительно скомпилированный код:

    private void compileUserCode()
    {
        string code = UserCodeTextBox.Text;

        CSharpCodeProvider provider = new CSharpCodeProvider();
        CompilerParameters parameters = new CompilerParameters();

        parameters.GenerateInMemory = true;
        parameters.GenerateExecutable = false;

        CompilerResults results = provider.CompileAssemblyFromSource(parameters, code);
    }

    private void Move(string direction)
    {
        //move the player's character in the direction specified by "direction"
    }

Проблема в том, что я не знаю, как сообщить компилятору codeDOM, что он может найти функцию 'Move' в моем собственном предварительно скомпилированном коде. Я получаю следующую ошибку от компилятора codeDOM:

Ошибка (CS0103): имя «Переместить» не существует в текущем контексте.

Это вообще возможно? Я не могу найти примеры других людей, использующих codeDOM таким образом.

Спасибо за помощь!


person microcontrolled    schedule 18.05.2015    source источник


Ответы (1)


Лучший способ сделать это — установить свойство ReferencedAssemblies в CompilerParameters как библиотеку, содержащую ваш дополнительный код.

var parameters = CompilerParameters
{
    ReferencedAssemblies = {
    "my.dll",
    // etc
    }
};

Вот более длинное сообщение в блоге на эту тему, включая ссылку на github http://danielslaterblog.blogspot.co.uk/2015/05/programming-programming-computer-game.html

person Daniel Slater    schedule 18.05.2015
comment
Если я создам библиотеку my.dll и добавлю в нее функцию Move(), то я смогу добавить ссылку на эту библиотеку в скомпилированный код пользователя, верно? Если я напишу Move() в этом контексте, сможет ли он получить доступ к переменным, сгенерированным во время выполнения, таким как структура подземелья? Я имею в виду, что основной предварительно скомпилированный код генерирует переменные, которые функция Move() должна проверять. Например, необходимо убедиться, что пользователь не пытается пройти сквозь стену. - person microcontrolled; 18.05.2015
comment
У меня есть пример того, как я делаю это дома. Сегодня выложу на гитхаб и ссылку сюда. - person Daniel Slater; 19.05.2015
comment
Спасибо, Даниил! Это очень великодушно с твоей стороны! - person microcontrolled; 20.05.2015
comment
Привет Даниил, я просмотрел ваш пост в блоге. Я думаю, это как раз то, что мне нужно. Я очень ценю время, которое вам потребовалось, чтобы напечатать свой пост и поделиться своей работой. Благодарю вас! - person microcontrolled; 21.05.2015