Compact Framework 应用的跟踪






4.32/5 (10投票s)
本文提出了一种解决方案,可以缓解在构建基于 Compact Framework 的 Pocket PC 应用时缺乏调试控制台的问题。
引言
在开发 Pocket PC 应用程序时,Visual Studio IDE 中我最怀念的功能之一就是在“输出”窗格中看到我通常散布在代码中的跟踪消息。如果您已经开发代码一段时间,您就知道第二好的选择是有一个控制台窗口,您可以在其中看到这些消息。
由于缺乏构建与 IDE 集成的解决方案的知识和时间,我在本文中展示了一个控制台应用程序,它可以在主机 PC 上显示传递给紧凑框架代码中 System.Diagnostics.Debug.Write
或 System.Diagnostics.Debug.WriteLine
调用的字符串,这些代码运行在 Pocket PC 上。
背景
-
套接字 (Sockets)
套接字是几乎所有系统中连接两个应用程序最简单的方式之一。但在 .NET Framework 中,您可以找到一对互补的类,它们可以进一步简化套接字 API:
System.Net.Sockets.TcpClient
和System.Net.Sockets.TcpListener
。当然,它们的底层实现利用了套接字,并且对于任何曾经对套接字 API 进行过编程的人来说,它们的使用模式应该不会令人惊讶。TcpListener
和TcpClient
的同步阻塞通信不像套接字那样提供所有灵活性,但在这方面,它们满足了我适度的要求。有关 套接字 和 System.Net.Sockets 命名空间 的更多信息,请参阅 MSDN 库。
-
跟踪监听器
Systems.Diagnostics
命名空间提供了一种机制,允许对跟踪消息进行多重输出。当您调用Debug
或Trace
类的Write
和WriteLine
方法系列时,它们会调用已为此目的注册的每个监听器的相应方法。系统提供了一些TraceListener
抽象类的实现,它们将消息定向到调试器的输出窗口、输出流或事件日志。如果您的需求与系统提供的选项不同,则需要编写自己的System.Diagnostic.TraceListener
实现并将其添加到监听器集合中。您可以在 此处 找到有关跟踪监听器的文档。
使用代码
调试控制台
TcpTraceConsole 是一个充当服务器的控制台应用程序。它等待连接到达其命令行中指定的 IP 地址和端口。当建立连接时,它仅使用 System.Console.WriteLine
来显示收到的每个消息。
显然,必须在运行 Pocket PC 应用程序之前在主机 PC 上启动它。例如,如果您的 PC 的 IP 地址是 192.168.1.1 并且其端口 14001 尚未被使用
C:>TcpTraceConsole 192.160.1.1 14001
跟踪监听器
我直接从 TraceListener
派生了 TcpTrace.TcpTraceListener
,并重写了 Write
和 WriteLine
方法,通过 TcpClient
实例将它们的输出重定向到控制台应用程序。此类被打包在自己的程序集中,因此可以在任何应用程序中使用。
- 在您的项目中添加对 TcpTrace.dll 的引用
- 在调用代码中的任何
Debug.Trace
之前,调用静态方法TcpTrace.InstallTcpTraceListener
。如果您使用带有参数的版本,则需要提供与启动 TcpTrace 控制台应用程序时使用的相同地址和端口。如果您使用不带参数的版本,则您的工作目录必须包含一个应用程序配置文件,其中以以下方式指定地址和端口:<configuration> <appSettings> <add key="TcpTraceServer" value="<SERVER_NAME>" /> <add key="TcpTracePort" value= "<PORT_NUMBER>" /> </appSettings> </configuration>
在源代码以及演示 .zip 文件中,包含了一个 Pocket PC WinForms 应用程序,演示了 TcpTrace.TcpTraceListener
的用法。
要运行 PpcTraceClient.exe 应用程序,您必须:
- 将 PpcTraceClient.exe、PpcTraceClient.exe.config、TcpTrace.dll 和 NetTech.Configuration.dll 文件复制到设备上的一个文件夹中。
- 编辑 PpcTraceClient.exe.config 并更新
TcpTraceServer
和TcpTracePort
条目,以匹配 TcpTraceConsole 正在监听的 IP 地址和端口。
在使用监听器时,我发现的一个小麻烦是,在我的实际设备上,当通过 USB 连接连接到我的台式 PC 时,我必须使用 PC 的 DNS 名称而不是其 IP 地址,而在模拟器中,我必须使用 IP 地址。您在您的配置中可能会发现不同的行为。