CSharpCodeProvider не видит класс Stack<T> в System.Collections.Generic.

Я строю псевдокод переводчик и компилятор. Он переводит псевдокод в код, выполняя несколько строковых операций, затем использует CSharpCodeProvider класс для компиляции, и, наконец, он пытается запустить его.

После нескольких тестов, в случае, если переведенный / выходной код выглядит следующим образом:

using System;
using System.Collections.Generic;

public class TranslatedProgram
{
    public static void ReadLine(ref int destiny)
    {
        destiny = int.Parse(Console.ReadLine());
    }
    public static void InsertInStack(ref Stack<int> originalStack, int value)
    {
        Console.WriteLine("Inserting the value " + value + " to the stack.");
        originalStack.Push(value);
        foreach (int current in originalStack)
        {
            Console.WriteLine("|" + current);
        }
        Console.WriteLine("_______");
    }
    public static void Main()
    {
        int value = new int();
        Stack<int> data = new Stack<int>();
        ReadLine(ref value);
        InsertInStack(ref data, value);
    }
}

Когда приложение отправляет этот код в CSharpCodeProvider, оно не компилируется. В compilerResults я получаю следующую ошибку: "Не удалось найти тип или имя пространства имен" Стек "(отсутствует директива using или ссылка на сборку?)" (CS0246)

НО, когда я помещаю этот код, как он есть, в новый проект из VS IDE, он работает отлично.

Есть предположения?

Благодарю.

Редактировать:

Я вызываю компилятор CSharpCodeProvider из VB, выполняя следующие действия:

Private Sub CompileButton_Click(sender As Object, e As EventArgs) Handles CompileButton.Click
        If ApplicationSaveFileDialog.ShowDialog = Windows.Forms.DialogResult.OK Then
            Dim Compiler As New Microsoft.CSharp.CSharpCodeProvider
            Dim Results As System.CodeDom.Compiler.CompilerResults
            Results = Compiler.CompileAssemblyFromSource(New CodeDom.Compiler.CompilerParameters With {.GenerateExecutable = True, .OutputAssembly = ApplicationSaveFileDialog.FileName}, CodeTextBox.Text)
            If Results.Errors.Count = 0 Then
                Shell(ApplicationSaveFileDialog.FileName)
            Else
                For Each Exception As System.CodeDom.Compiler.CompilerError In Results.Errors
                    ExceptionsTextBox.AppendText(Exception.ErrorText)
                Next
            End If
        End If
    End Sub

Как я могу включить ссылку на System.dll?

1 ответ

Решение

Убедитесь, что при компиляции у вас есть ссылка на dll, которая содержит Stack<>, который System.dll,

Вы можете добавить ссылку, используя свойство ReferencedAssemblies из CompilerParameters учебный класс:

CompilerParameters cp = new CompilerParameters();
cp.ReferencedAssemblies.Add("System.dll");
CSharpCodeProvider provider = new CSharpCodeProvider();
CompilerResults cr = provider.CompileAssemblyFromFile(cp, "MyFile.cs");
Другие вопросы по тегам