查找实际使用的DLL与引用的DLL

时间:2014-11-13 22:35:40

标签: .net

我需要只识别使用的dll。让我解释一下。

如果你有一个.Net exe,例如,引用DLLA.dll的MyEXE.exe,而DLLA.dll是一个引用其他17个DLL的常用函数库,那么在构建期间.Net将把所有17个以及MyEXE.exe的bin文件夹中的DLLA.dll。即使MyEXE.exe只调用DLLA.dll引用的2个dll中使用的代码。

只要条目程序集不直接或间接调用丢失的dll中的任何功能,.net应用程序就可以正常运行并且缺少dll。

所以我想找到使用的那些。

我不想为每个项目硬编码,谢谢。我喜欢我可以在任何项目上运行的算法。感谢。

1 个答案:

答案 0 :(得分:1)

这在.Net中确实不是一个可解决的问题。一般情况是直截了当的,并由以下算法描述:

  • 将MyEXE中的每个方法放入"必须检查列表"
  • 虽然"中有方法,但必须检查清单"
    • 将包含声明方法的类型的程序集添加到" required set"
    • 重复所有超级类型
    • 浏览正文以查找所有引用的方法。将这些添加到"必须检查列表"

这将把所有实际需要的装配放入"所需的装置"。

这是一次相当详尽的搜索,但错过了很多项目

  • 静态构造函数
  • 反射
  • WPF绑定
  • Activator.CreateInstance
  • 等...

所有这些都代表了动态方法调用,这些调用无法通过静态检查器进行实际分析。其中任何一个都可能导致其他17个DLL中的一个被使用,从而破坏您的部署。

我没有尝试静态检测必要的程序集(无法解决),而是尝试重构代码,以便所需的子集不会引入如此多的DLL