共用方式為


逐步解說:在桌面和裝置應用程式之間交換資料

更新:2007 年 11 月

在本逐步解說中,您將會在資料存放區內建立裝置代理程式應用程式、桌面應用程式,以及附加套件。桌面應用程式將會根據附加套件內的資訊部署及啟動裝置代理程式,接著將會與裝置代理程式應用程式交換封包資料,然後結束。您將完成下列工作:

  • 建立 Managed 裝置代理程式應用程式。

  • 為裝置代理程式應用程式建立附加套件。

  • 建立啟動套件並與裝置代理程式通訊的桌面應用程式。

注意事項:

您的電腦可能會在下列說明中,以不同名稱或位置顯示某些 Visual Studio 使用者介面項目。您所擁有的 Visual Studio 版本以及使用的設定會決定這些項目。如需詳細資訊,請參閱 Visual Studio 設定

建立裝置代理程式應用程式

若要建立裝置代理程式應用程式

  1. 啟動 Visual Studio。

  2. 在 [檔案] 功能表上,指向 [新增],然後按一下 [專案]。

    [新增專案] 對話方塊隨即出現。

  3. (Visual C#) 展開 [Visual C#],然後按一下 [智慧型裝置]。將專案命名為 DeviceAgent,並將方案命名為 DataExchange。按一下 [確定]。

    (Visual Basic) 展開 [ Visual Basic],然後按一下 [智慧型裝置]。將專案命名為 DeviceAgent,並將方案命名為 DataExchange。按一下 [確定]。

    [加入新的智慧型裝置專案] 對話方塊隨即出現。

  4. 選取 [Windows Mobile 5.0 Smartphone SDK] 為目標平台,按一下 [範本] 窗格內的 [主控台應用程式],然後再按一下 [確認]。

    新的 DeviceAgent 專案隨即在 [方案總管] 中顯示。

  5. (Visual C#) 在 [方案總管] 中,以滑鼠右鍵按一下 [參考],再按一下 [加入參考]。

    (Visual Basic) 在 [方案總管] 中,以滑鼠右鍵按一下 [DeviceAgent],再按一下 [加入參考]。

    [加入參考] 對話方塊隨即出現。

  6. 按一下 [瀏覽] 索引標籤並巡覽至 drive:\Program Files\Common Files\Microsoft Shared\CoreCon\1.0\Target\Lib。按一下 [Microsoft.Smartdevice.DeviceAgentTransport.dll],再按一下 [確定]。

    Microsoft.Smartdevice.DeviceAgentTransport 的參考隨即加入至專案。

  7. 在 [方案總管] 內,按兩下 [Program.cs] (C#) 或 [Module1.vb] (Visual Basic),在 [程式碼編輯器] 內開啟這些檔案 (如果這些檔案尚未開啟的話)。

  8. 將游標置於檔案的開頭。

  9. 插入下列程式碼:

    using Microsoft.SmartDevice.DeviceAgentTransport;
    
    Imports Microsoft.SmartDevice.DeviceAgentTransport
    
  10. 將游標置於 Main 方法內部。

  11. 插入下列程式碼:

    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 版本資訊的桌上型電腦。

  12. 在 [建置] 功能表上,按一下 [建置方案]。

    您現在已經擁有名為 DeviceAgent 的智慧型裝置應用程式。您稍後將會把這個應用程式部署至裝置。

在資料存放區內建立附加套件。

若要在資料存放區內建立附加套件

  1. 啟動 [記事本]。

  2. 將下列程式碼複製到 [記事本] 檔案中:

    <?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>
    
  3. 在 Visual Studio 內,按一下 [工具] 功能表上的 [建立 GUID]。

    [建立 GUID] 對話方塊隨即出現。

  4. 選取 [登錄格式],按一下 [複製],再按一下 [結束]。

  5. 將 GUID 貼至 [記事本] 內 Package 標記的 ID 屬性中,然後移除括住 GUID 的大括號。

    例如,<Package ID="9C50B38D-4259-40b3-AE9F-C5887DD898FF" Name="DeviceAgent">。

  6. 將 <PROPERTY ID="RootPath" Protected="True"> 標記的值變更為 DeviceAgent.exe 所在的資料夾。

    例如,<PROPERTY ID="RootPath" Protected="True">c:\DataExchange\DeviceAgent\bin\debug</PROPERTY>。

    注意事項:

    若要判斷 DeviceAgent.exe 的位置,請在 [方案總管] 內,以滑鼠右鍵按一下 [DeviceAgent] 專案,再按一下 [屬性]。按一下 [建置] 索引標籤,再按一下 [輸出路徑] 旁的 [瀏覽]。

  7. 將 drive:\Program Files\Common Files\Microsoft Shared\CoreCon\1.0\Target\wce400\armv4i\DeviceAgentTransport.dll 程式庫複製到根路徑下指定的路徑。

    注意事項:

    這個步驟很重要,因為 Microsoft.Smartdevice.DeviceAgentTransport.dll 組件 (Assembly) 會使用 DeviceAgentTransport.dll 程式庫。這兩個檔案必須與我們的應用程式一起部署。

  8. 在 [記事本] 中儲存檔案。

    \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,請使用另一個名稱。檔案名稱並不重要,因為資料夾內的所有檔案都會當做附加套件來處理。

  9. 結束並重新啟動 Visual Studio。

    Visual Studio 會在啟動時載入附加套件資料夾。如果 Visual Studio 正確啟動,則套件就不會出現語法錯誤的問題。

    資料存放區現在會包含名為 DeviceAgent 的附加套件,以及由 Visual Studio 產生的唯一 ID。部署套件後,智慧型裝置連接 API 會從 DeviceAgent 專案的輸出資料夾,將三個檔案複製到裝置的 drive:\Program File\DeviceAgent 目錄中,接著便會在裝置上執行 DeviceAgent.exe。

建立部署套件並與裝置代理程式通訊的桌面應用程式

若要建立部署套件並與裝置代理程式通訊的桌面應用程式

  1. 在 Visual Studio 的 [檔案] 功能表上,指向 [開啟],再按一下 [專案/方案]。

    [開啟專案] 對話方塊隨即出現。

  2. 巡覽至 DataExchange.sln 方案並按一下該方案,然後按一下 [開啟]。

    [方案總管] 隨即出現,其中含有 DeviceAgent 應用程式。

  3. 在 [檔案] 功能表上指向 [加入],然後按一下 [新增專案]。

    [新增專案] 對話方塊隨即出現。

  4. (Visual C#) 展開 [Visual C#],然後按一下 [視窗]。

    (Visual Basic) 展開 [ Visual Basic],然後按一下 [視窗]。

  5. 按一下 [範本] 窗格中的 [主控台應用程式]。

  6. 將專案命名為 DesktopSide,再按一下 [確定]。

    [方案總管] 現在包含了兩個專案:DeviceAgent 和 DesktopSide。

  7. 在 [方案總管] 中,以滑鼠右鍵按一下 [DesktopSide] 專案,然後按一下 [設定為啟始專案]。

  8. (Visual C#) 在 [方案總管] 中,以滑鼠右鍵在 [DesktopSide] 專案內按一下 [參考],再按一下 [加入參考]。

    (Visual Basic) 在 [方案總管] 中,以滑鼠右鍵按一下 [DesktopSide],再按一下 [加入參考]。

    [加入參考] 對話方塊隨即出現。

  9. 按一下 [瀏覽] 索引標籤,巡覽至 drive:\Program Files\Common Files\Microsoft Shared\CoreCon\1.0\Bin, click Microsoft.Smartdevice.Connectivity.dll,再按一下 [確定]。

    Microsoft.Smartdevice.Connectivity 的參考隨即加入至 DesktopSide 專案。

  10. 在 [方案總管] 內,按兩下 [DesktopSide] 專案中的 [Program.cs] (C#) 或 [Module1.vb] (Visual Basic),在 [程式碼編輯器] 內開啟這些檔案 (如果這些檔案尚未開啟的話)。

  11. 將游標置於檔案的開頭。

  12. 插入下列程式碼:

    using Microsoft.SmartDevice.Connectivity;
    using System.Collections.ObjectModel;
    
    Imports Microsoft.SmartDevice.Connectivity
    Imports System.Collections.ObjectModel
    
  13. 將游標置於 Main 方法內部。

  14. 插入下列程式碼:

    // 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) 中顯示。

  15. 將套件的 ID 加入至 emulator.GetRemoteAgent(new ObjectId(""))。

    例如 emulator.GetRemoteAgent(new ObjectId("F85E57BA-5AE9-4FF7-8433-6AB7D991D034"))

  16. 將下列 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
    
  17. 按 F5 以偵錯 DesktopSide 專案。

    如果模擬器尚未啟動,DesktopSide 會連接並啟動模擬器。接著它會部署套件並啟動 DeviceAgent 應用程式。然後 DesktopSide 和 DeviceAgent 將會交換封包資訊,並顯示供使用者查看。

請參閱

概念

使用智慧型裝置連接 API 控制裝置

附加套件的概觀

其他資源

智慧型裝置連接 API 參考

智慧型裝置連接 API 範例