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'

使用 MinGW 编译 - 无法识别的命令行选项

Groovy 编译错误:无法识别的 Windows 套接字错误

如何从嵌入式资源中提取文件并将其保存到磁盘?

使用 Csharpcodeprovider 创建 DLL 并向其添加资源