【问题标题】:How to Import documentation from .xml file to .cs file programmatically?如何以编程方式将文档从 .xml 文件导入 .cs 文件?
【发布时间】:2019-06-10 17:28:18
【问题描述】:

我在 .xml 文件中保存了如下所示的文档:

<?xml version="1.0"?>
<doc>
    <assembly>
        <name>ClassLibrary2</name>
    </assembly>
    <members>
        <member name="T:ClassLibrary2.Class1">
            <summary>
            Class1 Dummy documentation
            </summary>
        </member>
        <member name="M:ClassLibrary2.Class1.Func1">
            <summary>
            Func1 Dummy documentation
            </summary>
        </member>
    </members>
</doc>

而且我不会将文档导入到如下所示的 .cs 文件中:

namespace ClassLibrary2
{
    public class Class1
    {
        void Func1()
        {

        }
    }
}

这样在我导入后我的文件将如下所示:

namespace ClassLibrary2
{
    /// <summary>
    /// Class1 Dummy documentation
    /// </summary>
    public class Class1
    {
        /// <summary>
        /// Func1 Dummy documentation
        /// </summary>
        void Func1()
        {

        }
    }
}

如何以编程方式执行此操作?

我应该使用CodeDOM 还是Visual Studio?或Roslyn 或其他工具?

任何帮助将不胜感激,

提前致谢。

【问题讨论】:

  • 有趣...过去是从 .cs 文件中剥离出来的吗?我只看到了从 .cs 文件本身生成的 XML。
  • 这个问题可能会导致xy problem
  • @BrootsWaymb 确实,文档是从 .CS 文件中获取的,但它被意外删除了,并且保留在 XML 文件中,现在需要返回。这是一个非常大量的文档。
  • 通常 xml 文档是从 .cs 文件创建的。你也有dll还是只有xml文件?如果你有 dll,你可以使用反编译器来获取代码。例如 ILSPY
  • 我很惊讶这个问题没有被问过一百次。另一个例子:*.com/questions/13333211/… 用例:一家公司拥有私有软件,将 cmets 导出为 XML,通过 SandCastle 发布文档。无法访问源代码的人希望帮助修复文档。为了避免复制/粘贴到代码源的两步过程,最好从 XML 重新生成内联代码 cmets。这个线程上的一个答案是不完整的。找到/创建一个实际的解决方案会很好。

标签: c# visual-studio documentation


【解决方案1】:

使用 CodeDom,Roslyn 是编译器平台,不会帮助您解决问题。

  1. 将 cs 加载到代码域图中
  2. 在图中找到方法/属性并添加 CodeCommentStatement - 见https://docs.microsoft.com/en-us/dotnet/framework/reflection-and-codedom/how-to-create-an-xml-documentation-file-using-codedom
  3. 从图中生成一个新的源文件(示例在我提供的链接中)

编辑: 也许使用roslyn的Microsoft.CodeAnalysis(添加Microsoft.CodeAnalysis.CSharp nuget包)库更容易

var syntaxTree= CSharpSyntaxTree.ParseText(code);

//search for the methods and properties and add comments
// ** your code **
//

//getting the  new sourcecode
var root = (CompilationUnitSyntax)syntaxTree.GetRoot();
var mc= new ModelCollector();
mc.Visit(root);

string newCode = JsonConvert.SerializeObject(mc.models);

以下是创建新 cmets 的方法: https://docs.microsoft.com/en-us/dotnet/api/microsoft.codeanalysis.csharp.syntaxfactory.comment?view=roslyn-dotnet

lib 的完整文档: https://docs.microsoft.com/en-us/dotnet/api/microsoft.codeanalysis.csharp?view=roslyn-dotnet

【讨论】:

  • 您的解决方案是否也适用于包含数百个 CS 文件的项目? CodeDom 是否能够读取属于同一个项目的许多不同文件?
  • 应该不是问题。没有使用 CodeDOM 解决此类问题,仅用于创建自动生成的代码。类或文件的数量没有问题。只需加载 xml 文档文件,然后将关联的 cs 文件加载到代码域图中,添加 cmets 并保存新的(以便更好地测试到新目录:D)。然后为下一个 xml 文档执行此操作。
  • 能否提供一个如何将大量.cs文件加载到Codedom图的例子,非常感谢。
  • 检查我的编辑,使用 Microsoft.CodeAnalysis.CSharp 我认为添加 cmets 和获取新代码文件会更容易