C# 使用现有类型编译运行时C脚本

C# 使用现有类型编译运行时C脚本,c#,C#,我真的不确定我选对了标题。 但在这里,我将尝试解释我想做的细节 目前我正在为自己的游戏开发简单的2d游戏引擎。 假设我有4门课: 场景和场景对象:场景类中有SceneObject[]Objects变量,表示场景中的对象SceneObject可以是文本、图像、按钮等。对于文本,它将是SceneObject.text;对于图像,它将是SceneObject.image等等。 ContentManager:处理SceneObject.image的图像源的类,所有图像都存储在此类中,其中图像为Syste

我真的不确定我选对了标题。 但在这里,我将尝试解释我想做的细节

目前我正在为自己的游戏开发简单的2d游戏引擎。 假设我有4门课:

场景和场景对象:场景类中有SceneObject[]Objects变量,表示场景中的对象SceneObject可以是文本、图像、按钮等。对于文本,它将是SceneObject.text;对于图像,它将是SceneObject.image等等。 ContentManager:处理SceneObject.image的图像源的类,所有图像都存储在此类中,其中图像为System.Drawing.image类型 日志:用于日志记录的简单类 我想要的是从C脚本加载SceneObject,但在该脚本中,我希望允许脚本编写器与ContentManager和我在项目中创建的所有类(如Log类)交互

下面是要在运行时编译的C代码的示例,假设其名为ExampleScript.cs:

using System;
using System.Collections.Generic;
using System.Text;

using Engine.Graphics;
using Engine.UI;

namespace Engine
{
    public class Example : Scene
    {
        public SceneObject.Button BtnExample;
        public SceneObject.Text LblExample;
        public Example()
        {
            // This will throw an exception if Example.png isn't exist in the ContentManager
            BtnExample = new SceneObject.Button(ContentManager.GetImage("Example.png"));
            LblExample = new SceneObject.Text("Hello World!");

            // This is the plus for C# Run-Time Code
            // Allow writer to add customization for each SceneObject
            BtnExample.Rotate(10);
            BtnExample.Color = Color.White;
            // and so on
            // I believe complicated effect / customization can be done easier than loading from plain text file (and it's somehow look cooler LOL)

            // Add it to "Objects" variable
            Add(LblExample, BtnExample);
            Log.WriteLine("SceneLoaded!");
        }
    }
}
然后我编译并得到所有SceneObject,如下所示:

try
{
    Script SceneScript = new Script("ExampleScript.cs");
    Scene Example = SceneScript.Compile();
    SceneObject[] Objects = Example.Objects;
}
catch (Exception ex)
{
    // Compile Error here
    // Something like "'Example.png' isn't exist in content manager"
}
那我该怎么做呢

我尝试在Google上搜索,但我发现的只是在运行时编译控制台应用程序,这对我来说是不够的:\


提前谢谢!:我建议你去图书馆看看。特别是,请看一下他们关于“类型共享”模式的文档,我认为这将完全满足您的需求,尽管您需要使用他们的运行库来实现这一点

谢谢您的帮助。这个问题在您的问题中有些不清楚。如何在运行时编译脚本?我希望脚本能够与我创建的类交互,如SceneObject、ContentManager等。如果我没有记错的话,您也可以在运行时使用roslyn编译脚本。这需要.net-4.5,如果您可以选择的话。不管怎样,这都是一个有趣的话题,你可以通过这样做将任何字符串编译成一个方法:要了解更多细节,请试试这个谢谢,那个线程对我帮助很大!文档使CS脚本看起来像一个完整的.NET运行时。它真的只是一个用于CuleLeCysFieldS源方法的包装器吗?它实际上只是一个包装器,但是除了我认为的基本包装器之外还有很多实用程序,但是DOC肯定有点误导。看起来也有一些对单声道和可选CLR的支持,尽管我不知道这有多深。