使用Visual Studio,我可以看到dll引用作为附图,作为示例。 有了这个参考信息,我可以打开(从示例中)Composition项目,找到所有其他引用,以获取所有引用文件名。
是否有自动执行此工作的实用程序? 我的意思是,给定一个.NET程序集,它会递归检查所有引用/依赖项,以给出DLL的名称。
我检查了cygwin的ldd和Depends.exe,但它们似乎没有显示其他项目的dll,只显示系统dll。
答案 0 :(得分:25)
是的:ildasm.exe。它随SDK一起安装。
应该在以下路径中:C:\ Program Files(x86)\ Microsoft SDKs \ Windows \ v7.0A \ Bin
答案 1 :(得分:10)
我喜欢使用 AsmSpy 进行此类检查。有一个exe下载,然后我把它放到我的工具文件夹中,以方便访问。 https://github.com/mikehadlow/AsmSpy
答案 2 :(得分:4)
答案 3 :(得分:1)
我不知道有任何工具可以自动执行此操作,但我可以概述任何工具(或您)必须遵循的步骤。
每个程序集都包含一个清单。清单列出了当前程序集所依赖的所有其他程序集的名称和版本。最简单的是你需要递归地跟踪这条线索。
没有正确的方法告诉您引用程序集的文件名。引用作为程序集名称(名称,版本,文化等)存储在清单中,而不是文件名。当.NET运行时需要加载引用的程序集时,它会使用各种搜索来查找它,并且这些搜索的结果可能因环境而异。当然,如果你只是在开发机器上寻找组件,这对你来说可能不是问题。
解析程序集引用的技术包括搜索已加载的任何程序集,查看全局程序集缓存,查找应用程序目录,根据应用程序配置文件或发布者策略重定向等。谷歌在MSDN中的文章“如何运行时查找程序集”了解更多详细信息。此外,您的应用程序可以通过处理System :: AppDomain :: AssemblyResolve事件来注册以执行自己的参考解析。
答案 4 :(得分:1)
此代码在查找所有引用方面做得相当不错。 "温度"将转储它追踪的所有参考文献。
private void PerformReferenceAnalysis()
{
StringBuilder builder = new StringBuilder();
HashSet<string> loadedAssemblies = new HashSet<string>();
PerformReferenceAnalysis(System.Reflection.Assembly.GetExecutingAssembly(), builder, string.Empty, loadedAssemblies);
string temp = builder.ToString();
}
private void PerformReferenceAnalysis(System.Reflection.Assembly assembly, StringBuilder builder, string leadingWhitespace, HashSet<string> loadedAssemblies)
{
if (builder.Length > 0)
{
builder.AppendLine();
}
builder.Append(leadingWhitespace + assembly.FullName);
System.Reflection.AssemblyName[] referencedAssemblies = assembly.GetReferencedAssemblies();
foreach (System.Reflection.AssemblyName assemblyName in referencedAssemblies)
{
if (loadedAssemblies.Contains(assemblyName.Name))
{
continue;
}
loadedAssemblies.Add(assemblyName.Name);
System.Reflection.Assembly nextAssembly;
try
{
nextAssembly = System.Reflection.Assembly.ReflectionOnlyLoad(assemblyName.FullName);
}
catch (Exception)
{
try
{
nextAssembly = System.Reflection.Assembly.ReflectionOnlyLoad(assemblyName.Name);
}
catch (Exception)
{
nextAssembly = null;
}
}
if (nextAssembly != null)
{
PerformReferenceAnalysis(nextAssembly, builder, leadingWhitespace + "| ", loadedAssemblies);
}
}
}