关于 System.CodeDom 命名空间,MSDN 对其做了如下描述:
.NET Framework 中包含一个名为“代码文档对象模型”(CodeDOM) 的机制,该机制使编写源代码的程序的开发人员可以在运行时,根据表示所呈现代码的单一模型,用多种编程语言生成源代码。
为表示源代码,CodeDOM 元素相互链接以形成一个数据结构(称为 CodeDOM 图),它以某种源代码的结构为模型。
System.CodeDom 命名空间定义可表示源代码逻辑结构(与具体的编程语言无关)的类型。System.CodeDom.Compiler 命名空间定义从 CodeDOM 图生成源代码的类型,以及在受支持的语言中管理源代码编译的类型。编译器供应商或开发人员可以扩展受支持语言的集合。
当程序需要用多种语言为程序模型或者为不确定的目标语言生成源代码时,与语言无关的源代码建模很有价值。例如,如果语言的 CodeDOM 支持可用,则一些设计器将 CodeDOM 用作语言抽象接口,以用正确的编程语言生成源代码。
.NET Framework 中包含 C#、JScript 和 Visual Basic 的代码生成器和代码编译器。
1.使用 CodeDOM 代码生成器生成源代码
代码生成图通常包含在 CodeCompileUnit 中。若要为包含 CodeDOM 图的 CodeCompileUnit 生成代码,请调用代码提供程序的 GenerateCodeFromCompileUnit 方法。此方法有一个可用来生成源代码的 TextWriter 参数,因此,有时需要首先创建一个可以写入的 TextWriter。下面的示例演示了如何从 CodeCompileUnit 生成代码以及如何将生成的源代码写入名为 HelloWorld.cs 的文件。
// 生成代码文件。
provider.GenerateCodeFromCompileUnit(compileunit, tw, new CodeGeneratorOptions());
// 关闭代码文件。
tw.Close();
return sourceFile;
}
2.使用 CodeDOM 代码提供程序编译程序集
下面的代码示例演示如何使用从 CodeDomProvider 类派生的 CodeDom 提供程序编译源文件。
// 定义编译参数。
CompilerParameters cp = new CompilerParameters();
// 添加需要引用的程序集。
cp.ReferencedAssemblies.Add( "System.dll" );
// 指定生成一个可执行文件(该参数为 false 时编译结果为一个 dll 文件)。
cp.GenerateExecutable = true;
// 设定要生成的程序集的名称。
cp.OutputAssembly = exeFile;
// 将程序集保存为一个磁盘文件(该参数为 true 时生成的程序集将保存在内存中)。
cp.GenerateInMemory = false;
// 执行编译操作。
CompilerResults cr = provider.CompileAssemblyFromFile(cp, sourceFile);
// if 条件成立时表示出现编译错误。
if(cr.Errors.Count > 0)
{
// 显示编译错误信息。
Console.WriteLine("Errors building {0} into {1}", sourceFile, cr.PathToAssembly);
foreach(CompilerError ce in cr.Errors)
{
Console.WriteLine(" {0}", ce.ToString());
Console.WriteLine();
}
}
else
{
Console.WriteLine("Source {0} built into {1} successfully.", sourceFile, cr.PathToAssembly);
}
//返回一个 bool 值以表示编译是否成功。
if (cr.Errors.Count > 0)
{
return false;
}
else
{
return true;
}
}