有关程序集

  .net成功的地方 不仅仅只在于公共语言运行时 实时编译器 等等地方.程序集的出现,特别是强名称程序集的出现 无疑也是.net的一大亮点. 最有感触的一点就是程序集的部署方便.记得以前开发了一个新闻发布系统,放到网站上面,可网站并不支持创建虚拟目录,默认只有一个根目录.但网站里面我放了很多的小程序.况且网站根本就不识别Bin目录.发布后的网站根本无法运行(因为当时没钱,申请的是一个国外的免费空间,呵呵,没办法 学生嘛!).要求不了那么多,关键是有人这样对我说,你学计算机的,自己的网站都没有啊----很是郁闷呀!还有就是免费空间只支持前后台代码在一页的页面,并不支持代码隐藏,这就非常特别的恼火.
  后来,没办法呀.代码只得改到前台来.可又有问题出现了,页面很多公用代码呀,像数据库连接的中间业务逻辑,怎么办咯.假如每个页面都去写的话,那Copy一下是简单,可页面很混乱的感觉,极为不爽.有没有办法在单页面的情况下公用一些通用的代码呢.呵!现在我们的程序集就登场了.假如我们把一些常用的代码通过csc /t:library 编译成程序集的话.我们应该就可以调用了吧,因为程序集的部署简单,尤其是私有程序集,根本就只要放到Bin目录下,就能自动被识别.可我的免费空间不支持Bin目录,无法识别,问题严重...于是,只有最后一招了----动态加载程序集.解决问题的办法也就在这了. .net中有一个类 Assembly提供了运行时动态加载程序集.
  好了,有了思路,我们就可以一步步往下做了.首先 将一些通用代码写到一个cs文件中.如数据库连接操作的DataBase类,支持UBB的UBB类等都可以放到同一个命名空间namespace MyDll中..我们只需要将此文件编译成程序集就行了.操作步骤如下:

 csc  / t:library  / r:mscrolib.dll  / out :MyDll.dll MyDll.cs

  运行后就得到了MyDll.dll这个程序集,不过首先应该保证MyDll.cs运行正确,没有代码错误. 好了,我们有了程序集,就可以使用它了.晕!特意弄好的东西不使用不就糟蹋了呀(呵呵,玩笑!). 使用MyDll.dll中的一些公用方法,我们需要引入命名空间:System.Reflection; 用到了其中的类:Assembly 好了.我们写点具体操作吧,不废话了,不然写不下了
 

// 首先 先加载程序集
Assembly assembly = Assembly.LoadFrom( " MyDll.dll " );
// 得到程序集中的类型 命名空间.类名称
Type t = assembly.GetType( " MyDll.DataBase " );
// 这样就动态得到了MyDll.DataBase这个类型,接着还可以创建该类型的实例
Object obj = Activator.CreateInstance(t);
// 创建好了后可以得到类型中的方法了,静态方法获得如下:
MethodInfo m = t.GetMethod( " MethodName " );
// 假如要获得重载方法 就要提供一个参数类型的数组Type[] types=new Type[]{typeof(int),typeof(string)};
MethodInfo m = t.GetMethod( " MethodName " ,types)
// 好了 获得了Method就可以调用这些方法了..
object []  params = new   object [] {10,"title"} ;
object  result = m.Invoke( null , params );
DataTable dt
= (DataTable)result;
// 使用静态方法的话就可以传递null参数 如果是动态的话就用
object  result = m.Invoke(obj, params ) // obj为前面创建的Type类型,params为该方法所需要的参数列表

  通过这种方法,就实现了代码在页面间的通用.虽然仍需要在页面中加一写动态调用代码,但比以前要加那么一大片代码强多了.至少我是这样的感觉.关于程序集的反射,还有很多方法来动态获取程序集的信息.多看看,多写写,程序集还真是个好东西.不废话了,就写这么多了...

你可能感兴趣的:(程序)