更新:2007 年 11 月
此演练提供对同时包含托管的 .NET Compact Framework 组件和本机组件的解决方案进行调试的步骤。Visual Studio 不支持对此类设备应用程序进行互操作调试。即,不能同时附加本机调试器和托管调试器。
在对既包含本机元素又包含托管元素的解决方案进行调试时,建议采用如下方法:首先附加某个部分(如托管部分)所需的调试器,然后分离该调试器,再根据需要附加另一个调试器。可以不断重复执行上述分离/附加步骤,以便单步执行程序。
| .gif) 说明: | 
|---|
| 对于在以下说明中使用的某些 Visual Studio 用户界面元素,您的计算机可能会显示不同的名称或位置。这些元素取决于您使用的 Visual Studio 版本及设置。有关更多信息,请参见Visual Studio 设置。 | 
本演练是使用“Visual C# 开发设置”编写的。它包含下列部分:
- 启用托管调试器附加 
- 启动应用程序 
- 在本机代码中设置断点 
- 附加本机调试器 
- 运行到本机断点 
- 附加托管调试器 
- 在托管代码中设置断点 
- 运行到托管断点 
- 结束语 
先决条件
此演练依赖于使用另一个演练(演练:Hello World:智能设备的 COM 互操作示例)生成的解决方案。请确保已生成并运行此演练。
启用托管调试器附加
默认情况下,包括仿真程序在内的设备不允许将托管调试器附加到已在运行的进程。在既包含托管代码又包含本机代码的设备解决方案中,经常会遇到将托管调试器附加到已在运行的进程的情况。
首先将设备设置为允许将托管调试器附加到已在运行的进程。可以通过设置设备上的注册表项来实现这一点。
| .gif) 说明: | 
|---|
| 设置注册表项仅影响附加到已在运行的托管进程。这并不影响使用“启动并进行调试”(F5) 来启动项目。但是,如果在“启动并进行调试”后分离,则需要此进程来重新附加并再次启动调试。 | 
使托管调试器能附加到已在运行的进程
- 在 Windows“开始”菜单上依次指向“所有程序”、“Microsoft Visual Studio 2008”、“Visual Studio 远程工具”,再单击“远程注册表编辑器”。 
- 在“选择 Windows CE 设备”窗口中,展开“Windows Mobile 5.0 Pocket PC SDK”,再单击“Windows Mobile 5.0 Pocket PC 仿真程序”。这是本演练的目标设备。 
- 单击“确定”。 - 将打开“正在连接到设备”进度窗口,然后打开设备仿真程序和 Windows CE 远程注册表编辑器。 
- 在注册表编辑器中,展开“Windows Mobile 5.0 Pocket PC Emulator 仿真程序”,然后创建以下项:HKEY_LOCAL_MACHINE\SOFTWARE\Microsot\.NETCompactFramework\Managed Debugger。 - 创建此项的方法是:右击“.NETCompactFramework”,指向“新建”,再单击“项”。 - 请注意,“Managed”与“Debugger”之间有一个空格。 
- 创建一个名为 AttachEnabled 的 DWORD。 - 创建 DWORD 的方法是:右击“Managed Debugger”,指向“新建”,再单击“DWORD 值”。 
- 将“名称”设置为“AttachEnabled”,将“值”设置为 1。 .gif) 说明: 说明:- 设置这个设备调试项将显著降低性能。不进行调试操作时,请将数据值重置为 0 以禁用此功能。 
- 为保留注册表设置,不要关闭设备仿真程序,剩余步骤仍将使用它。可以关闭注册表编辑器。 
启动应用程序
下一步是启动 InteropSolution 应用程序。
启动应用程序
- 打开在 演练:Hello World:智能设备的 COM 互操作示例 中创建的解决方案。 - 确保工具栏上的“目标设备”框中显示“Windows Mobile 5.0 Pocket PC 仿真程序”。 
- 在 Visual Studio 的“调试”菜单上单击“启动调试”或按 F5。 - 此步骤立即将本机项目 HelloCOMObject 部署到仿真程序,无需用户进行其他干预。 
- 当“部署 SayHello”对话框打开时,选择“Windows Mobile 5.0 Pocket PC 仿真程序”,再单击“部署”。 - 此步骤将部署托管项目。 - 应用程序在仿真程序中打开。暂时不要单击按钮。 
在本机代码中设置断点
下一步是在本机代码中设置断点以准备附加本机调试器。
在本机代码中设置断点
- 在“解决方案资源管理器”中,右击“Hello.cpp”,再单击“查看代码”。 
- 通过单击代码编辑器左侧的空白处,在以 *text 开头的行中插入一个断点。 - 断点符号显示为一个带有感叹号的空心圆圈,指示暂时无法解析此断点。这是因为它目前缺少适当的符号和源。 
- 在 Visual Studio 的“调试”菜单上指向“窗口”,再单击“模块”。 - “模块”窗口显示了迄今为止加载的所有模块,例如托管应用程序 SayHello.exe。请注意,由于还没有在应用程序中单击按钮,因此本机 HelloCOMObject.dll 尚未加载。 
附加本机调试器
下一步是分离托管调试器,以便可以附加本机调试器。记住不能为设备项目同时附加两种调试器。以下是每当必须从托管调试器切换到本机调试器时所使用的步骤。
附加本机调试器
- 在 Visual Studio 的“调试”菜单上单击“全部分离”。 - 此步骤将分离托管调试器,但应用程序仍可继续运行。 
- 在“调试”菜单上单击“附加到进程”。 
- 在“传输”框中选择“智能设备”。 
- 若要填充“限定符”框,请单击“浏览”。 
- 在“连接到设备”对话框中,选择“Windows Mobile 5.0 Pocket PC 仿真程序”,再单击“连接”。 
- 若要填充“附加到”框,请单击“选择”。 
- 在“选择代码类型”对话框中选择“调试以下代码类型”,清除“托管”复选框,选择“本机”复选框,再单击“确定”。 
- 在“可用进程”框中,选择“SayHello.exe”,再单击“附加”。 - 现在已附加本机调试器。 
运行到本机断点
现在即可前进到在本机代码中设置的断点。再次检查“模块”窗口时,您将看到本机模块。但是,由于还没有单击 button1,所以尚未加载 HelloCOMObject.dll。
| .gif) 说明: | 
|---|
| 如果以前运行过此演练,则可能已加载调试符号,您即可跳过这些步骤。如果尚未运行过此演练,以下部分提供了加载它们的步骤。 | 
向前执行到本机断点
- 在“设备仿真程序”窗体中单击 button1。 - 窗体中将显示“Hello World!”消息,并且“模块”窗口中显示“hellocomobject.dll”。 - 如果“hellocomobject.dll”的“符号状态”列未显示“已加载符号”,请按照下列步骤操作: - 右击“hellocomobject.dll”,再单击“加载符号”。 
- 在“查找符号”对话框中,定位到 InteropSolution\HelloCOMObject\Windows Mobile 5.0 Pocket PC SDK (ARMV4I)\Debug\HelloCOMObject.pdb。 
- 单击“打开”。 - “符号状态”列更改为“已加载符号”,并且断点指示器现在显示断点已解析。 
 
