【问题标题】:How do I set a breakpoint inside C# PresentationFramework.dll?如何在 C# PresentationFramework.dll 中设置断点?
【发布时间】:2011-01-05 22:45:27
【问题描述】:

这可能是在黑暗中拍摄,但是,我将如何在 PresentationFramework.dll 的以下内部静态方法中设置断点?

System.Windows.Documents.TextEditorTyping._ShowCursor()

我遇到了与Joe 非常相似的情况,我正在使用 TextBox 控件和包含 ItemsControl 的 Popup 制作自定义自动完成文本框。当我将焦点放在文本框和显示为 StaysOpen="False" 的弹出窗口中并键入一些字符时,鼠标指针被隐藏(通过调用 System.Windows.Documents.TextEditorTyping.HideCursor 我相信)。它通常会在鼠标移动时重新显示,但似乎弹出窗口会在检查是否应该隐藏时处理此事件,因此当您在窗口中移动指针时指针会保持隐藏状态。

有一个怪癖,在第一次按键时,指针消失然后立即重新出现,然后在第二次按键时,指针保持隐藏状态。这表明有些东西正在调用 _ShowCursor(),我很想知道是什么。因此这篇文章,以及设置上述断点的愿望。如何设置断点?

关于我的实际问题,指针一旦移动就会隐藏,我希望通过自己模拟 StaysOpen="False" 来解决它而不阻止鼠标移动事件,或者自己触发鼠标移动事件以使指针重新出现。对此表示赞赏的任何其他提示。

【问题讨论】:

    标签: c# visual-studio debugging internal


    【解决方案1】:

    对于其他遇到此问题的人,我是这样做的(VS2015):

    下载并安装 JetBrains dotPeek

    将 dotPeek 作为符号服务器运行

    这里解释:https://www.jetbrains.com/help/decompiler/2016.1/Using_product_as_a_Symbol_Server.html

    您可能还必须删除/重命名已下载的 PresentationFramework.pdb 的错误版本,如上述链接中“可能的问题和解决方案”中所述

    【讨论】:

      【解决方案2】:

      虽然您无法使用 stock 框架执行此操作(没有可用的调试符号),但您可以使用 Reflector Pro 获得这种技巧:http://www.red-gate.com/messageboard/viewforum.php?f=109

      Reflector Pro 会将 WPF 程序集分解为 .cs 源文件,并动态生成它自己的调试 PDB - 然后您可以通过 Presentation Framework 程序集单步使用 Visual Studio(并设置断点)

      祝你好运!

      【讨论】:

      • 调试符号可从 Microsoft 调试符号服务器获得。更好的是,源代码也可用。
      【解决方案3】:

      我不得不建议你在源代码文件中设置断点。它可以从参考源获得,我强烈推荐使用Mass Downloader 工具来获取它。如果您将它安装到 c:\ReferenceSource,那么您需要的源代码文件将位于 c:\ReferenceSource\dd\wpf\src\FrameWork\System\Windows\Documents\TextEditorTyping.cs。

      参考源相对于反编译源的一大优势是它包含源代码 cmets。并非所有的源代码都可用,但 WPF 的大块是可用的。

      约翰·罗宾斯的install instructions 非常好。我唯一遇到的问题是因为之前使用了 Microsoft 调试符号服务器提供的调试符号。我不得不手动从符号缓存中删除参考源中也可用的 .pdb 文件。

      【讨论】:

      • WPF 程序集是共享源发行版的一部分吗?
      • Shared Source 是另一种动物,那里没有 WPF。 WPF 源代码是参考源的一部分。
      【解决方案4】:

      这可能有点棘手,但可以通过以下步骤完成。

      1. 从调试选项菜单中禁用“仅我的代码”
      2. 打开断点窗口并在函数处选择中断
      3. 如果是函数,请输入全名

      【讨论】:

      • 不起作用。当我在我的代码中键入一个函数时,它会起作用——然后 VS 会显示相似的函数名称,并询问我到底想要哪一个。但是例如当我输入Add 并等待它向我询问List.Add 之类的内容时,它说找不到该功能。
      猜你喜欢
      • 1970-01-01
      • 2015-12-28
      • 1970-01-01
      • 2012-02-20
      • 2011-08-24
      • 2019-03-21
      • 2010-09-19
      • 2012-03-29
      • 2012-06-05
      相关资源
      最近更新 更多