3

I'm writing a tool that generates C# code, and am writing unit tests to go with it.

One of the tests I want to do is to run the tool and compile the results, so I can examine the assembly with reflection. However, I am having trouble doing this. My current code looks like this:

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());
}

The exception is not normally part of the test, but just allows me to view what errors are spit out. Sadly, the errors I'm hitting are along the lines of:

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?)

Am I adding these references correctly, or am I doing something wrong?

Mike Caron
  • 14,351
  • 4
  • 49
  • 77

2 Answers2

3

Looks like you should pass parameters to CompileAssemblyFromFile, not a new instance of CompilerParameters.

var results = compiler.CompileAssemblyFromFile(parameters, Directory.GetFiles("Model\\Editable").Concat(Directory.GetFiles("Model\\NotEditable")).ToArray());
CodeNaked
  • 40,753
  • 6
  • 122
  • 148
1

In your sample code, you are not using the CompilerParameters you initialized.

var results = compiler.CompileAssemblyFromFile(parameters, Directory.GetFiles("Model\\Editable").Concat(Directory.GetFiles("Model\\NotEditable")).ToArray());
agent-j
  • 27,335
  • 5
  • 52
  • 79