本文内容

  1. 使用 CodeDOM 代码提供程序生成源代码
  2. 使用 CodeDOM 代码提供程序编译程序集
  3. 获得初始支持的语言
  4. 请参阅

System.CodeDom.Compiler 命名空间提供了从 CodeDOM 对象图生成源代码和用受支持的编译器管理编译的接口。 代码提供程序可根据 CodeDOM 图,用某种编程语言生成源代码。 从 CodeDomProvider 派生的类通常可以提供一些方法,用于生成和编译提供程序支持的语言代码。

使用 CodeDOM 代码提供程序生成源代码

若要用某种语言生成源代码,需要一个表示要生成的源代码的结构的 CodeDOM 图。
下面的示例演示如何创建 CSharpCodeProvider 的实例:

  1. CSharpCodeProvider provider = new CSharpCodeProvider();

代码生成图通常包含在 CodeCompileUnit 中。 若要为包含 CodeDOM 图的 CodeCompileUnit 生成代码,请调用代码提供程序的 方法。 此方法有一个可用于生成源代码的 TextWriter 参数,因此,有时需要首先创建一个可以写入的 TextWriter。 下面的示例演示了如何从 CodeCompileUnit 生成代码以及如何将生成的源代码写入名为 HelloWorld.cs 的文件。

  1. public static string GenerateCSharpCode(CodeCompileUnit compileunit)
  2. {
  3. // Generate the code with the C# code provider.
  4. CSharpCodeProvider provider = new CSharpCodeProvider();
  5. // Build the output file name.
  6. string sourceFile;
  7. if (provider.FileExtension[0] == '.')
  8. {
  9. sourceFile = "HelloWorld" + provider.FileExtension;
  10. }
  11. else
  12. {
  13. sourceFile = "HelloWorld." + provider.FileExtension;
  14. }
  15. // Create a TextWriter to a StreamWriter to the output file.
  16. using (StreamWriter sw = new StreamWriter(sourceFile, false))
  17. {
  18. IndentedTextWriter tw = new IndentedTextWriter(sw, " ");
  19. // Generate source code using the code provider.
  20. provider.GenerateCodeFromCompileUnit(compileunit, tw,
  21. new CodeGeneratorOptions());
  22. // Close the output file.
  23. tw.Close();
  24. }
  25. return sourceFile;
  26. }

使用 CodeDOM 代码提供程序编译程序集

调用编译
若要使用 CodeDom 提供程序编译程序集,则要编译的源代码的语言必须适用于编辑器,或者具有能够生成要编译的源代码的 CodeDOM 图。
如果从 CodeDOM 图进行编译,请将包含该图的 CodeCompileUnit 传递给代码提供程序的 CompileAssemblyFromDom 方法。 如果具有采用编译器可以理解的语言编写的源代码文件,请将包含源代码的文件的名称传递给 CodeDom 提供程序的 CompileAssemblyFromFile 方法。 也可以将字符串(其中包含使用编译器可以理解的语言编写的源代码)传递给 CodeDom 提供程序的 CompileAssemblyFromSource 方法。
配置编译参数
CodeDom 提供程序的所有标准编译-调用方法都有一个 CompilerParameters 类型的参数,指示用于编译的选项。
可以在 CompilerParameters 的 OutputAssembly 属性中指定输出程序集的文件名。 否则,将使用默认的输出文件名。
默认情况下,新的 CompilerParameters 在初始化时,其 属性将设置为 false。 如果编译可执行程序,必须将 GenerateExecutable 属性设置为 true 。 GenerateExecutable 设置为 false 时,编译器将生成类库。
如果要从 CodeDOM 图编译可执行文件,则必须在该图中定义 CodeEntryPointMethod。 如果有多个代码入口点,可能需要将 MainClassMainClass 属性设置为定义要使用的入口点的类名。
若要将调试信息包含在生成的可执行文件中,请将 IncludeDebugInformation 属性设置为 true。
如果项目引用了任何程序集,必须将作为 StringCollection 中的项的程序集名称指定为调用编译时使用的 StringCollectionReferencedAssemblies 属性。
通过将 GenerateInMemory 属性设置为 true,可以编译写入内存而不是磁盘中的程序集。 在内存中生成程序集时,代码可从 CompilerResultsCompiledAssembly 属性中获取对生成的程序集的引用。 如果程序集写入磁盘,可从 PathToAssemblyPathToAssembly 属性中获取生成的程序集的路径。
若要指定在调用编译进程时使用的自定义命令行参数字符串,请在 CompilerOptions 属性中设置该字符串。
如果在调用编译器进程时需要 Win32 安全令牌,请在 UserToken 属性中指定该令牌。
若要将 Win32 资源文件链接到编译的程序集,请在 Win32Resource 属性中指定该 Win32 资源文件的名称。
若要指定暂停编译的警告等级,请将 WarningLevel 属性设置为一个整数,表示暂停编译的警告等级。 也可以通过将 TreatWarningsAsErrors 属性设置为 true,将编译器配置为在遇到警告时暂停编译。
下面的代码示例演示如何使用从 CodeDomProvider 类派生的 CodeDom 提供程序编译源文件。

  1. public static bool CompileCSharpCode(string sourceFile, string exeFile)
  2. {
  3. CSharpCodeProvider provider = new CSharpCodeProvider();
  4. // Build the parameters for source compilation.
  5. CompilerParameters cp = new CompilerParameters();
  6. // Add an assembly reference.
  7. cp.ReferencedAssemblies.Add( "System.dll" );
  8. // Generate an executable instead of
  9. // a class library.
  10. cp.GenerateExecutable = true;
  11. // Set the assembly file name to generate.
  12. cp.OutputAssembly = exeFile;
  13. // Save the assembly as a physical file.
  14. cp.GenerateInMemory = false;
  15. // Invoke compilation.
  16. CompilerResults cr = provider.CompileAssemblyFromFile(cp, sourceFile);
  17. if (cr.Errors.Count > 0)
  18. {
  19. // Display compilation errors.
  20. Console.WriteLine("Errors building {0} into {1}",
  21. sourceFile, cr.PathToAssembly);
  22. foreach (CompilerError ce in cr.Errors)
  23. {
  24. Console.WriteLine(" {0}", ce.ToString());
  25. Console.WriteLine();
  26. }
  27. }
  28. else
  29. {
  30. Console.WriteLine("Source {0} built into {1} successfully.",
  31. sourceFile, cr.PathToAssembly);
  32. }
  33. // Return the results of compilation.
  34. if (cr.Errors.Count > 0)
  35. {
  36. return false;
  37. }
  38. else
  39. {
  40. return true;
  41. }
  42. }

获得初始支持的语言

.NET framework 提供下列语言的代码编译器和代码生成器:C#、Visual Basic、C++ 和 JScript。 通过实现特定语言的代码生成器和代码编译器,CodeDOM 支持可以扩展到其他语言。

请参阅