.NET库文档生成工具:ImmDoc .NET

在Visual Studio 2003中,能够享受到为项目生成HTML文档的便利功能。但遗憾的是,这一功能在Visual Studio 2005中被移除。最近,在开发一个.NET库时,迫切需要这样的文档生成工具,但市面上的工具要么过时,要么不支持.NET Framework 2.0。因此,决定自己开发这样一个工具,希望它不仅能帮助,也能惠及其他程序员。

技术学习点

在开发这个工具的过程中,需要扩展以下知识点:

  • 反射机制
  • C#和MSIL的细节
  • 正则表达式
  • 编译器生成的XML注释文件的语法
  • 如何读取XML文件并对其进行模式定义的程序验证
  • 嵌入式资源

ImmDoc .NET的使用示例

ImmDoc .NET目前只提供了命令行界面。这样做的好处是,可以轻松地从批处理脚本或支持构建过程的工具(如NAnt)中使用该程序。使用方法非常简单:将程序集和XML注释文件与ImmDoc .NET可执行文件放在同一文件夹中,然后运行程序,经过一些处理后,将得到一个包含生成文档的doc文件夹。

以下是ImmDoc.NET提供的一些命令行选项:

  • -pn, -ProjectName:STRING - 如果想要给文档项目一个有意义的名称,可以使用这个开关。
  • -ex, -Exclude:FILE - 如果没有明确给出文件名,可以使用这个开关来排除特定文件的处理。
  • -od, -OutputDirectory:DIR - 使用这个开关来指定想要生成文档的目录名称。
  • -fd, -ForceDelete - 如果输出目录已经存在,ImmDoc .NET不会删除它,除非使用这个开关。
  • -vl, -VerboseLevel:LEVEL - 可以设置不同的详细级别,即级别越高,程序输出的信息就越多;LEVEL可以从0(无输出)到3(完全输出)。

项目架构与设计

ImmDoc.NET由两个程序集组成,最后通过ILMerge工具合并成一个EXE文件。这两个程序集分别是:

  • ImmDocNetLib - 负责分析程序集和XML注释文件以及生成文档的主要工作。
  • ImmDocNet - 是一个控制台应用程序,使用ImmDocNetLib并为用户提供界面。

在处理的第一步中,使用普通反射机制获取的信息与从XML注释文件中提取的注释结合起来,形成给定程序集的内部表示。

相关类包含在Imm.ImmDocNetLib.Documenters命名空间中。有一个名为Documenter的简单抽象类,可以从中派生出其他类,负责以喜欢的任何格式生成文档。已经实现了HTMLDocumenter类,它创建一组HTML、CSS和JavaScript文件。这些文件共同构成了给定程序集的类似MSDN的文档。

  • bool GenerateDocumentation(string outputDirectory, DocumentationGenerationOptions options) - 这个方法启动生成文档的过程。它调用诸如PrepareOutputDirectory()、GenerateMainIndex()、ExtractStyleSheets()、ProcessAssemblies()、GenerateTableOfContents()等方法。
  • void CreateInvokableMembersOverloadsIndex(MyInvokableMembersOverloadsInfo myInvokableMembersOverloadsInfo, MyClassInfo declaringType, string dirName) - 这个方法创建一个HTML页面,其中包含特定方法或构造函数的所有重载的索引。
  • string CreateNamespaceMemberSyntaxString(MyClassInfo namespaceMember) - 这个方法负责创建类型声明字符串。这样的字符串包括例如可见性修饰符、基类、实现的接口、泛型参数的约束等。
  • void ExtractBinaryResourceToFile(string resourceName, string fileName) - 生成页面中使用了一些图形。这个方法用于将指定的嵌入式资源提取到物理文件中。
  • string ProcessComment(string contents) - 这个方法处理在XML文件中找到的每个注释,以替换诸如等标签为适当的HTML标签。
  • void WriteIndexHeader(StreamWriter sw, string pageTitle, string[] sectionsNamesAndIndices) - 这个方法写入几乎所有生成页面都使用的通用HTML头部。
  • string ResolveLink(MetaClass metaClass) - 为了使生成的文档可用,需要提供页面之间的一些导航。这个方法有助于创建超链接的任务,例如,到类的特定成员。
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485