调用堆栈中的外部代码是否足以证明我的代码是正常的?

时间:2017-09-03 19:47:39

标签: c# .net wpf .net-assembly

上下文:

我有一个使用MEF在主机应用程序中运行的WPF应用程序。这个宿主应用程序是由我工作的另一个部门开发的,他们提供给我们的是我们使用的一些程序集和C#接口。我的WPF应用程序有一个导出程序,可以导出到主机应用程序中。

问题:

我遇到的反复出现的问题是,当我在某些按钮Click事件上运行任何事件处理程序时,WPF应用程序的UI元素都会消失。所以很自然地我在其中一个处理程序的第一行放置了一个断点,并进行调试。但是我在调​​用堆栈中看到的只是我的行(我放置了断点),其余的调用堆栈都有外部代码。所以我试图弄清楚这是主机应用程序中的问题,还是我介绍的问题。调用堆栈只调用PresentationCore,WindowsBase,mscorlib和主机程序集,其中包含一个Native-to-Managed和一个Managed-to-Native行。

问题:

看到调用堆栈只有我的一个断点线在顶部,其余的是主机程序集或Windows程序集,这是否足以让我说问题出在主机程序集中?假设它不是任何Windows程序集。在我的断点被击中之前,UI元素消失了。

1 个答案:

答案 0 :(得分:1)

  

我在调用堆栈中看到的只是我的行(我放置了断点),其余的调用堆栈都有外部代码。

这正是回调应该发生的事情:你的代码在顶部,框架代码直接在下面调用代码。

  

这足以让我说问题出在主机组件中吗?

不,有两个原因:

  • 您的代码负责引导自身以与外部框架一起使用。如果它无法正确执行,外部代码中的问题可能会变得可见。理想情况下,外部代码应该捕获这些,并通知您您的设置存在问题,但即使框架抛出异常而不是优雅地失败,问题仍然存在于您的代码中,并且
  • 您的代码可能会执行导致外部框架进入不一致状态的操作。同样,理想情况下,外部框架应该检测到这一点,但最终修复将在您的代码中。
  

在我的断点被击中之前,UI元素会消失

UI元素需要一个正在运行的程序才能重绘自己。这就是为什么使用断点调试UI可能会出现问题。通过向代码添加调试跟踪并在没有断点的情况下运行,可以获得更好的结果。