【C#食谱】【川菜】菜单1:列出被引用的程序集

问题:

你需要得到被一个特定的程序集所引用的所有程序集。这个信息可以告诉你这个程序集是否在引用一个或多个你所创建的程序集,或者你的程序集是否在引用其他特定的程序集。

解决方法:

使用Assembly.GetReferencedAssemblies方法去得到一个程序集所引用的程序集。例如:

public static string[] BuildDependentAssemblyList(string path, List<string> assemblies)
{
// 维护一个本程序集需要的程序集列表
if (assemblies == null)
assemblies = new List<string>();

// 是否已经包含这个路径的程序了
if (assemblies.Contains(path) == true)
return (new string[0]);
Assembly asm = null;
// 检查这个路径
// 看是一个程序名还是一个路径
if ((path.IndexOf(Path.DirectorySeparatorChar, 0, path.Length) != -1) ||
(path.IndexOf(Path.AltDirectorySeparatorChar, 0, path.Length) != -1))
{
// 从这个路径加载程序集
asm = Assembly.ReflectionOnlyLoadFrom(path);
}
else
{
// 是一个程序集名称
asm = Assembly.ReflectionOnlyLoad(path);
}

// 把程序集添加到列表中
if (asm != null)
{
assemblies.Add(path);
}
// 获取所引用的程序集
AssemblyName[] imports = asm.GetReferencedAssemblies();

// 遍历所有的引用,并进行递归
foreach (AssemblyName asmName in imports)
{
BuildDependentAssemblyList(asmName.FullName, assemblies);
}

string[] temp = new string[assemblies.Count];
assemblies.CopyTo(temp, 0);
return (temp);
}

这段代码返回一个包含有原程序集、所有其引用的程序集和这些程序集依赖的其他程序集的string数组。

举个例子:

对D:\WriteName\bin\Debug\WriteName.exe运行这个方法,将会得到以下结果:

D:\WriteName\bin\Debug\WriteName.exe

mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089

其中WriteName的代码是这样的:

using System;
using System.Collections.Generic;
using System.Text;

namespace WriteName
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Welcome to http://adaiye.cnblogs.com");
}
}
}

讨论:

获取一个程序集所引用的类型在检查哪些程序集正在被另一个程序集所引用是非常有用的。这个认识可以给予学习如何使用一个新的程序集很大的帮助。这个方法同时可以帮助检查程序集之间的依赖关系。

System.Reflection.Assembly类的GetreferencedAssemblies方法可以获取一个所有引用的程序集的列表。这个方法没有参数,返回一个AssemblyName对象的数组,而不是Types的数组。AssemblyName类型包含的成员包括程序集的名字,版本,本地信息(culture information),公钥/私钥对和其他信息。

注意,这个方法并不计算使用Assembly.ReflectionOnlyLoad*方法加载的程序集,因为,这些程序集只有在编译时才会被检查。当用反射为检查而加载程序集时,你应该使用ReflectionOnlyLoad*方法。这些方法不允许你从已加载的程序集中执行代码。

汇聚杭州外卖:外卖汇

posted on 2008-04-18 23:57 随风逝去(叶进) 阅读(2075) 评论(7)  编辑 收藏 网摘 所属分类: A. C#.NETB. 个人翻译E. 读书札记

评论

#1楼 2008-04-19 09:21 小朱      

反射的确是一个好东西。   回复  引用  查看    

#2楼 2008-04-19 10:32 布尔      

好久没见到的这种写法
if (assemblies.Contains(path) == true)
嘎嘎
  回复  引用  查看    

#3楼 2008-04-19 10:52 簡簡單單..      

-_-!!! 多此一举! 直接这样: if (assemblies.Contains(path)) ..   回复  引用  查看    

#4楼 2008-04-20 03:02 镜涛      

@簡簡單單..
呵呵,就是就是,楼主写这个的时候可能打盹了!!
  回复  引用  查看    

#5楼 2008-04-20 09:58 李战      

http://www.cnblogs.com/Emoticons/yoyocici/223852199.gif" alt="" />   回复  引用  查看    

#6楼 2008-04-20 11:26 abc123456[未注册用户]

觉得这是代码的风格,或者编程习惯,没有什么多此一举,看起来比较方便点   回复  引用    

#7楼[楼主] 2008-04-20 17:21 随风逝去(叶进)      

@簡簡單單..
其实正如@abc123456所说,我觉得这个在很大程度上能够提高代码的可读性
  回复  引用  查看    




发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 1160665




相关文章:

相关链接:

公告

MSNadaiye@hotmail.com
From 2008.3.22
     I have read:
     I am reading......:
C#和.NET 2.0实战 平台、语言与框架
修改代码的艺术 Programing ASP.NET JavaScript高级程序设计 IT新闻:
肩膀一直在痛!

导航

统计

  • 随笔 - 80
  • 文章 - 0
  • 评论 - 488
  • 引用 - 2

与我联系

搜索

 

常用链接

留言簿

我参与的团队

我的标签

随笔分类(73)

收藏夹(100)

Blogs

好吃的

最新随笔

积分与排名

  • 积分 - 114096
  • 排名 - 478

最新评论

阅读排行榜

评论排行榜

Free Web Counter
Free Web Counter