Компилятор CSharpCodeProvider не распознает родительский класс в скрипте - PullRequest
0 голосов
/ 06 января 2020

Я установил простое консольное приложение

В 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: Предложения от комментарии

Я создал новый библиотечный проект в своем решении, добавил к нему пустой public class BaseClass, добавил ссылку на него в Program.cs.

enter image description here

И это то, что я изменил в Program.cs

        var compileOptions = new CompilerParameters();
        var assembliesPath = AppDomain.CurrentDomain.BaseDirectory;
        compileOptions.ReferencedAssemblies.Add(assembliesPath + "TestLibrary.dll");
        compileOptions.GenerateInMemory = true;

Я перестроил оба проекта, но я по-прежнему получаю ту же ошибку.

1 Ответ

0 голосов
/ 06 января 2020

Решением является «РЕДАКТИРОВАТЬ 1: Предложения из комментариев» в моем вопросе в сочетании с моим последним комментарием «Я забыл добавить« использование TestLibrary »; в верхней части моего сценария. ", это будет выглядеть так

        var scriptText = @"
            using TestLibrary; // <- this line here
            namespace TestingInConsole
            {
                public class Test : BaseClass
                {
                }
            }";
...