使用编译器参数引用当前程序集
本文关键字:前程 程序集 引用 参数 编译器 | 更新日期: 2023-09-27 18:34:40
现在我正在做一个项目,团队想要一种编写代码和编辑它的方法,而不必重新编译整个项目,所以我决定尝试实现一个脚本引擎。
之前在C++中实现Lua之后,我并不是一个在项目中实现脚本功能的新手。但是,我们希望尝试使用 Microsoft.CSharp 命名空间实现直接 C#,并结合已经内置到 C# 中的 System.Reflection。
因此,听说这个,我在文档中戳了一下,我想出了一个几乎可以工作的原型 - 但并不完全有效。
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(位于脚本命名空间内,因此位于当前程序集内( - 以便编译器中编写和解析的脚本可以访问它。显然,我添加了脚本.dll作为参数,但由于某种原因似乎无法访问它。我正在调试中运行它,所以这可能是一些主要面部法师的原因。怎么办?
有没有办法引用当前程序集并将其传递给编译器参数?还是我搞砸了/我应该依靠为脚本对象创建程序集/等?
它可能在错误的目录中查找。
传递typeof(Program).Assembly.CodeBase
以传递完整路径。
您可以获取可执行文件并将其传递给编译器参数:
string exeName = Assembly.GetEntryAssembly().Location;
param.ReferencedAssemblies.Add(exeName);