【问题标题】:Finding the DLLs that are actually used vs the ones that are referenced查找实际使用的 DLL 与引用的 DLL
【发布时间】:2014-11-13 22:35:40
【问题描述】:

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

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

只要入口程序集不直接或间接调用缺少的 dll 中的任何功能,.net 应用程序在缺少 dll 的情况下也能正常运行。

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

我不想对每个项目都进行硬编码,谢谢。我想要一种可以在任何项目上运行的算法。谢谢。

【问题讨论】:

    标签: .net


    【解决方案1】:

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

    • 将 MyEXE 中的每个方法都放入“必须检查列表”
    • 虽然“必须检查列表”中有方法
      • 将包含声明方法的类型的程序集添加到“需要集”
      • 对所有超类型重复
      • 扫描正文以查找所有引用的方法。将这些添加到“必须检查列表”中

    这会将所有实际需要的程序集放入“需要的集合”中。

    这是一个相当详尽的搜索,但遗漏了许多项目

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

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

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

    【讨论】:

    • 谢谢。您概述的这种“相当详尽的搜索”会比我现在的“猜测”更好。如果我把它放在树形视图中,它还可以帮助我的同事了解他们在代码审查期间必须关注的内容。 1.我知道反射,但你如何“扫描身体”?我不认为这是可能的。 2. 我假设重构是指将库分解为单独的 dll。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多