分析加载动态 DLL 的 .NET 应用程序

Posted

技术标签:

【中文标题】分析加载动态 DLL 的 .NET 应用程序【英文标题】:Profiling a .NET app that loads dynamic DLLs 【发布时间】:2010-11-22 13:56:54 【问题描述】:

在我的应用程序中有一个“loader”可执行文件(我们称之为“Loader.exe”)。它在特定文件夹中搜索 DLL 文件并逐个加载它们。然后用户可以选择运行哪个插件(插件有窗口和业务逻辑)。这是我目前实现的一种插件架构。

问题在于 WPF 和分析器的运行时资源管理器工具都无法看到加载的 DLL 中发生的情况。例如。 CLR Profiler 根本不收集任何数据。

在不重写项目的 DLL 加载部分的情况下,我可以做些什么来解决这个问题?而且,坦率地说,为什么那些分析器看不到加载的 DLL 代码? VS 调试在这些方面效果很好。

【问题讨论】:

由于 VS 调试在这些方面效果很好,您可以使用随机暂停来查找性能问题。 (***.com/questions/375913/…) 它快速、肮脏、便宜,而且(恕我直言)最好。 是的,调试器工作正常。并且可以用来做一些“分析”。然而,我正在处理复杂的代码,这些代码一直都不容易调试。此外,可以使用 WPF 绑定触发的调试事物和方法调用并不那么明显。总而言之,我喜欢 VS 调试器,并且我同意它可以用来做一些事情,但是一个工作分析器对我来说是一个更好的选择,可以让我了解正在发生的事情以及哪些方法效率不高。跨度> @Jefim:MS 产品通常质量很高,但分析往往会受到普遍误解的影响。它显示了您对“正在发生的事情的概述以及哪些方法效率不高”的使用。方法通常不是低效的,并且分析器并不能真正告诉你发生了什么。他们只是测量东西。如果你想消除浪费的时间,你必须像树外科医生一样思考调用树。堆栈快照告诉您哪些活动花费的时间最多,以及需要关注哪些语句(而不是方法)。 ...复杂的代码不是问题。我经常在我们的应用程序中发现问题,该应用程序由 30 多个 .net 插件组成,堆栈深度约为 30 级。典型问题:50% 的时间不必要地用于从资源中提取国际化字符串。这就是我所说的“活动”,没有明显低效的方法。我敢说没有任何分析器能够线索找到这样的问题。 根据您的问题,加载程序似乎是一个单独的进程?如果是,那么这就是您的分析没有产生任何结果的原因 - 该过程根本没有被分析。如果它是同一个过程,那么大多数 .NET 分析器应该能够为您提供跟踪树或任何您需要的东西。您尝试过哪些分析器? 【参考方案1】:

试试我的分析器 www.xteprofiler.com ,如果它不起作用,我会修复它。

【讨论】:

以上是关于分析加载动态 DLL 的 .NET 应用程序的主要内容,如果未能解决你的问题,请参考以下文章

C#.Net 如何动态加载与卸载程序集(.dll或者.exe)3---- 动态加载Assembly应用程序

跨进程加载的 DLL - 如何使某些操作“类似于单例”

C#.Net 如何动态加载与卸载程序集(.dll或者.exe)

加载插件 DLL 文件,“动态程序集中不支持调用的成员。”

vb.net编程,如何使用 appdomain 实现某进程DLL动态加载和卸载?

将 DLL 动态加载到单独的应用程序域中,然后卸载