在运行时编译 C#
本文关键字:编译 运行时 | 更新日期: 2023-09-27 17:56:17
我想在我的游戏中实现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"命名空间中定义的对象?
这是一个日常编程问题。 它不起作用,您认为它应该起作用。 所以分解一下。 与其处理一个大问题,不如处理一个小问题。 只需解决尝试在程序之外编译脚本的问题即可。 一旦你开始工作,那么你可以尝试从程序内部将其编译为脚本,知道你已经解决了引用和编译器问题的基本问题。
像这样:
从csc/reference:ConsoleApplication1.exe script.cs
外观上看,它可能就像将引用从 ConsoleApplication2.exe
更改为 ConsoleApplication1.exe
一样简单。