演练:在台式机应用程序与设备应用程序之间交换数据
更新:2007 年 11 月
在本演练中,您将在数据存储中创建一个设备代理应用程序、一个台式机应用程序以及一个加载项包。台式机应用程序将根据加载项包中的信息部署并启动设备代理。随后,台式机应用程序将与设备代理应用程序交换数据包数据,并在交换完毕后终止。您将完成下列任务:
创建一个托管设备代理应用程序。
为设备代理应用程序创建一个加载项包。
创建一个启动包并与设备代理进行通信的台式机应用程序。
说明: |
---|
对于在以下说明中使用的某些 Visual Studio 用户界面元素,您的计算机可能会显示不同的名称或位置。这些元素取决于您使用的 Visual Studio 版本及设置。有关更多信息,请参见Visual Studio 设置。 |
创建设备代理应用程序
创建设备代理应用程序
启动 Visual Studio。
在“文件”菜单上,指向“新建”,然后单击“项目”。
将出现“新建项目”对话框。
(Visual C#) 展开“Visual C#”,然后单击“智能设备”。将项目命名为 DeviceAgent 并将解决方案命名为 DataExchange。单击“确定”。
(Visual Basic) 展开“Visual Basic”,然后单击“智能设备”。将项目命名为 DeviceAgent 并将解决方案命名为 DataExchange。单击“确定”。
将出现“添加新智能设备项目”对话框。
选择“Windows Mobile 5.0 Smartphone SDK”作为目标平台,接着在“模板”窗格中单击“控制台应用程序”,然后单击“确定”。
新的 DeviceAgent 项目随即会显示在“解决方案资源管理器”中。
(Visual C#) 在“解决方案资源管理器”中右击“引用”,再单击“添加引用”。
(Visual Basic) 在“解决方案资源管理器”中右击“DeviceAgent”,再单击“添加引用”。
随即出现“添加引用”对话框。
单击“浏览”选项卡并定位至 驱动器:\Program Files\Common Files\Microsoft Shared\CoreCon\1.0\Target\Lib。单击 Microsoft.Smartdevice.DeviceAgentTransport.dll,再单击“确定”。
随即会向项目中添加对 Microsoft.Smartdevice.DeviceAgentTransport 的引用。
如果 Program.cs (C#) 或 Module1.vb (Visual Basic) 尚未打开,请在“解决方案资源管理器”中双击该文件,以便在代码编辑器中将其打开。
将光标定位到文件开头。
插入下列代码:
using Microsoft.SmartDevice.DeviceAgentTransport;
Imports Microsoft.SmartDevice.DeviceAgentTransport
将光标定位到 Main 方法内部。
插入下列代码:
string[] serviceids = {"A92866CA-AE83-4848-9438-501D8DB3CF25"}; IDeviceAgentTransport transport = DeviceAgentTransportFactory.GetAgentTransport(); // Don't keep it waiting. transport.AcknowledgeLaunch(1, serviceids); IDevicePacketStream packetstream; transport.AcceptConnectionEx(serviceids[0], out packetstream); IPacket packet; packet = PacketFactory.GetNewPacket(); packet.WriteInt32(Environment.Version.Major); packet.WriteInt32(Environment.Version.Minor); packet.WriteInt32(Environment.Version.Build); packet.WriteInt32(Environment.Version.Revision); packetstream.Write(packet);
Dim serviceids(0 To 0) As String serviceids(0) = "A92866CA-AE83-4848-9438-501D8DB3CF25" Dim transport As IDeviceAgentTransport = DeviceAgentTransportFactory.GetAgentTransport() ' Don't keep it waiting. transport.AcknowledgeLaunch(1, serviceids) Dim packetstream As IDevicePacketStream transport.AcceptConnectionEx(serviceids(0), packetstream) Dim packet As IPacket packet = PacketFactory.GetNewPacket() packet.WriteInt32(Environment.Version.Major) packet.WriteInt32(Environment.Version.Minor) packet.WriteInt32(Environment.Version.Build) packet.WriteInt32(Environment.Version.Revision) packetstream.Write(packet)
上述代码将创建一个 IDeviceAgentTransport 对象,然后接受来自台式计算机的连接。该程序会向台式计算机发送一个包含 .NET Compact Framework 版本信息的数据包。
在“生成”菜单上单击“生成解决方案”。
现在便得到了一个名为 DeviceAgent 的智能设备应用程序。稍后您要将此应用程序部署到设备中。
在数据存储中创建一个加载项包。
在数据存储中创建加载项包
启动记事本。
将下面的代码复制到记事本文件中:
<?xml version="1.0" standalone="no"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:template match="/"> <ADDONCONTAINER> <ADDON> <PACKAGECONTAINER> <PACKAGE ID="" NAME="DeviceAgent"> <PROPERTYCONTAINER /> <PACKAGETYPECONTAINER> <PACKAGETYPE Name="ARMV4I" ID="ARMV4I" Protected="True"> <PROPERTYCONTAINER> <PROPERTY ID="RemotePath" Protected="True">%CSIDL_PROGRAM_FILES%\DeviceAgent</PROPERTY> <PROPERTY ID="RootPath" Protected="True">C:\DataExchange\DeviceAgent\bin\Debug</PROPERTY> <PROPERTY ID="CPU" Protected="True">ARMV4I</PROPERTY> <PROPERTY ID="Host" Protected="True">DeviceAgent</PROPERTY> </PROPERTYCONTAINER> <FILECONTAINER> <FILE ID="DeviceAgent.exe" /> <FILE ID="Microsoft.Smartdevice.DeviceAgentTransport.dll" /> <FILE ID="DeviceAgentTransport.dll" /> </FILECONTAINER> </PACKAGETYPE> </PACKAGETYPECONTAINER> </PACKAGE> </PACKAGECONTAINER> </ADDON> </ADDONCONTAINER> </xsl:template> </xsl:stylesheet>
在 Visual Studio 中的“工具”菜单上单击“创建 GUID”。
将出现“创建 GUID”对话框。
选择“注册表格式”,单击“复制”,再单击“退出”。
将 GUID 粘贴到记事本内包标记的 ID 属性中,同时移除括在 GUID 两侧的大括号。
例如,<Package ID="9C50B38D-4259-40b3-AE9F-C5887DD898FF" Name="DeviceAgent">。
将 <PROPERTY ID="RootPath" Protected="True"> 标记的值更改为 DeviceAgent.exe 所在的文件夹。
例如,<PROPERTY ID="RootPath" Protected="True">c:\DataExchange\DeviceAgent\bin\debug</PROPERTY>。
说明: 若要确定 DeviceAgent.exe 的位置,请在“解决方案资源管理器”中右击“DeviceAgent”项目,再单击“属性”。单击“生成”选项卡,然后单击“输出路径”旁边的“浏览”。
将 驱动器:\Program Files\Common Files\Microsoft Shared\CoreCon\1.0\Target\wce400\armv4i\DeviceAgentTransport.dll 库复制到根路径下指定的路径下。
说明: 此步骤十分重要,原因是 Microsoft.Smartdevice.DeviceAgentTransport.dll 程序集要使用 DeviceAgentTransport.dll 库。这两个文件必须随我们的应用程序一起部署。
在记事本中,保存文件。
\ProgramData\Microsoft\corecon\1.0\addons\package.xsl (Windows Vista)
\Documents and Settings\All Users\Application Data\Microsoft\corecon\1.0\addons\package.xsl(其他)
说明: 如果文件名 package.xsl 已在使用中,请使用其他名称。文件名并不重要,因为该文件夹中的所有文件都将被作为加载项包处理。
退出并重新启动 Visual Studio。
Visual Studio 在启动时将加载该加载项包文件夹。如果 Visual Studio 能正常启动,则说明该包没有语法错误。
数据存储现在包含一个名为 DeviceAgent 的加载项包以及一个由 Visual Studio 唯一生成的 ID。部署该包时,智能设备连接 API 会将三个文件从 DeviceAgent 项目的输出文件夹复制到设备的 驱动器:\Program File\DeviceAgent 目录下,然后在设备上执行 DeviceAgent.exe。
创建部署包并与设备代理进行通信的台式机应用程序
创建部署包并与设备代理进行通信的台式机应用程序
在 Visual Studio 中的“文件”菜单上,指向“打开”,然后单击“项目/解决方案”。
将出现“打开项目”对话框。
定位至 DataExchange.sln 解决方案,单击它,再单击“打开”。
将出现“解决方案资源管理器”,其中会显示 DeviceAgent 应用程序。
在“文件”菜单上指向“添加”,然后单击“新建项目”。
将出现“新建项目”对话框。
(Visual C#) 展开“Visual C#”,然后单击“Windows”。
(Visual Basic) 展开“Visual Basic”,然后单击“Windows”。
在“模板”窗格中单击“控制台应用程序”。
将项目命名为 DesktopSide,然后单击“确定”。
“解决方案资源管理器”现在包含两个项目:DeviceAgent 和 DesktopSide。
在“解决方案资源管理器”中右击“DesktopSide”项目,再单击“设为启动项目”。
(Visual C#) 在“解决方案资源管理器”中的 DesktopSide 项目中右击“引用”,再单击“添加引用”。
(Visual Basic) 在“解决方案资源管理器”中右击“DesktopSide”,再单击“添加引用”。
随即出现“添加引用”对话框。
单击“浏览”选项卡,定位至 驱动器:\Program Files\Common Files\Microsoft Shared\CoreCon\1.0\Bin,单击 Microsoft.Smartdevice.Connectivity.dll,再单击“确定”。
随即会向 DesktopSide 项目中添加对 Microsoft.Smartdevice.Connectivity 的引用。
如果 Program.cs (C#) 或 Module1.vb (Visual Basic) 尚未打开,请在“解决方案资源管理器”中的“DesktopSide”项目中双击该文件,以便在代码编辑器中将其打开。
将光标定位到文件开头。
插入下列代码:
using Microsoft.SmartDevice.Connectivity; using System.Collections.ObjectModel;
Imports Microsoft.SmartDevice.Connectivity Imports System.Collections.ObjectModel
将光标定位到 Main 方法内部。
插入下列代码:
// Change the locale ID to correspond to your installation of Visual Studio. DatastoreManager dsmgr = new DatastoreManager(1033); Platform platform = GetPlatformByName("Windows Mobile 5.0 Smartphone SDK", dsmgr); Device emulator = platform.GetDevice(platform.GetDefaultDeviceId()); emulator.Connect(); // Add the GUID of your package below. RemoteAgent ra = emulator.GetRemoteAgent(new ObjectId("")); ra.Start("command line argument"); DevicePacketStream ps = ra.CreatePacketStream(new ObjectId("A92866CA-AE83-4848-9438-501D8DB3CF25")); Packet packet; packet = new Packet(); while (ps.IsConnected()) { if (ps.IsPacketAvailable()) { packet = ps.Read(); while (!packet.IsEndOfPacket()) { switch (packet.ReadDataType()) { case DataType.Int32Type: Console.WriteLine("Int32Type: " + packet.ReadInt32().ToString()); break; case DataType.StringType: Console.WriteLine("String: " + packet.ReadString()); break; default: break; } } break; } } Console.Read();
' Change the locale ID to correspond to your installation of Visual Studio. Dim dsmgr As New DatastoreManager(1033) Dim platform As Platform = GetPlatformByName("Windows Mobile 5.0 Smartphone SDK", dsmgr) Dim emulator As Device = platform.GetDevice(platform.GetDefaultDeviceId()) emulator.Connect() ' Add the GUID of your package below. Dim ra As RemoteAgent = emulator.GetRemoteAgent(New ObjectId("")) ra.Start("command line argument") Dim ps As DevicePacketStream = ra.CreatePacketStream(New ObjectId("A92866CA-AE83-4848-9438-501D8DB3CF25")) Dim packet As Packet packet = New Packet() While ps.IsConnected() If ps.IsPacketAvailable() Then packet = ps.Read() While Not packet.IsEndOfPacket() Select Case packet.ReadDataType() Case DataType.Int32Type Console.WriteLine("Int32Type: " + packet.ReadInt32().ToString()) Case DataType.StringType Console.WriteLine("String: " + packet.ReadString()) Case Else End Select End While Exit While End If End While Console.Read()
上述代码将连接至 Windows Mobile 5.0 仿真程序,并将远程代理部署到设备中。随后,它将建立与设备间的连接并读取数据包数据。从设备中读取的信息将显示在控制台中。
将包 ID 添加到 emulator.GetRemoteAgent(new ObjectId("")) 中。
例如,emulator.GetRemoteAgent(new ObjectId("F85E57BA-5AE9-4FF7-8433-6AB7D991D034"))
将下面的帮助器方法粘贴在 Main 方法之下:
// Return a platform if the supplied name can be found in the datastore. // Return null pointer if platform cannot be found. private static Platform GetPlatformByName(string p, DatastoreManager dsmgr) { // Get all platforms in the datastore. Collection<Platform> platforms = dsmgr.GetPlatforms(); // Find the platform whose name matches the parameter. foreach (Platform platform in platforms) { if (platform.Name == p) return platform; } return null; }
' Return a platform if the supplied name can be found in the datastore. ' Return null pointer if platform cannot be found. Private Function GetPlatformByName(ByVal p As String, ByVal dsmgr As DatastoreManager) As Platform ' Get all platforms in the datastore. Dim platforms As Collection(Of Platform) = dsmgr.GetPlatforms() ' Find the platform whose name matches the parameter. Dim platform As Platform For Each platform In platforms If platform.Name = p Then Return platform End If Next platform Return Nothing End Function 'GetPlatformByName
按 F5 调试 DesktopSide 项目。
DesktopSide 将连接仿真程序,如果仿真程序尚未启动,则将其启动。接下来,它将部署包并启动 DeviceAgent 应用程序。随后,DesktopSide 和 DeviceAgent 将交换数据包信息,并将信息显示给用户。