【问题标题】:Disabling delayed DLL load functionality in a .NET (C#) app在 .NET (C#) 应用程序中禁用延迟的 DLL 加载功能
【发布时间】:2012-10-19 14:13:15
【问题描述】:

我有一个 .net Windows 服务应用程序,它调用我们自己创建的一堆其他 dll。但是,所有这些 dll 都是为 x86 创建的,并且我们已经转移到任何 CPU(在 x64 环境中)。遗憾的是,由于 .NET 的延迟加载功能,除非我们使用一些罕见且有些复杂的代码路径,否则这些 dll 中的许多都不会加载。最终结果?在部署代码几天或几周后,我们会收到不正确的格式异常。

我想知道是否有办法强制 .NET 完全加载它直接引用的所有程序集,这样我就可以看到这种不兼容性,而无需手动查看创建这些依赖 dll 的数十个项目,或者更糟,进行完整的回归测试以强制加载所有程序集。

附录:即使有更简单的方法来解决我的特定 x86-dlls-in-a-x64-environment 问题,我仍然有兴趣看看是否有办法强制环境加载其所有依赖项。你永远不知道它什么时候会派上用场! :)

编辑:这些都是托管的 DLLS,实际上我已经使用反射来对生产中的问题进行分类。但是,在开发环境中,它遇到了与其他选项相同的问题:以一种或另一种方式手动遍历所有 DLL。

【问题讨论】:

  • 我会作弊并使用反射 - 遍历每个不是来自 MS 的引用程序集,在该程序集中找到一个类并实例化它。它并不优雅,但它会强制所有程序集立即加载。也就是说,我确实认为你从错误的方向来解决整个问题。
  • 你是指托管还是非托管DLL?

标签: c# .net load delay


【解决方案1】:

一种方法是使用 ILMerge 静态链接库以将它们合并到可执行文件本身。否则 DLL 的全部意义在于它们在被用于代码之前不会被评估。 见The .NET equivalent of static libraries?

当然,您可以在应用程序加载时运行一个诊断序列,该序列涉及您所有 dll 的某些方面,因此至少您知道加载时哪些内容存在,哪些内容不起作用。

【讨论】:

  • 终于开始玩 IL Merge,它似乎正在做我不希望它做的事情:被动检测其中一个程序集是 x86 并生成结果输出程序集 x86 .
猜你喜欢
  • 2015-01-11
  • 1970-01-01
  • 1970-01-01
  • 2013-12-31
  • 1970-01-01
  • 2011-07-25
  • 2010-11-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多