C# 使用编译器参数引用当前程序集

C# 使用编译器参数引用当前程序集,c#,reflection,scripting,C#,Reflection,Scripting,现在我正在做一个项目,团队想要一种不用重新编译整个项目就可以编写和编辑代码的方法,所以我决定尝试实现一个脚本引擎 以前,将Lua实现为C++,我不是一个将脚本能力实现到项目中的新手。但是,我们希望尝试使用Microsoft.CSharp名称空间,结合已经内置到C#中的System.Reflection来实现直接的C# 听到这个消息后,我在文档中翻了翻,我找到了一个几乎可以工作的原型,但不太可能 using System; using System.Collections.Generic; usi

现在我正在做一个项目,团队想要一种不用重新编译整个项目就可以编写和编辑代码的方法,所以我决定尝试实现一个脚本引擎

以前,将Lua实现为C++,我不是一个将脚本能力实现到项目中的新手。但是,我们希望尝试使用Microsoft.CSharp名称空间,结合已经内置到C#中的System.Reflection来实现直接的C#

听到这个消息后,我在文档中翻了翻,我找到了一个几乎可以工作的原型,但不太可能

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;
            }
        }
    }
}
目前的问题是,我希望能够引用我的接口-IScript.cs(它位于脚本名称空间内,因此是当前程序集),以便在编译器中编写和解析的脚本可以访问它。显然,我添加了Scripting.dll作为参数,但由于某种原因,它似乎无法访问。我正在调试中运行它,所以这可能是一些主要的facepalmage的原因。你怎么办


是否有方法引用当前程序集并将其传递给编译器参数?或者我真的完蛋了/我应该依赖于为脚本对象创建程序集吗/etc?

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


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

您可以获取可执行文件并将其传递给编译器参数:

       string exeName = Assembly.GetEntryAssembly().Location;      
       param.ReferencedAssemblies.Add(exeName); 

你的脚本都在一行上;考虑调用<代码> AppEndie()/<代码>。(并不是说这会有什么不同)