チュートリアル : デスクトップ アプリケーションとデバイス アプリケーションの間でデータを交換する
更新 : 2007 年 11 月
このチュートリアルでは、デバイス エージェント アプリケーション、デスクトップ アプリケーション、およびデータ ストア内のアドオン パッケージを作成します。デスクトップ アプリケーションは、アドオン パッケージ内の情報に基づいてデバイス エージェントの配置と起動を行います。その後、デスクトップ アプリケーションはデバイス エージェント アプリケーションとパケット データを交換し、終了します。このチュートリアルでは、次のタスクを実行します。
マネージ デバイス エージェント アプリケーションを作成します。
デバイス エージェント アプリケーション用のアドオン パッケージを作成します。
パッケージの起動とデバイス エージェントとの通信を行うデスクトップ アプリケーションを作成します。
メモ : |
---|
お使いのマシンで、Visual Studio ユーザー インターフェイスの一部の要素の名前や場所が、次の手順とは異なる場合があります。これらの要素は、使用している Visual Studio のエディションや独自の設定によって決まります。詳細については、「Visual Studio の設定」を参照してください。 |
デバイス エージェント アプリケーションを作成する
デバイス エージェント アプリケーションを作成するには
Visual Studio を起動します。
[ファイル] メニューの [新規作成] をポイントし、[プロジェクト] をクリックします。
[新しいプロジェクト] ダイアログ ボックスが表示されます。
(Visual C#) [Visual C#] を展開し、[スマート デバイス] をクリックします。プロジェクトに「DeviceAgent」、ソリューションに「DataExchange」という名前を付けます。[OK] をクリックします。
(Visual Basic) [Visual Basic] を展開し、[スマート デバイス] をクリックします。プロジェクトに「DeviceAgent」、ソリューションに「DataExchange」という名前を付けます。[OK] をクリックします。
[新規スマート デバイス プロジェクトの追加] ダイアログ ボックスが表示されます。
ターゲット プラットフォームとして [Windows Mobile 5.0 Smartphone SDK] を選択します。次に、テンプレート ペインの [コンソール アプリケーション] をクリックし、[OK] をクリックします。
新しい DeviceAgent プロジェクトがソリューション エクスプローラに表示されます。
(Visual C#) ソリューション エクスプローラで [参照設定] を右クリックし、[参照の追加] をクリックします。
(Visual Basic) ソリューション エクスプローラで [DeviceAgent] を右クリックし、[参照の追加] をクリックします。
[参照の追加] ダイアログ ボックスが表示されます。
[参照] タブをクリックし、drive:\Program Files\Common Files\Microsoft Shared\CoreCon\1.0\Target\Lib に移動します。Microsoft.Smartdevice.DeviceAgentTransport.dll をクリックし、[OK] をクリックします。
プロジェクトに 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 の作成] ダイアログ ボックスが表示されます。
[Registry Format] を選択し、[コピー] をクリックしてから [終了] をクリックします。
メモ帳の Package タグの ID 属性に GUID を貼り付け、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 アセンブリは 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 が正しく起動された場合、パッケージで構文エラーは発生しません。
これで、Visual Studio によって生成された一意な ID を持つ、DeviceAgent という名前のアドオン パッケージがデータ ストア内に作成されました。このパッケージが配置されると、スマート デバイス接続 API によって、DeviceAgent プロジェクトの出力フォルダからデバイスの drive:\Program File\DeviceAgent ディレクトリに 3 つのファイルがコピーされます。次に、デバイス上で DeviceAgent.exe が実行されます。
パッケージの配置とデバイス エージェントとの通信を行うデスクトップ アプリケーションを作成する
パッケージの配置とデバイス エージェントとの通信を行うデスクトップ アプリケーションを作成するには
Visual Studio で、[ファイル] メニューの [開く] をポイントし、[プロジェクト/ソリューション] をクリックします。
[プロジェクトを開く] ダイアログ ボックスが表示されます。
DataExchange.sln ソリューションを探してクリックし、[開く] をクリックします。
ソリューション エクスプローラに DeviceAgent アプリケーションが表示されます。
[ファイル] メニューの [追加] をポイントし、[新しいプロジェクト] をクリックします。
[新しいプロジェクト] ダイアログ ボックスが表示されます。
(Visual C#) [Visual C#] を展開し、[Windows] をクリックします。
(Visual Basic) [Visual Basic] を展開し、[Windows] をクリックします。
テンプレート ペインの [コンソール アプリケーション] をクリックします。
プロジェクトに「DesktopSide」という名前を付け、[OK] をクリックします。
DeviceAgent と DesktopSide という 2 つのプロジェクトがソリューション エクスプローラに表示されます。
ソリューション エクスプローラで DesktopSide プロジェクトを右クリックし、[スタートアップ プロジェクトに設定] をクリックします。
(Visual C#) ソリューション エクスプローラ で DesktopSide プロジェクトの [参照設定] を右クリックし、[参照の追加] をクリックします。
(Visual Basic) ソリューション エクスプローラで DesktopSide を右クリックし、[参照の追加] をクリックします。
[参照の追加] ダイアログ ボックスが表示されます。
[参照] タブをクリックし、drive:\Program Files\Common Files\Microsoft Shared\CoreCon\1.0\Bin, click Microsoft.Smartdevice.Connectivity.dll に移動し、[OK] をクリックします。
DesktopSide プロジェクトに Microsoft.Smartdevice.Connectivity への参照が追加されます。
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 エミュレータに接続し、デバイスにリモート エージェントを配置します。次に、デバイスとの接続を確立し、パケット データを読み込みます。デバイスから読み取られた情報は、コンソールに表示されます。
パッケージの 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 の間でパケット情報が交換され、ユーザーに表示されます。