如何在c#.Net中查找依赖程序集路径
我正在尝试获取依赖项程序集名称、从中加载依赖项DLL的位置以及依赖项DLL的依赖项 我正在获取“.exe”文件的路径作为输入 要查找依赖项,我使用以下代码如何在c#.Net中查找依赖程序集路径,c#,dll,reflection,.net-assembly,C#,Dll,Reflection,.net Assembly,我正在尝试获取依赖项程序集名称、从中加载依赖项DLL的位置以及依赖项DLL的依赖项 我正在获取“.exe”文件的路径作为输入 要查找依赖项,我使用以下代码 var assemblies = Assembly.LoadFile("C:\\My Folder\\ MyApp.exe").GetReferencedAssemblies(); “assemblies”是系统.Reflection.AssemblyName类对象的集合 我使用for each获取程序集名称列表以查找依赖项列表 如何获取每
var assemblies = Assembly.LoadFile("C:\\My Folder\\ MyApp.exe").GetReferencedAssemblies();
“assemblies”是系统.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;
}
}
}
private静态IEnumerable GetReferencedAssemblys(程序集a,HashSet VisitedAssemblys=null)
{
VisitedAssemblys=VisitedAssemblys??新建HashSet();
如果(!visitedAssemblys.Add(a.GetName().EscapedCodeBase))
{
屈服断裂;
}
foreach(a.GetReferencedAssemblys()中的var assemblyRef)
{
if(visitedAssemblys.Contains(assemblyRef.EscapedCodeBase)){continue;}
var loadedAssembly=Assembly.Load(assemblyRef);
屈服-返回载荷装配;
foreach(GetReferencedAssembly(loadedAssembly,VisitedAssembly)中引用的变量)
{
参考收益率;
}
}
}
至于DLL位置,您可以使用
程序集
对象上的位置
来检索该位置。@Stefan MSDN answers 1)通过查看“程序集”上的“位置”。2) 如果他可以从assembly对象获取应用程序的Depdencence,那么他肯定可以从其assembly对象获取引用程序集的引用程序集?我只是把这个问题看作是缺乏对文档的阅读和对流程的逻辑思考。总的来说,这似乎不费吹灰之力。@john:谢谢你的评论。您能告诉我如何从AssemblyName类获取assembly对象吗?我已经添加了我的建议。