Guide pratique pour créer un fichier de documentation XML à l’aide de CodeDOM

Vous pouvez utiliser CodeDOM pour créer du code qui génère de la documentation XML. Le processus implique la création du graphique CodeDOM qui contient les commentaires de documentation XML, la génération du code et la compilation du code généré avec l’option du compilateur qui crée la sortie de documentation XML.

Créer un graphique CodeDOM

  1. Créez un CodeCompileUnit contenant le graphique CodeDOM pour l’exemple d’application.

  2. Utilisez le constructeur CodeCommentStatement avec le paramètre docComment défini sur true pour créer les éléments et le texte de commentaires de documentation 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("</summary>", true));
    class1.Comments.Add(new CodeCommentStatement(
        @"<seealso cref=" + '"' + "Class1.Main" + '"' + "/>", 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));
    
    Dim class1 As 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("</summary>", True))
    class1.Comments.Add(New CodeCommentStatement( _
        "<seealso cref=" & ControlChars.Quote & "Class1.Main" & _
        ControlChars.Quote & "/>", True))
    
    ' Add the new type to the namespace type collection.
    samples.Types.Add(class1)
    
    ' Declare a new code entry point method.
    Dim start As 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))
    

Générer le code à partir de CodeCompileUnit

Utilisez la méthode GenerateCodeFromCompileUnit pour générer le code et créer un fichier source à compiler.

StreamWriter sourceFile = new StreamWriter(sourceFileName);
provider.GenerateCodeFromCompileUnit(cu, sourceFile, null);
sourceFile.Close();
Dim sourceFile As New StreamWriter(sourceFileName)

LogMessage("Generating code...")
provider.GenerateCodeFromCompileUnit(cu, sourceFile, Nothing)
sourceFile.Close()

Compiler le code et générer le fichier de documentation

Ajoutez l’option du compilateur /doc à la propriété CompilerOptions d’un objet CompilerParameters et passez l’objet à la méthode CompileAssemblyFromFile pour créer le fichier de documentation XML quand le code est compilé.

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);
Dim opt As 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"

Dim results As CompilerResults

LogMessage(("Compiling with " & providerName))
results = provider.CompileAssemblyFromFile(opt, sourceFileName)

Exemple

L’exemple de code suivant crée un graphique CodeDOM avec des commentaires de documentation, génère un fichier de code à partir du graphique, compile le fichier et crée un fichier de documentation XML associé.

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("</summary>", true));
            class1.Comments.Add(new CodeCommentStatement(
                @"<seealso cref=" + '"' + "Class1.Main" + '"' + "/>", 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);
            }
        }
    }
}
Imports System.CodeDom
Imports System.CodeDom.Compiler
Imports System.IO
Imports System.Text.RegularExpressions

Class Program
    Private Shared providerName As String = "vb"
    Private Shared sourceFileName As String = "test.vb"

    Shared Sub Main(ByVal args() As String)
        Dim provider As CodeDomProvider = _
            CodeDomProvider.CreateProvider(providerName)

        LogMessage("Building CodeDOM graph...")

        Dim cu As New CodeCompileUnit()

        cu = BuildHelloWorldGraph()

        Dim sourceFile As New StreamWriter(sourceFileName)

        LogMessage("Generating code...")
        provider.GenerateCodeFromCompileUnit(cu, sourceFile, Nothing)
        sourceFile.Close()

        Dim opt As 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"

        Dim results As CompilerResults

        LogMessage(("Compiling with " & providerName))
        results = provider.CompileAssemblyFromFile(opt, sourceFileName)

        OutputResults(results)
        If results.NativeCompilerReturnValue <> 0 Then
            LogMessage("")
            LogMessage("Compilation failed.")
        Else
            LogMessage("")
            LogMessage("Demo completed successfully.")
        End If
        File.Delete(sourceFileName)

    End Sub

    ' Build a Hello World program graph using System.CodeDom types.
    Public Shared Function BuildHelloWorldGraph() As CodeCompileUnit
        ' Create a new CodeCompileUnit to contain 
        ' the program graph.
        Dim compileUnit As New CodeCompileUnit()

        ' Declare a new namespace called Samples.
        Dim samples As 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.
        Dim class1 As 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("</summary>", True))
        class1.Comments.Add(New CodeCommentStatement( _
            "<seealso cref=" & ControlChars.Quote & "Class1.Main" & _
            ControlChars.Quote & "/>", True))

        ' Add the new type to the namespace type collection.
        samples.Types.Add(class1)

        ' Declare a new code entry point method.
        Dim start As 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.
        Dim csSystemConsoleType As New CodeTypeReferenceExpression( _
            "System.Console")

        ' Build a Console.WriteLine statement.
        Dim cs1 As 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.
        Dim cs2 As 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.
        Dim csReadLine As 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

    End Function 'BuildHelloWorldGraph

    Shared Sub LogMessage(ByVal [text] As String)
        Console.WriteLine([text])

    End Sub

    Shared Sub OutputResults(ByVal results As CompilerResults)
        LogMessage(("NativeCompilerReturnValue=" & _
            results.NativeCompilerReturnValue.ToString()))
        Dim s As String
        For Each s In results.Output
            LogMessage(s)
        Next s

    End Sub
End Class

L’exemple de code crée la documentation XML suivante dans le fichier HelloWorldDoc.xml.

<?xml version="1.0" ?>
<doc>
  <assembly>
    <name>HelloWorld</name>
  </assembly>
  <members>
    <member name="T:Samples.Class1">
      <summary>
        Create a Hello World application.
      </summary>
      <seealso cref="M:Samples.Class1.Main" />
    </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>

Compiler des autorisations

Cet exemple de code nécessite le jeu d’autorisations FullTrust pour s’exécuter correctement.

Voir aussi