Компиляция C # во время выполнения - PullRequest
0 голосов
/ 13 мая 2011

Я хочу реализовать C # в качестве языка сценариев в моей игре.

Моя проблема в том, что мой сценарий не будет компилироваться, если я хочу использовать классы, определенные в ядре игры (exe).

Сценарий выглядит следующим образом:

using System;
using ConsoleApplication1;

class Script
{
private static void Call()
{
    Console.WriteLine("called");
}

public static void Init()
{
    Console.WriteLine("Script");
    Call();
    GameObject myO; // THIS IS WHAT I WANT TO GET WORKED,
 //IF THIS IS COMMENTED OUT, IT COMPILES FINE, GAMEOBJECT
 // IS DEFINED IN THE "ConsoleApplication1" NAMESPACE.
}
}

Сценарий компилируется, как в примере MDX:

    static void Main(string[] args)
    {
        CodeDomProvider provider = new CSharpCodeProvider();
        CompilerParameters cp = new CompilerParameters();
        //cp.CompilerOptions = "/target:library";
        cp.GenerateExecutable = false;
        cp.GenerateInMemory = true;
        cp.IncludeDebugInformation = false;
        cp.ReferencedAssemblies.Add("ConsoleApplication2.exe");
        cp.ReferencedAssemblies.Add("System.dll");
        CompilerResults cr = provider.CompileAssemblyFromFile(cp, "script.cs");
        if (!cr.Errors.HasErrors)
        {
            Console.WriteLine("Success");
            cr.CompiledAssembly.GetType("Script").GetMethod("Init").Invoke(null, null);
        }
        Console.ReadLine();
    }

Есть ли способ вызова функций или создания объектов, определенных вПространство имен "ConsoleApplication1" через скрипт?

1 Ответ

2 голосов
/ 13 мая 2011

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

Что-то вроде:

csc /reference:ConsoleApplication1.exe script.cs

Судя по всему, это может быть так же просто, как изменить ссылку с ConsoleApplication2.exe на ConsoleApplication1.exe.

...