我试图获取依赖程序集名称,从属DLL加载的位置以及从属DLL的依赖项。
我正在获取“.exe”文件的路径作为输入。
要查找依赖项,我使用以下代码。
var assemblies = Assembly.LoadFile("C:\\My Folder\\ MyApp.exe").GetReferencedAssemblies();
“组件”是System.Reflection.AssemblyName
类对象的集合。
我使用for-each获取程序集名称列表以查找依赖项列表。
像这样的东西应该得到所有引用的程序集。要将AssemblyName转换为程序集,您必须加载它。这将返回包含所有引用程序集的枚举。您不需要传入HashSet,它只是用于递归调用以防止无限循环。
如果你不想保持这些加载,我建议将它们加载到一个单独的AppDomain中,然后卸载它。
private static IEnumerable<Assembly> GetReferencedAssemblies(Assembly a, HashSet<string> visitedAssemblies = null)
{
visitedAssemblies = visitedAssemblies ?? new HashSet<string>();
if (!visitedAssemblies.Add(a.GetName().EscapedCodeBase))
{
yield break;
}
foreach (var assemblyRef in a.GetReferencedAssemblies())
{
if (visitedAssemblies.Contains(assemblyRef.EscapedCodeBase)) { continue; }
var loadedAssembly = Assembly.Load(assemblyRef);
yield return loadedAssembly;
foreach (var referenced in GetReferencedAssemblies(loadedAssembly, visitedAssemblies))
{
yield return referenced;
}
}
}
至于DLL位置,你可以在Location
对象上使用Assembly
来检索它。