问题:
你需要得到被一个特定的程序集所引用的所有程序集。这个信息可以告诉你这个程序集是否在引用一个或多个你所创建的程序集,或者你的程序集是否在引用其他特定的程序集。
解决方法:
使用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*方法。这些方法不允许你从已加载的程序集中执行代码。