使用CompilerParameters引用当前程序集

Dan*_*try 10 c# reflection scripting

现在我正在开发一个项目,团队想要一种编写代码并编辑它的方法,而不必重新编译整个项目,所以我决定尝试实现一个脚本引擎.

之前将Lua实现到C++之后,我并不是一个将脚本功能实现到项目中的新手.但是,我们希望尝试使用Microsoft.CSharp命名空间直接实现C#,并结合已内置于C#的System.Reflection.

所以听说过这个,我在文档中讨论过,我已经提出了ALMOST工作的原型 - 但并不完全.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.CSharp;
using System.CodeDom.Compiler;
using System.Reflection;

namespace Scripting
{
    class Program
    {
        static void Main(string[] args)
        {
            StringBuilder builder = new StringBuilder();
            builder.Append("using System;");
            builder.Append("using Scripting;");
            builder.Append("class MyScript : IScript");
            builder.Append("{");
            builder.Append("    string ScriptName");
            builder.Append("    {");
            builder.Append("        get { return \"My Script\"; }");
            builder.Append("    }");

            builder.Append("    public bool Initialize()");
            builder.Append("    {");
            builder.Append("        Console.WriteLine(\"Hello, World!\");");
            builder.Append("        return true;");
            builder.Append("    }");
            builder.Append("}");

            CSharpCodeProvider provider = new CSharpCodeProvider();
            CompilerParameters param = new CompilerParameters(new string[] { "System.dll", "Scripting.dll" });
            param.GenerateInMemory = true;
            param.GenerateExecutable = true;
            CompilerResults result = provider.CompileAssemblyFromSource(param, builder.ToString());
            if (result.Errors.Count > 0)
            {
                foreach (CompilerError error in result.Errors)
                    Console.WriteLine(error);
                Console.ReadKey();
                return;
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我现在遇到的问题是我希望能够引用我的接口--IScript.cs(它位于Scripting命名空间内,因此是当前程序集) - 以便在编译器中编写和解析的脚本可以访问它.显然,我添加了Scripting.dll作为参数,但似乎无法出于某种原因访问它.我正在调试运行它,这可能是导致一些重大facepalmage.做什么?

有没有办法引用当前程序集并将其传递给CompilerParameters?或者我是王室搞砸/我应该依靠为脚本对象/等创建程序集?

SLa*_*aks 5

它可能在错误的目录中查找.

传递typeof(Program).Assembly.CodeBase完整路径.