Компилятор CodeDom: тип или пространство имен 'Foo' не существует в пространстве имен 'System' - PullRequest
2 голосов
/ 23 июня 2011

Я пишу инструмент, который генерирует код C #, и пишу модульные тесты, чтобы пойти с ним.

Один из тестов, которые я хочу выполнить, - запустить инструмент и скомпилировать результаты, чтобы я мог проверить сборку с помощью отражения. Однако у меня возникли проблемы с этим. Мой текущий код выглядит так:

var args = new Dictionary<string, string> { { "CompilerVersion", "v4.0" } };
var compiler = new CSharpCodeProvider();

var parameters = new CompilerParameters();
parameters.GenerateInMemory = true;
parameters.ReferencedAssemblies.Add("System.dll");
parameters.ReferencedAssemblies.Add("System.Core.dll");
parameters.ReferencedAssemblies.Add("System.Data.dll");
parameters.ReferencedAssemblies.Add("System.Data.DataSetExtensions.dll");
parameters.ReferencedAssemblies.Add("System.Xml.dll");
parameters.ReferencedAssemblies.Add("System.Xml.Linq.dll");

var results = compiler.CompileAssemblyFromFile(new CompilerParameters(), Directory.GetFiles("Model\\Editable").Concat(Directory.GetFiles("Model\\NotEditable")).ToArray());

if (results.Errors.Count > 0) {
    StringBuilder sb = new StringBuilder();

    foreach (CompilerError err in results.Errors) {
        sb.AppendLine(err.FileName + "(" + err.Line + ":" + err.Column + "): " + err.ErrorText);
    }

    throw new Exception(sb.ToString());
}

Исключение, как правило, не является частью теста, а просто позволяет мне увидеть, какие ошибки выплевываются. К сожалению, ошибки, которые я поражаю, имеют следующий вид:

c:\<redacted>\bin\Debug\Model\NotEditable\Computer.cs(5:14): The type or namespace name 'Linq' does not exist in the namespace 'System' (are you missing an assembly reference?)
c:\<redacted>\bin\Debug\Model\NotEditable\Computer.cs(6:14): The type or namespace name 'Data' does not exist in the namespace 'System' (are you missing an assembly reference?)
c:\<redacted>\bin\Debug\Model\NotEditable\Computer.cs(7:14): The type or namespace name 'Data' does not exist in the namespace 'System' (are you missing an assembly reference?)
c:\<redacted>\bin\Debug\Model\NotEditable\Computer.cs(8:14): The type or namespace name 'ComponentModel' does not exist in the namespace 'System' (are you missing an assembly reference?)

Я правильно добавляю эти ссылки или делаю что-то не так?

Ответы [ 2 ]

2 голосов
/ 23 июня 2011

Похоже, вы должны передавать параметры в CompileAssemblyFromFile, а не в новый экземпляр CompilerParameters.

var results = compiler.CompileAssemblyFromFile(parameters, Directory.GetFiles("Model\\Editable").Concat(Directory.GetFiles("Model\\NotEditable")).ToArray());
1 голос
/ 23 июня 2011

В вашем примере кода вы не используете инициализированные вами параметры компилятора.

var results = compiler.CompileAssemblyFromFile(parameters, Directory.GetFiles("Model\\Editable").Concat(Directory.GetFiles("Model\\NotEditable")).ToArray());
...