原著:Benjamin Wulfe
翻译:小刀人
原文出处:MSDN Magazine April 2006
原代码下载:ManagedSpy.rar
本文使用.NET Framework 2.0
本文讨论:
- 新工具ManagedSpy
- 理解ManagedSpy在调试中如何工作和起作用的
- 看看ManagedSpyLib的内部工作机制
- 在单元测试中使用ManagedSpyLib
有不少开发者使用Visual Studio®提供的工具Spy++。使用Spy++,你可以了解一个运行中的应用程序的窗体布局或确定一个导致bug的特定窗体消息。然而,当你创建一个基于Microsoft® .NET框架的应用程序,Spy++变得不太管用了,因为由Spy++截取窗体消息和类不能与开发者使用或甚至看到的任何事情通信。开发者真正所想看到的是被托管的事件和属性值。
本文描述如何使用一个名为ManagedSpy的新工具并且它的关联库ManagedSpyLib,它们均可从MSDN®Magazine网址下载(译注:已包含在本文源代码下载链接ManagedSpy.rar中,其中的TestManagedSpy解决方案是译者为方便大家所做)。与Spy++显示Win32® 信息比如窗体类、样式和消息相似,ManagedSpy显示托管控件、属性和事件。ManagedSpyLib允许你以编程方式访问另一个进程中的Windows®窗体控件。你可以获得并设置属性以及在你自己的代码中事件上同步。ManagedSpyLib也可以帮助你创建测试带(test harnesses)并且可以执行窗体、消息和事件记录(event logging)。
监视你的UI(用户界面)
当编写客户应用程序,这里有些是传统调试器不能发挥作用的案例。举个例子,如果你的bug涉及焦点或其他UI方面(的问题),它是很难来调试的,因为无论何时你碰到了一个断点(breakpoint)调试器修改了状态。另一个问题很难调试就是布局。如果你的窗体有一个复杂和动态布局,不论你的布局逻辑是否被调用多次它不一定总是明显的。为了调试这些问题,你一般必须诉诸于事件或消息记录以对你的UI获得的输入获得了解。
有着复杂的UI,对于窗体和关联状态的有所了解是有用的。举个例子,在调试器中定位相关控件对象可能会是很难的。大多数时候你必须猜测一个调试器变量就是一个你在UI中看到的。
图 1显示了一个有着一些嵌套控件的对话框。这个应用程序在右上方文本框有一个bug,虽然这个例子目的的真正所在并不是这个bug是什么。它将用来确定:不但它的成员是红色文本框而且也是父层次和相关控件的布局
图1 问题对话框
ManagedSpy可以对这个状况和其他(状况)有所帮助。它在你的基于.Net的客户应用程序中展示一个控件的树视图。你可以选择任何控件以及在上面获得或设置任何属性。你也可以记录控件生成的过滤后的一系列事件(译注:这是该工具的功能之一)。在调试时很有用,在你的控件的兼容性测试中也可以有所帮助。你可以使用真实应用(real applications)和记录事件(log events)以确保你的控件的下一个版本的事件顺序被保存。
当你首次运行ManagedSpy,它在窗体左边的一个treeview(树视图)中显示一个进程列表同时在右边显示一个PropertyGrid(属性格)。你可以扩展这个进程来查看这个进程中的顶级窗体。
当你选择了一个控件,PropertyGrid显示了该控件上的属性。你可以在这里查看或改变属性。你应该注意到自定义类型是受到支持的,只要他们被二进制序列化(请看Basic Serialization)。
这个工具条包含选择哪些记录事件到事件面板(event pane),当新的窗体已经被创建时以刷新树视图,开始或停止记录事件到事件面板,和清空事件面板等等命令。
对于图1中显示的对话框,ManagedSpy显示出图2中的信息。对于ManagedSpy,SplitContainer (SplitContainer2)是textBox1的父项,TableLayoutPanel(tableLayoutPanel1)又是的SplitContainer父项。TableLayoutPanel的父是一个TabControl控件,它是也是在另一个SplitContainer中。注意ManagedSpy也告诉我它的BackColor(背景色)也是红色。