.net文档生成工具2.0 支持自定义文档生成器【转:http://www.cnblogs.com/lucc/archive/2008/09/05/1284762.html】...

相关下载:

 

.net文档生成工具2.0下载

 

.net文档生成工具2.0源代码下载

 

相关连接:

 

.net文档生成工具使用说明

 

.net文档生成工具2.0已经完成,在2.0版本中,您将可以创建自定义的文档生成器,生成个性化的文档。本文将介绍如何编写文档生成器。

 

.net文档生成工具(ADB)使用抽象工厂模式编写,你只需要继承DocumentBuilder并重写Build方法和Filter属性就可以创建自定义的文档生成器。


1. ADB结构图: 
 

 

2. 主界面和文档生成器的交互:


文档生成器通过主界面提供的IGetData接口获取程序集的成员(类型,方法,属性等),通过IInteract接口同用户交互(如显示进度等)。

 

3. 如何编写文档生成器:

 

下面通过编写一个名为TestBuilder的文档生成器说明如何编写文档生成器,TestBuilder只是简单的将选中的成员的名称及其摘要写入一个文本文件中。

 

工程文件下载

 

(1) 新建一个.net类库工程(名称为TestBuilder),拷贝ADB目录下的ADB.EXE,ADB.Factories.dll文件和en文件夹到TestBuilder输出目录;

 

(2) 引用ADB.Factories.dll;


(3) 创建文档生成器配置文件,创建一个名为TestBuilder.builder文件(保存为UTF-8格式),放置在TestBuilder.dll所在的目录下,TestBuilder.builder内容如下

  

ContractedBlock.gif ExpandedBlockStart.gif Code
<?xml version="1.0" encoding="utf-8"?>
<Builders>
  
<CustomBuilder Name="示例文档生成器"  Entry="ADB.TestBuilder"/>
</Builders>


(4) 调试配置:


打开TestBuilder的属性页,设置调试启动项:

 

 

 

(5) 添加一个名为TestBuilder的类,继承DocumentBuilder,重写Builder方法和Filter属性代码如下:

 

ContractedBlock.gif ExpandedBlockStart.gif TestBuilder
 1using System;
 2using System.Collections.Generic;
 3using System.Text;
 4using System.IO;
 5using System.Reflection;
 6using System.Xml;
 7using System.Diagnostics;
 8
 9namespace ADB
10ExpandedBlockStart.gifContractedBlock.gif{
11    using Factories;
12
13    public class TestBuilder : DocumentBuilder
14ExpandedSubBlockStart.gifContractedSubBlock.gif    {
15        public TestBuilder(IGetData data, IInteract interact)
16            : base(data, interact)
17ExpandedSubBlockStart.gifContractedSubBlock.gif        {
18        }

19
20        private string GetSummary(MemberInfo info)
21ExpandedSubBlockStart.gifContractedSubBlock.gif        {
22            MemberXmlElement xmldata = DataProvider.GetMemberXmlNode(info);
23            if (xmldata != null)
24ExpandedSubBlockStart.gifContractedSubBlock.gif            {
25                XmlNodeList xnl = xmldata.Data.GetElementsByTagName("summary");
26                if (xnl.Count > 0)
27ExpandedSubBlockStart.gifContractedSubBlock.gif                {
28                    return xnl[0].InnerText;
29                }

30                else
31                    return string.Empty;
32            }

33            else
34                return string.Empty;
35        }

36
37        public override void Build(string title, string target)
38ExpandedSubBlockStart.gifContractedSubBlock.gif        {
39            StreamWriter sw = new StreamWriter(target, false, Encoding.GetEncoding("GBK"));
40            try
41ExpandedSubBlockStart.gifContractedSubBlock.gif            {
42                sw.Write("-----------------------------------------------------\r\n");
43
44                //使用DataProvider.GetTypes()获取所有的类型(类,接口,委托,结构,枚举)
45                foreach (DocumentBuilderMember typeMember in DataProvider.GetTypes())
46ExpandedSubBlockStart.gifContractedSubBlock.gif                {
47                    if (typeMember.Selected)//Selected属性指明该类型是否选中
48ExpandedSubBlockStart.gifContractedSubBlock.gif                    {
49                        sw.Write((typeMember.MemberInfo as Type).FullName);
50                        sw.Write(":");
51                        sw.Write(GetSummary(typeMember.MemberInfo));//获取类型的摘要
52                        sw.Write("\r\n");
53
54                        //使用DataProvider.GetTypeMember获取类型的所有成员
55                        DocumentBuilderMember[] typeMembers = DataProvider.GetTypeMembers(typeMember.MemberInfo as Type);
56                        foreach (DocumentBuilderMember member in typeMembers)
57ExpandedSubBlockStart.gifContractedSubBlock.gif                        {
58                            if (member.Selected)//Selected属性指明该成员是否选中
59ExpandedSubBlockStart.gifContractedSubBlock.gif                            {
60                                sw.Write("    ");
61                                sw.Write(member.MemberInfo.Name);
62                                sw.Write(":");
63                                sw.Write(GetSummary(member.MemberInfo));//获取成员的摘要
64                                sw.Write("\r\n");
65                            }

66                        }

67                        sw.Write("-----------------------------------------------------\r\n");
68                    }

69                }

70                Process.Start(target);
71            }

72            catch (Exception)
73ExpandedSubBlockStart.gifContractedSubBlock.gif            {
74                throw;
75            }

76            finally
77ExpandedSubBlockStart.gifContractedSubBlock.gif            {
78                sw.Close();
79            }

80        }

81
82        public override string Filter
83ExpandedSubBlockStart.gifContractedSubBlock.gif        {
84ExpandedSubBlockStart.gifContractedSubBlock.gif            get return "文本文件|*.txt"; }
85        }

86    }

87}

 

生成工程,文档生成器TestBuilder就完成了。


4. 让ADB自动加载自定义的文档生成器


您只需将编写好的包含有自定义的文档生成器的程序集及其配置文件放到ADB.EXE所在的目录中即可,程序集和配置文件名称必须相同,配置文件的扩展名为.builder,如果引用了其他程序集,也要一并拷贝。

 

5.文档生成器配置文件格式说明

 

ContractedBlock.gif ExpandedBlockStart.gif 配置文件格式说明
1<?xml version="1.0" encoding="utf-8"?>
2<Builders>
3  <CustomBuilder Name="生成器1的名称"  Entry="生成器1的类名"/>
4  <CustomBuilder Name="生成器2的名称"  Entry="生成器2的类名"/>
5</Builders>
6

 

1.CustomBuilder必须有Name和Entry两个属性(区分大小写),同一程序集内可以有多个文档生成器;

2.Entry必须使用类的完全限定名(命名空间.类名);

3.<?xml version="1.0" encoding="utf-8"?>指定的编码必须和文件保存的编码一致。

转载于:https://www.cnblogs.com/JemBai/archive/2008/09/06/1285754.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值