Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1938781
  • 博文数量: 219
  • 博客积分: 8963
  • 博客等级: 中将
  • 技术积分: 2125
  • 用 户 组: 普通用户
  • 注册时间: 2005-10-19 12:48
个人简介

文章分类

全部博文(219)

文章存档

2021年(1)

2020年(3)

2015年(4)

2014年(5)

2012年(7)

2011年(37)

2010年(40)

2009年(22)

2008年(17)

2007年(48)

2006年(31)

2005年(4)

分类:

2009-02-26 17:57:39

今天学习 C#,写了一个用反射把类库里面的类和方法输出到一个XML文件中。方案写完后,输出到XML文件的内容不完整。代码如下:
 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
using System.Xml;
using System.IO;

namespace LearningCSharpByExample
{
    class LookingAtAssembly : IEntryPoint
    {
        ///


        /// Entries the point.
        ///

        public void EntryPoint()
        {
            Assembly assembly = Assembly.LoadFrom("E:\\VisualStudioProj\\ChouyTest\\NHibernateTest\\bin\\NHibernate.dll");
            XmlDocument doc = new XmlDocument();
            doc.AppendChild(doc.CreateXmlDeclaration("1.0", "utf-8", null));
            XmlElement nhibernnatedoc = doc.CreateElement("NHibernateTestDoc");
            foreach (Module module in assembly.GetModules())
            {
                XmlElement moduleEle = doc.CreateElement("module");
                moduleEle.SetAttribute("name", moduleEle.Name);
                Type[] types = module.FindTypes(null, null);
                foreach (Type type in types)
                {
                    XmlElement typeEle = doc.CreateElement("type");
                    /* 代码段1
                    if (type.Name.Equals("BulkOperationCleanupAction"))
                    {
                        Console.WriteLine("break");
                        break;
                    }
                    */

                    typeEle.SetAttribute("name", type.Name);
                    MemberInfo[] memberInfoArray = type.GetMethods(BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly);
                    foreach (MemberInfo memberInfo in memberInfoArray)
                    {
                        XmlElement memberEle = doc.CreateElement("member");
                        memberEle.AppendChild(doc.CreateTextNode(memberInfo.Name));
                        typeEle.AppendChild(memberEle);
                    }
                    moduleEle.AppendChild(typeEle);
                }
                nhibernnatedoc.AppendChild(moduleEle);
            }
            doc.AppendChild(nhibernnatedoc);
            /* 代码段2
            using (XmlTextWriter writer = new XmlTextWriter(new StreamWriter("c:\\nhibernate.xml")))
            {
                writer.Formatting = Formatting.Indented;
                // doc.WriteTo(new XmlTextWriter(Console.Out));
                doc.WriteContentTo(writer);
            }
            */

            /* 代码段3 */
            XmlTextWriter writer = new XmlTextWriter(new StreamWriter("c:\\nhibernate.xml"));
            writer.Formatting = Formatting.Indented;
            doc.WriteContentTo(writer);

              /* 代码段4 */

              // writer.dispose();
            writer.flush();

            /* 代码段4 结束*/

              /* 代码段3 结束*/

        }
    }
}

代码段3的程序这么看没有什么问题,但输出文件最后部分总是没有。

我以为是文件太大,输出不了。于是我加上了代码段2,后面很长的就不往XML文件里输出了,这样整个文件里连内容都没有;我又换了另一个DLL文件,也不行。问题很奇怪。

我又把这部分重写了,用代码段2替换了代码段3,就没问题了。分析一下,代码段2只是会自动调用 writer 的 dispose() 方法,我在代码段3里没调。问题差不多明白了,可能是因为 writer 对象缓存了一些数据没有输出造成的。于是我在代码段3中加入了代码段4,文件可以全部输出了。

还是要使用 using 释放资源呀,不然会有些奇怪的问题的。

阅读(2335) | 评论(0) | 转发(0) |
0

上一篇:图解 iptables

下一篇:庆祝:访问量超过10万

给主人留下些什么吧!~~