使用CompilerParameters引用当前程序集

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

之前将Lua实现到C ++之后,我并不是一个将脚本function实现到项目中的新手。 但是,我们希望尝试使用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; } } } } 

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

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

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

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

您可以获取可执行文件并将其传递给CompilerParameters:

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