Сценарии XNA C # с помощью CSharpCodeProvider - PullRequest
4 голосов
/ 10 июля 2011

Я работаю над игрой в стиле RPG в XNA и работаю над созданием скриптового движка.

Я следовал нескольким учебникам, чтобы попытаться заставить это работать. В настоящее время я прочитал следующее из XML-файла:

namespace MyGame
{
  public class EngagedCode : ScriptingInterface.IScriptType1
  {
    public string RunScript()
    {
      ChangeFrame( 2 );
    }
  }
}

После того, как я успешно включил это в проект, я пытаюсь скомпилировать его с помощью следующего кода:

Microsoft.CSharp.CSharpCodeProvider csProvider = new Microsoft.CSharp.CSharpCodeProvider();

CompilerParameters options = new CompilerParameters();
options.GenerateExecutable = false; //DLL
options.GenerateInMemory = true;
options.IncludeDebugInformation = true;

options.ReferencedAssemblies.Add(Assembly.GetExecutingAssembly().Location);

CompilerResults result = csProvider.CompileAssemblyFromSource(options, code);

Однако в этот момент я всегда получаю следующую ошибку:

'result.CompiledAssembly' threw an exception of type 'System.IO.FileNotFoundException'

Кажется, что система не может найти .dll, которую я скомпилировал, и я не знаю почему. Я не знаю, как обойти эту ошибку. У кого-нибудь есть предложения?

Ответы [ 2 ]

4 голосов
/ 10 июля 2011

Даже если вы генерируете его в памяти, он все равно записывает .dll на диск, если у вас нет ошибок компиляции, а затем вы получаете это бесполезное исключение System.IO.FileNotFoundException.Так что, скорее всего, у вас есть ошибки компиляции.

Чтобы устранить эти ошибки компиляции, вам нужно добавить следующее.

CompilerResults results = csProvider.CompileAssemblyFromSource(parameters, textBox1.Text);

if (results.Errors.Count > 0)
{
    foreach (CompilerError CompErr in results.Errors)
    {
        //Hooray a list of compile errors
    }
    else
    {
        //Successful Compile
    }
}

Также, если вы хотите пропустить все это.Взгляните на этот класс .Это позволяет вам просто использовать тело метода, хотя этого может быть недостаточно.Также вам нужно будет изменить пространство имен в константной строке CodeStart.

1 голос
/ 10 июля 2011

Следующая строка не обязательна:

options.ReferencedAssemblies.Add(Assembly.GetExecutingAssembly().Location);
...