MSDN: 如何:为 CodeDOM 生成的应用程序创建 XML 文档文件
如何:为 CodeDOM 生成的应用程序创建 XML 文档文件
.NET Framework 4
CodeDOM 可用于创建生成 XML 文档的代码。 该进程包括创建包含 XML 文档注释的 CodeDOM 关系图、生成代码和通过创建 XML 文档输出的编译器选项编译生成的代码。
创建包含 XML 文档注释的 CodeDOM 关系图
-
为示例应用程序创建包含 CodeDOM 关系图的 CodeCompileUnit。
-
使用 CodeCommentStatement 构造函数(docComment 参数设置为 true)创建 XML 文档注释元素和文本。
CodeTypeDeclaration class1 = new CodeTypeDeclaration("Class1"); class1.Comments.Add(new CodeCommentStatement("<summary>", true)); class1.Comments.Add(new CodeCommentStatement( "Create a Hello World application.", true)); class1.Comments.Add(new CodeCommentStatement( @"<seealso cref=" + '"' + "Class1.Main" + '"' + "/>", true)); class1.Comments.Add(new CodeCommentStatement("</summary>", true)); // Add the new type to the namespace type collection. samples.Types.Add(class1); // Declare a new code entry point method. CodeEntryPointMethod start = new CodeEntryPointMethod(); start.Comments.Add(new CodeCommentStatement("<summary>", true)); start.Comments.Add(new CodeCommentStatement( "Main method for HelloWorld application.", true)); start.Comments.Add(new CodeCommentStatement( @"<para>Add a new paragraph to the description.</para>", true)); start.Comments.Add(new CodeCommentStatement("</summary>", true));
从 CodeCompileUnit 生成代码
-
使用 GenerateCodeFromCompileUnit 方法生成代码并创建要编译的源文件。
StreamWriter sourceFile = new StreamWriter(sourceFileName); provider.GenerateCodeFromCompileUnit(cu, sourceFile, null); sourceFile.Close();
编译代码和生成文档文件
-
将 /doc 编译器选项添加到 CompilerParameters 对象的 CompilerOptions 属性中,然后将该对象传递给 CompileAssemblyFromFile 方法,以便在编译代码后创建 XML 文档文件。
CompilerParameters opt = new CompilerParameters(new string[]{ "System.dll" }); opt.GenerateExecutable = true; opt.OutputAssembly = "HelloWorld.exe"; opt.TreatWarningsAsErrors = true; opt.IncludeDebugInformation = true; opt.GenerateInMemory = true; opt.CompilerOptions = "/doc:HelloWorldDoc.xml"; CompilerResults results; LogMessage("Compiling with " + providerName); results = provider.CompileAssemblyFromFile(opt, sourceFileName);
下面的代码示例创建了一个包含文档注释的 CodeDOM 关系图,然后从该关系图生成一个代码文件,之后编译了该文件并创建了一个关联的 XML 文档文件。
using System; using System.CodeDom; using System.CodeDom.Compiler; using System.IO; using System.Text.RegularExpressions; namespace BasicCodeDomApp { class Program { static string providerName = "cs"; static string sourceFileName = "test.cs"; static void Main(string[] args) { CodeDomProvider provider = CodeDomProvider.CreateProvider(providerName); LogMessage("Building CodeDOM graph..."); CodeCompileUnit cu = new CodeCompileUnit(); cu = BuildHelloWorldGraph(); StreamWriter sourceFile = new StreamWriter(sourceFileName); provider.GenerateCodeFromCompileUnit(cu, sourceFile, null); sourceFile.Close(); CompilerParameters opt = new CompilerParameters(new string[]{ "System.dll" }); opt.GenerateExecutable = true; opt.OutputAssembly = "HelloWorld.exe"; opt.TreatWarningsAsErrors = true; opt.IncludeDebugInformation = true; opt.GenerateInMemory = true; opt.CompilerOptions = "/doc:HelloWorldDoc.xml"; CompilerResults results; LogMessage("Compiling with " + providerName); results = provider.CompileAssemblyFromFile(opt, sourceFileName); OutputResults(results); if (results.NativeCompilerReturnValue != 0) { LogMessage(""); LogMessage("Compilation failed."); } else { LogMessage(""); LogMessage("Demo completed successfully."); } File.Delete(sourceFileName); } // Build a Hello World program graph using // System.CodeDom types. public static CodeCompileUnit BuildHelloWorldGraph() { // Create a new CodeCompileUnit to contain // the program graph. CodeCompileUnit compileUnit = new CodeCompileUnit(); // Declare a new namespace called Samples. CodeNamespace samples = new CodeNamespace("Samples"); // Add the new namespace to the compile unit. compileUnit.Namespaces.Add(samples); // Add the new namespace import for the System namespace. samples.Imports.Add(new CodeNamespaceImport("System")); // Declare a new type called Class1. CodeTypeDeclaration class1 = new CodeTypeDeclaration("Class1"); class1.Comments.Add(new CodeCommentStatement("<summary>", true)); class1.Comments.Add(new CodeCommentStatement( "Create a Hello World application.", true)); class1.Comments.Add(new CodeCommentStatement( @"<seealso cref=" + '"' + "Class1.Main" + '"' + "/>", true)); class1.Comments.Add(new CodeCommentStatement("</summary>", true)); // Add the new type to the namespace type collection. samples.Types.Add(class1); // Declare a new code entry point method. CodeEntryPointMethod start = new CodeEntryPointMethod(); start.Comments.Add(new CodeCommentStatement("<summary>", true)); start.Comments.Add(new CodeCommentStatement( "Main method for HelloWorld application.", true)); start.Comments.Add(new CodeCommentStatement( @"<para>Add a new paragraph to the description.</para>", true)); start.Comments.Add(new CodeCommentStatement("</summary>", true)); // Create a type reference for the System.Console class. CodeTypeReferenceExpression csSystemConsoleType = new CodeTypeReferenceExpression("System.Console"); // Build a Console.WriteLine statement. CodeMethodInvokeExpression cs1 = new CodeMethodInvokeExpression( csSystemConsoleType, "WriteLine", new CodePrimitiveExpression("Hello World!")); // Add the WriteLine call to the statement collection. start.Statements.Add(cs1); // Build another Console.WriteLine statement. CodeMethodInvokeExpression cs2 = new CodeMethodInvokeExpression( csSystemConsoleType, "WriteLine", new CodePrimitiveExpression( "Press the ENTER key to continue.")); // Add the WriteLine call to the statement collection. start.Statements.Add(cs2); // Build a call to System.Console.ReadLine. CodeMethodInvokeExpression csReadLine = new CodeMethodInvokeExpression(csSystemConsoleType, "ReadLine"); // Add the ReadLine statement. start.Statements.Add(csReadLine); // Add the code entry point method to // the Members collection of the type. class1.Members.Add(start); return compileUnit; } static void LogMessage(string text) { Console.WriteLine(text); } static void OutputResults(CompilerResults results) { LogMessage("NativeCompilerReturnValue=" + results.NativeCompilerReturnValue.ToString()); foreach (string s in results.Output) { LogMessage(s); } } } }
该代码示例在 HelloWorldDoc.xml 文件中创建了下面的 XML 文档。
<?xml version="1.0" ?>
<doc>
<assembly>
<name>HelloWorld</name>
</assembly>
<members>
<member name="T:Samples.Class1">
<summary>
Create a Hello World application.
<seealso cref="M:Samples.Class1.Main" />
</summary>
</member>
<member name="M:Samples.Class1.Main">
<summary>
Main method for HelloWorld application.
<para>Add a new paragraph to the description.</para>
</summary>
</member>
</members>
</doc>

浙公网安备 33010602011771号