- 在“设备仿真程序”窗体上单击“Hello World!”窗口上的“确定”,然后再次单击 button1。 - 断点指示器显示执行停止在断点处。 
- 在“调试”菜单上单击“逐语句”或按 F11。 - 请注意,执行将移动到下一行。这表明您现在可以单步执行解决方案的本机部分。 
附加托管调试器
下一步是分离本机调试器,以便可以附加托管调试器。记住不能为设备项目同时附加两种调试器。以下是每当必须从本机调试器切换到托管调试器时所使用的步骤。
附加托管调试器
- 在 Visual Studio 的“调试”菜单上单击“全部分离”。 - 此步骤将分离本机调试器,但应用程序仍可继续运行。 
- 在“调试”菜单上单击“附加到进程”并确保“传输”框包含“智能设备”。 
- 使用以下方法填充“限定符”框:单击“选择”,选择“Windows Mobile 5.0 Pocket PC 仿真程序”,再单击“连接”。 
- 若要填充“附加到”框,请单击“选择”,选择“调试以下代码类型”,再选中“托管”框,清除“本机”框,再单击“确定”。 - 如果显示消息提醒您托管调试与本机调试不兼容,请单击“确定”。 
- 在“可用进程”框中,选择“SayHello.exe”,再单击“附加”。 - 现在已附加托管调试器。 
在托管代码中设置断点
下一步是在托管代码中设置断点以准备附加托管调试器。
在托管代码中设置断点
- 在“解决方案资源管理器”中右击“Form1.cs”,再单击“查看代码”。 
- 在 string text; 行上插入断点。 
运行到托管断点
现在即可前进到托管代码中设置的断点。
向前执行到托管断点
- 在“设备仿真程序”中单击 button1。 - 执行在断点处停止。 
结束语
出于性能原因,当您不必再将托管调试器附加到已在运行的进程时,请将设备注册表项重置为 0。