逐步解說:在桌面和裝置應用程式之間交換資料
更新:2007 年 11 月
在本逐步解說中,您將會在資料存放區內建立裝置代理程式應用程式、桌面應用程式,以及附加套件。桌面應用程式將會根據附加套件內的資訊部署及啟動裝置代理程式,接著將會與裝置代理程式應用程式交換封包資料,然後結束。您將完成下列工作:
建立 Managed 裝置代理程式應用程式。
為裝置代理程式應用程式建立附加套件。
建立啟動套件並與裝置代理程式通訊的桌面應用程式。
注意事項: |
---|
您的電腦可能會在下列說明中,以不同名稱或位置顯示某些 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],再按一下 [加入參考]。
[加入參考] 對話方塊隨即出現。
按一下 [瀏覽] 索引標籤並巡覽至 drive:\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 貼至 [記事本] 內 Package 標記的 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] 專案,再按一下 [屬性]。按一下 [建置] 索引標籤,再按一下 [輸出路徑] 旁的 [瀏覽]。
將 drive:\Program Files\Common Files\Microsoft Shared\CoreCon\1.0\Target\wce400\armv4i\DeviceAgentTransport.dll 程式庫複製到根路徑下指定的路徑。
注意事項: 這個步驟很重要,因為 Microsoft.Smartdevice.DeviceAgentTransport.dll 組件 (Assembly) 會使用 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 專案的輸出資料夾,將三個檔案複製到裝置的 drive:\Program File\DeviceAgent 目錄中,接著便會在裝置上執行 DeviceAgent.exe。
建立部署套件並與裝置代理程式通訊的桌面應用程式
若要建立部署套件並與裝置代理程式通訊的桌面應用程式
在 Visual Studio 的 [檔案] 功能表上,指向 [開啟],再按一下 [專案/方案]。
[開啟專案] 對話方塊隨即出現。
巡覽至 DataExchange.sln 方案並按一下該方案,然後按一下 [開啟]。
[方案總管] 隨即出現,其中含有 DeviceAgent 應用程式。
在 [檔案] 功能表上指向 [加入],然後按一下 [新增專案]。
[新增專案] 對話方塊隨即出現。
(Visual C#) 展開 [Visual C#],然後按一下 [視窗]。
(Visual Basic) 展開 [ Visual Basic],然後按一下 [視窗]。
按一下 [範本] 窗格中的 [主控台應用程式]。
將專案命名為 DesktopSide,再按一下 [確定]。
[方案總管] 現在包含了兩個專案:DeviceAgent 和 DesktopSide。
在 [方案總管] 中,以滑鼠右鍵按一下 [DesktopSide] 專案,然後按一下 [設定為啟始專案]。
(Visual C#) 在 [方案總管] 中,以滑鼠右鍵在 [DesktopSide] 專案內按一下 [參考],再按一下 [加入參考]。
(Visual Basic) 在 [方案總管] 中,以滑鼠右鍵按一下 [DesktopSide],再按一下 [加入參考]。
[加入參考] 對話方塊隨即出現。
按一下 [瀏覽] 索引標籤,巡覽至 drive:\Program Files\Common Files\Microsoft Shared\CoreCon\1.0\Bin, click Microsoft.Smartdevice.Connectivity.dll,再按一下 [確定]。
Microsoft.Smartdevice.Connectivity 的參考隨即加入至 DesktopSide 專案。
在 [方案總管] 內,按兩下 [DesktopSide] 專案中的 [Program.cs] (C#) 或 [Module1.vb] (Visual Basic),在 [程式碼編輯器] 內開啟這些檔案 (如果這些檔案尚未開啟的話)。
將游標置於檔案的開頭。
插入下列程式碼:
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 模擬器,並將遠端代理程式部署至裝置。該程式碼接著會建立與裝置的連接,並讀取封包資料。從裝置讀取的資訊會在主控台 (Console) 中顯示。
將套件的 ID 加入至 emulator.GetRemoteAgent(new ObjectId(""))。
例如 emulator.GetRemoteAgent(new ObjectId("F85E57BA-5AE9-4FF7-8433-6AB7D991D034"))
將下列 Helper 方法貼至 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 將會交換封包資訊,並顯示供使用者查看。