CSharpCodeProvider 编译器无法识别脚本中的父类
Posted
技术标签:
【中文标题】CSharpCodeProvider 编译器无法识别脚本中的父类【英文标题】:CSharpCodeProvider compiler not recognizing parent class in script 【发布时间】:2020-04-24 01:34:55 【问题描述】:我已经建立了一个简单的控制台应用程序
在Program.cs
中,我试图在继承基类的同时编译脚本
using Microsoft.CSharp;
using System;
using System.CodeDom.Compiler;
using System.Data;
namespace TestingInConsole
public class BaseClass
class Program
static void Main(string[] args)
var scriptText = @"
namespace TestingInConsole
public class Test : BaseClass
";
var compileOptions = new CompilerParameters();
compileOptions.GenerateInMemory = true;
var compiler = new CSharpCodeProvider();
var compileResult = compiler.CompileAssemblyFromSource(compileOptions, scriptText);
if (compileResult.Errors.Count > 0)
throw new Exception($"Error in script: compileResult.Errors[0].ErrorText\nLine: compileResult.Errors[0].Line");
var assembly = compileResult.CompiledAssembly;
dynamic script = assembly.CreateInstance($"TestingInConsole.Test");
// TODO: add Run() function to Test class
DataSet dataSetResult = script.Run();
但我得到了错误
System.Exception:“脚本错误:找不到类型或命名空间名称“BaseClass”(您是否缺少 using 指令或程序集引用?)行:4'
行后:if (compileResult.Errors.Count > 0)
问题
这样的 CSharpCodeProvider 脚本是否可以继承基类?
或者我应该在Program.cs
中创建新函数来检查脚本实例是否具有正确的函数(在其他情况下我会放在基类中)?
编辑 1:来自 cmets 的建议
我在我的解决方案中创建了新的库项目,向其中添加了空的 public class BaseClass
,在 Program.cs
中添加了对它的引用。
这就是我在Program.cs
中所做的更改
var compileOptions = new CompilerParameters();
var assembliesPath = AppDomain.CurrentDomain.BaseDirectory;
compileOptions.ReferencedAssemblies.Add(assembliesPath + "TestLibrary.dll");
compileOptions.GenerateInMemory = true;
我已经重建了这两个项目,但我仍然遇到同样的错误。
【问题讨论】:
我认为 MS 有一些关于将程序集动态加载到另一个的帮助页面——应该会告诉你如何去做。你需要一个我期望的 using 语句。 然后@Hogan 说了什么。将基础脚本添加到新的类库中,并在执行脚本时添加类库作为参考。 docs.microsoft.com/en-us/dotnet/api/… 这不是“JIT”,JIT 是运行时将您的 IL 字节码转换为 CPU 指令时所做的事情。 您必须做与在 IDE 项目中相同的操作,在 References 节点中添加一个条目。 Like this。是的,添加对您自己的 .exe 文件的引用就可以了。 我将再次强调,创建 DLL 不是必需的。但是现在您已经这样做了,我们无法再看到 DLL 是否存在于正确的目录中(msbuild 不再有帮助)以及您是否使用了正确的命名空间名称。如果错误完全相同,则可能是命名空间名称。 【参考方案1】:解决方案是我的问题中的“编辑 1:cmets 的建议”以及我的上一条评论“我忘记添加'使用 TestLibrary;'在我脚本的顶部。”,看起来像这样
var scriptText = @"
using TestLibrary; // <- this line here
namespace TestingInConsole
public class Test : BaseClass
";
【讨论】:
以上是关于CSharpCodeProvider 编译器无法识别脚本中的父类的主要内容,如果未能解决你的问题,请参考以下文章
csharpcodeprovider:不能使用 Process.Start()
编译 pygraphviz:无法识别的命令行选项 '-mno-cygwin'