2

我构建了一个 CodeCompileUnit,下面的代码输出了一个 C# 源代码文件,一个 .dll,我可以从程序集中获取一个实例:

TextWriter tw = new IndentedTextWriter(new StreamWriter(filePath + ".cs", false), "    ");
provider.GenerateCodeFromCompileUnit(compileUnit, tw, new CodeGeneratorOptions());
tw.Close();

CompilerParameters cp = new CompilerParameters { GenerateInMemory = true, GenerateExecutable = false};
cp.ReferencedAssemblies.Add("MyProgram.exe");
cp.OutputAssembly = filePath + ".dll";
CompilerResults cr = provider.CompileAssemblyFromFile(cp, filePath + ".cs");

MyType instance = (MyType)Activator.CreateInstance(cr.CompiledAssembly.GetTypes()[0]);

到目前为止,一切都很好。现在我想避免生成这些文件:

CompilerParameters cp = new CompilerParameters { GenerateInMemory = true, GenerateExecutable = false};
cp.ReferencedAssemblies.Add("MyProgram.exe");
//cp.OutputAssembly = filePath + ".dll";
CompileResults cr = provider.CompileAssemblyFromDom(cp, compileUnit);

这会引发 FileNotFoundException。它在我的 \temp 文件夹中查找 x32savit.dll(或类似文件),但它不存在。如果我取消注释 OutputAssembly,它会失败,但在该路径上。

4

1 回答 1

4

原来是命名空间的错误。这里有一个很好的例子。

在调试时添加以下代码非常有帮助。

  string errorText = String.Empty;
  foreach (CompilerError compilerError in compilerResults.Errors)
      errorText += compilerError + "\n";
于 2012-06-28T23:45:50.990 回答