获得依赖程序集?
有没有办法让所有程序集依赖于给定的程序集?
伪:
Assembly a = GetAssembly(); var dependants = a.GetDependants();
如果要从当前应用程序域中查找依赖程序集,可以使用类似下面定义的GetDependentAssemblies
函数:
private IEnumerable GetDependentAssemblies(Assembly analyzedAssembly) { return AppDomain.CurrentDomain.GetAssemblies() .Where(a => GetNamesOfAssembliesReferencedBy(a) .Contains(analyzedAssembly.FullName)); } public IEnumerable GetNamesOfAssembliesReferencedBy(Assembly assembly) { return assembly.GetReferencedAssemblies() .Select(assemblyName => assemblyName.FullName); }
analyzedAssembly
参数表示要为其查找所有依赖项的程序集。
以编程方式,您可以使用Mono.Cecil来执行此操作。
这样的事情(请注意,如果附加了调试器,这将无效 – 例如,如果您从VS内部运行它):
public static IEnumerable GetDependentAssembly(string assemblyFilePath) { //On my box, once I'd installed Mono, Mono.Cecil could be found at: //C:\Program Files (x86)\Mono-2.10.8\lib\mono\gac\Mono.Cecil\0.9.4.0__0738eb9f132ed756\Mono.Cecil.dll var assembly = AssemblyDefinition.ReadAssembly(assemblyFilePath); return assembly.MainModule.AssemblyReferences.Select(reference => reference.FullName); }
如果您不需要以编程方式执行此操作,那么NDepend或Reflector可以为您提供此信息。
首先定义您的范围,例如:
-
我的应用程序的bin目录中的所有程序集
-
我的应用程序的bin目录中的所有程序集+ GAC中的所有程序集
-
世界上任何机器上的所有组件。
然后简单地(*)遍历范围内的所有程序集,并使用reflection来检查它们是否依赖于目标程序集。
如果你想要间接和直接参考,你必须冲洗并重复你找到的所有组件。
(*)如果你的范围是3以上,可能不是那么简单。
我不知道在运行时获取依赖项的任何内置可能性。 因此,我认为最简单的解决方案是定义扩展方法并使用此应用程序中的代码。 几年前我使用了一个应用程序。 但是不要使用它的代码。
希望这可以帮助。