关注互联网、IT技术!

C#技术总结:使用反射动态加载动态库

  •  admin
  •  2012-01-01 11:01:05
  •     
写过一个博客群发软件(因为个人暂时没有使用需求,没有进一步开发更新),当时考虑,当添加对新博客的支持时,如何不用更改软件主体代码,而实现升级。考虑再三,决定把对每一个博客的支持模块,都封装为dll类库,支持类继承自同一个接口,通过使用反射,动态调用类库中的方法。这样,当对一个新的博客提供支持时,只需要把相应的类库拷贝到程序指定的文件夹下就可以了使用了。 首先写一个接口IBaseBlog
using System;
using System.Collections.Generic;
using System.Text;

namespace BlogSender
{
    public interface IBaseBlog
    {
        /// <summary>
        /// 博客类别
        /// </summary>
        string HelperType { get; }
        /// <summary>
        /// 发布文章
        /// </summary>
        /// <param name="webBrowser"></param>
        /// <param name="blog"></param>
        void Post(object webBrowser, BlogInfo blog);
    }
}
然后编写具体的实现类,以新浪博客为例,新建一个类SinaHelper,继承上面的接口
namespace BlogSender
{
    public class SinaHelper : IBaseBlog
    {
        /// <summary>
        /// 发布文章
        /// </summary>
        /// <param name="web">WebBrowser控件</param>
        /// <param name="blog">文章信息</param>
        public void Post(object web, BlogInfo blog)
        {
            base.Init((WebBrowser)web, blog, blogAddr);
            timer.Enabled = false;
            timer.Tick += new EventHandler(timer_Tick);
        }

        public string HelperType
        {
            get { return BlogType.SinaBlog; }
        }
    }
}
本文只做简单示例,说明一下思路,所以去掉了很多具体的功能代码。 其他博客类似,对每一个博客,都建立一个继承自IBaseBlog接口的类,比如搜狐博客:SoHuHelper,百度空间:BaiduHelper等等。 在主程序中,写一个加载动态库的方法:
        /// <summary>
        /// 动态库集合
        /// </summary>
        public static List<IBaseBlog> HelperList = new List<IBaseBlog>();
        /// <summary>
        /// 加载动态库
        /// </summary>
        public static void LoadDlls()
        {
            HelperList.Clear();
            string[] files = Directory.GetFiles("BlogLibs", "*Helper.dll");//读取指定目录下的动态库
            foreach (string s in files)
            {
                try
                {
                    Assembly myAssembly = Assembly.LoadFrom(s);//加载程序集(为了方便调用,我将程序集的名称和类的名字写成了一样的)
                    string typeName = s.Split('\\')[1].Split('.')[0];//获取类名
                    Type type = myAssembly.GetType("BlogSender." + typeName);
                    object obj = System.Activator.CreateInstance(type);//得到程序集的实例
                    IBaseBlog blogHelper = (IBaseBlog)obj;//转换为接口类型
                    HelperList.Add(blogHelper);//保存实例,留作以后调用
                }
                catch
                {

                }
            }
        }
这样,就实现了动态库的加载,在调用的时候,只需要调用接口的方法即可。比如,向所有博客发布文章,那么只需要执行下面代码
foreach(IBaseBlog helper in HelperList)
{
    helper.Post(...,...);
}
反射在.NET中的作用很大,有时候处理问题,会非常方便。还有一个经典的反射用法,就是ORMapping,将数据库信息和实体类映射起来,这个在数据处理方面,用到的比较多,以后我可以简单的写一下ORMapping的基本实现思路。其实现在很少有人自己去写ORMapping了,因为有很多现成的类库可以用,而且,在.NET Entity Framwork中,.NET本身就提供了ORMapping的方法,对数据库操作,已经实现了傻瓜式操作,根本不需要考虑具体实现过程。 但是不直达为什么,一般企业中,很少有直接使用Entity Framwork提供的数据库操作功能,可能是因为技术比较新,大家对其可靠性还持怀疑态度吧,毕竟,自己写出来的,控制起来比较灵活!

相关文章

评论

称呼(可以不填)
Email(可以不填)
链接(可以不填)
请输入评论内容*