CodeDom编译器:类型或名称空间“ Foo”在名称空间“ System”中不存在

问题描述

| 我正在编写一个生成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?)
我是在正确添加这些引用,还是做错了什么?     

解决方法

        看起来您应该将参数传递给CompileAssemblyFromFile,而不是CompilerParameters的新实例。
var results = compiler.CompileAssemblyFromFile(parameters,Directory.GetFiles(\"Model\\\\Editable\").Concat(Directory.GetFiles(\"Model\\\\NotEditable\")).ToArray());
    ,        在示例代码中,您没有使用初始化的CompilerParameters。
var results = compiler.CompileAssemblyFromFile(parameters,Directory.GetFiles(\"Model\\\\Editable\").Concat(Directory.GetFiles(\"Model\\\\NotEditable\")).ToArray());