Windows Phone 7エミュレーターオートメーション

みなさん、こんにちは

この記事では、Windows Phone 7エミュレーターを自動化する方法と、実際の生活にもたらすメリットについて説明します。







この記事は、Windows Phone 7の高度な機能に関する一連の無関係な記事の2番目です。

このシリーズの前回の記事は、「 Windows Phone 7-ロック解除されたROM 」と呼ばれていました。



Windows Phone 7エミュレーターを自動化する理由



現在、Windows Phone 7エミュレーターは、Visual Studio 2010からのみ開発者パッケージ(XAP)を実行できます。

つまり、XAPがある場合、Visual Studioなしでエミュレータを強制的にロードすることはできません。

前の記事で見たように、エミュレーターを起動して、Visual Studioを搭載していないコンピューターにインストールすることもできます。 詳細はこちらをご覧ください

現時点では、XAPをエミュレーターにロードするには、Visual Studioを使用する必要があると想像してください。



問題はこれです: Visual Studioを使用せずにWP7を使用してエミュレーターまたはデバイスにXAPを読み込む方法は?

それでも、ビルドサーバーはどのようにして夜間テストを実行しますか? それとも、顧客はアプリケーションをどのように見ますか?



クライアントとビルドサーバーにはVisual Studio 2010がインストールされていません。

では、これらのマシンで実行されているエミュレーターにXAPをデプロイするにはどうすればよいでしょうか?



おしゃべりを止めて、WP7エミュレータを自動化してください!



コンソールアプリケーションとWindows Phone 7のアプリケーションで構成される新しいソリューションを作成しましょう。







コンソールアプリケーションは、どのコンピューターでも動作する自動化ツールとして使用します。 NET Framework。

WindowsPhoneのアプリケーションは、展開を自動化するアプリケーションです。



CoreCon 10 WP7 API



WP7を自動化するための秘密のソースはCoreCon APIです。

CoreConライブラリは、2007年にメジャーアップデートを最後に受け取ってから、冬眠状態にあります。

ただし、WP7では、CoreCon APIが更新され、WP7デバイスおよびエミュレーターにアプリケーションを展開するときにVisual Studio 2010で使用されるようになりました。

CoreCon APIからMicrosoft.SmartDevice.Connectivity.dllへのリンクを追加しましょう。

64ビットシステムでは、DLLは次の場所にあります。C:\ Program Files(x86)\ Common Files \ Microsoft Shared \ Phone Tools \ CoreCon \ 10.0 \ Bin \ Microsoft.Smartdevice.Connectivity.dll







CoreCon DLLへのリンクができたので、WP7の自動化を開始できます。

最終的には次のようになります。







次の一連のアクションを実行する必要があります。
  1. WP7 CoreCon SDKのインスタンスを取得します
  2. エミュレータ/デバイスへのリンクを取得
  3. エミュレーター/デバイスに接続する
  4. 前のバージョンを削除
  5. xapをインストールする
  6. アプリケーションを実行する
WP7 CoreCon SDKインスタンスの取得


まず、WP7 CoreCon SDKのインスタンスを取得して作業します。

// Get CoreCon WP7 SDK DatastoreManager dsmgrObj = new DatastoreManager(1033); Platform WP7SDK = dsmgrObj.GetPlatforms().Single(p => p.Name == "New Windows Mobile 7 SDK" ); * This source code was highlighted with Source Code Highlighter .



  1. // Get CoreCon WP7 SDK DatastoreManager dsmgrObj = new DatastoreManager(1033); Platform WP7SDK = dsmgrObj.GetPlatforms().Single(p => p.Name == "New Windows Mobile 7 SDK" ); * This source code was highlighted with Source Code Highlighter .



  2. // Get CoreCon WP7 SDK DatastoreManager dsmgrObj = new DatastoreManager(1033); Platform WP7SDK = dsmgrObj.GetPlatforms().Single(p => p.Name == "New Windows Mobile 7 SDK" ); * This source code was highlighted with Source Code Highlighter .



  3. // Get CoreCon WP7 SDK DatastoreManager dsmgrObj = new DatastoreManager(1033); Platform WP7SDK = dsmgrObj.GetPlatforms().Single(p => p.Name == "New Windows Mobile 7 SDK" ); * This source code was highlighted with Source Code Highlighter .



// Get CoreCon WP7 SDK DatastoreManager dsmgrObj = new DatastoreManager(1033); Platform WP7SDK = dsmgrObj.GetPlatforms().Single(p => p.Name == "New Windows Mobile 7 SDK" ); * This source code was highlighted with Source Code Highlighter .





エミュレータ/デバイスへのリンクを取得する


次に、WP7を使用した物理デバイス、またはWP7を使用したエミュレーターへのリンクを取得する必要があります。

この例ではエミュレーターを使用しますが、フラグメント「 useEmulator = false 」を設定すると、この例ではWP7を使用して物理デバイスに接続しようとします。





  1. //エミュレータ/デバイスを取得します
  2. bool useEmulator = true ;
  3. デバイスWP7Device = null ;
  4. if (useEmulator)
  5. WP7Device = WP7SDK.GetDevices()。Single(d => d.Name == "Windows Phone 7 Emulator" );
  6. 他に
  7. WP7Device = WP7SDK.GetDevices()。Single(d => d.Name == "Windows Phone 7 Device" );
*このソースコードは、 ソースコードハイライターで強調表示されました。


エミュレーター/デバイスに接続する


次に、WP7でエミュレーター/デバイスを実行します。

標準のWP7エミュレーターイメージを起動することに注意してください。 以前の記事で、ロック解除ROMをデフォルトROMとして使用する方法を説明しました。





  1. // WP7エミュレーター/デバイスに接続します
  2. Console .WriteLine( "Windows Phone 7エミュレーター/デバイスへの接続..." );
  3. WP7Device.Connect();
  4. Console .WriteLine( "Windows Phone 7エミュレーター/接続されたデバイス..." );
*このソースコードは、 ソースコードハイライターで強調表示されました。


前のバージョンを削除


次に、アプリケーションが既にインストールされていることを確認する必要があります。インストールされている場合は削除します。

UpdateApplicationメソッドは現在のCoreCon APIでは機能しないため、これはインストール済みのアプリケーションを更新する最も簡単な方法です。



アプリケーションをインストールまたはアンインストールするには 、アプリケーション製品識別子(GUID)が必要です。

Properties / WMAppManifest.xmlファイルからアプリケーションGUIDを取得できます







次のコードは、アプリケーションがインストールされているかどうかを確認し、インストールされている場合は削除します。





  1. Guid appID = new Guid"{5e75bba1-fbf6-463c-94ac-fa4a78f8fd12}" );
  2. RemoteApplicationアプリ。
  3. if (WP7Device.IsApplicationInstalled(appID))
  4. {
  5. Console .WriteLine( "Windows Phone 7 Emulator / DeviceへのサンプルXAPのアンインストール..." );
  6. app = WP7Device.GetApplication(appID);
  7. app.Uninstall();
  8. Console .WriteLine( 「Windows Phone 7エミュレーター/デバイスからアンインストールされたサンプルXAP ...」 );
  9. }
*このソースコードは、 ソースコードハイライターで強調表示されました。


XAPインストール


次に、XAPをインストールします。

これを行うには、次に関する情報が必要です。

  1. XAPの場所。
  2. アプリケーションGUID。
  3. アプリケーションアイコンの場所。




  1. // XAPをインストールします
  2. Console .WriteLine( 「Windows Phone 7エミュレーター/デバイスへのサンプルXAPのインストール...」 );
  3. app = WP7Device.InstallApplication(
  4. appID
  5. appID
  6. 「NormalApp」
  7. @ "D:\ visual studio 2010 \ Projects \ ConsoleApplication1 \ WindowsPhoneApplication1 \ ApplicationIcon.png"
  8. @ "D:\ visual studio 2010 \ Projects \ ConsoleApplication1 \ WindowsPhoneApplication1 \ Bin \ Debug \ WindowsPhoneApplication1.xap" );
  9. Console .WriteLine( "Windows Phone 7 EmulatorにインストールされたサンプルXAP ..." );
*このソースコードは、 ソースコードハイライターで強調表示されました。


アプリケーションの起動


最後のステップ:アプリケーションを起動します。





  1. //アプリケーションを起動します
  2. Console .WriteLine( "Windows Phone 7 Emulatorでサンプルアプリを起動しています..." );
  3. app.Launch();
  4. Console .WriteLine( "Windows Phone 7 Emulatorでサンプルアプリを起動..." );
*このソースコードは、 ソースコードハイライターで強調表示されました。


できました。 実際、サンプルを実行すると、アプリケーションは次のように機能します。







それでは、なぜWP7エミュレーターの自動化が役立つのでしょうか?



優れたユースケースは多数あります。自動ユニットテスト、エミュレーターへのナイトリービルドのロード、さらには顧客がWP7エミュレーターを使用する能力です。

実際、WP7エミュレーターの自動化が役立つ場合には多くの理由と状況があり、自分でプロジェクトでそれを使用する方法を理解できます。



たとえば、 Vertigoでは、オートメーションを使用して、お客様が所有しているマルチタッチラップトップでWP7エミュレーターを実行しています。

これにより、クライアントはVisual Studio 2010をインストールしなくても現在のビルドにアクセスできます。



分離ストレージへのアクセス



それを使用する1つの方法は、私にとって特に興味深いものです。夜間ビルド用のプロジェクトのすべてのユニットテストを自動的に起動します。







WP7エミュレーターを自動化するために、以前に実行したアクションに限定することができますが、どのようにして結果を取得しますか? または指示を得る?



私が思いつく最も簡単な方法は、コールドストレージを介して通信することでした-隔離されたストレージでファイルを読み書きします。







まず、WP7アプリケーションIsoStoreにファイルを書き込むことから始めます。

このコードはWP7エミュレーター/デバイスで実行されることに注意してください。





  1. パブリック MainPage()
  2. {
  3. InitializeComponent();
  4. SupportedOrientations = SupportedPageOrientation.Portrait | SupportedPageOrientation.Landscape;
  5. 使用var isoStore = IsolatedStorageFile.GetUserStoreForApplication())
  6. 使用var sw = new StreamWriter(isoStore.OpenFile( "Foo.txt"FileMode .OpenOrCreate、FileAccess.Write)))
  7. {
  8. sw.Write( "Hello WP7!(WP7 IsoStoreから作成、Console Harnessによって読み取られます!)" );
  9. }
  10. }
*このソースコードは、 ソースコードハイライターで強調表示されました。


基本的に、IsoStoreにfoo.txtファイルを追加し、それにテキストを追加しました。



次に、RemoteIsolatedStorageクラスを使用してIsoStoreエミュレーターにアクセスしますが、CoreCon10にはまだ含まれていません。







RemoteApplication.GetIsolatedStorage()を使用しますが、まだ実装されていません。



代わりに、FileDeployerクラスを使用します。

アプリケーションで使用できるFileDeployerクラスのコピーの取得には、いくつかの反射的な魔法が含まれます。





  1. Thread.Sleep(10000);
  2. //app.GetIsolatedStore(); <-NotImplementedExceptionがスローされます
  3. オブジェクト ConManServer = WP7Device.GetType()。GetField( "mConmanServer" 、BindingFlags.NonPublic | BindingFlags.Instance).GetValue(WP7Device);
  4. FileDeployer f =(FileDeployer) typeof (FileDeployer).GetConstructors(BindingFlags.Instance | BindingFlags.NonPublic)[0] .Invoke( new object [] {ConManServer});
*このソースコードは、 ソースコードハイライターで強調表示されました。


次に、foo.txtファイルをアプリケーションの分離ストレージからローカルバイナリフォルダーにコピーし、コンソールに表示します。





  1. f.ReceiveFile( @ "\ Applications \ Data \" + appID + @ " \ data \ isolatedstore \ Foo.txt "、@ " \ Foo.txt "); Console.WriteLine( "\ t " + File.ReadAllText(@ " foo.txt"));
*このソースコードは、 ソースコードハイライターで強調表示されました。


この例を実行すると、IsoStoreから取得したテキストがコンソールに表示されます。







これで完了です。 WP7エミュレーター/デバイスとマネージド.netコードの間に双方向通信チャネルを確立しました。



コード



このプロジェクトで作成したコードは次のとおりです。





  1. // CoreCon WP7 SDKを取得します
  2. DatastoreManager dsmgrObj = 新しい DatastoreManager(1033);
  3. プラットフォームWP7SDK = dsmgrObj.GetPlatforms()。シングル(p => p.Name == "新しいWindows Mobile 7 SDK" );
  4. //エミュレータ/デバイスを取得します
  5. bool useEmulator = true ;
  6. デバイスWP7Device = null ;
  7. if (useEmulator)
  8. WP7Device = WP7SDK.GetDevices()。Single(d => d.Name == "Windows Phone 7 Emulator" );
  9. 他に
  10. WP7Device = WP7SDK.GetDevices()。Single(d => d.Name == "Windows Phone 7 Device" );
  11. // WP7エミュレーター/デバイスに接続します
  12. Console .WriteLine( "Windows Phone 7エミュレーター/デバイスへの接続..." );
  13. WP7Device.Connect();
  14. Console .WriteLine( "Windows Phone 7エミュレーター/接続されたデバイス..." );
  15. Guid appID = new Guid"{5e75bba1-fbf6-463c-94ac-fa4a78f8fd12}" );
  16. RemoteApplicationアプリ。
  17. if (WP7Device.IsApplicationInstalled(appID))
  18. {
  19. Console .WriteLine( "Windows Phone 7 Emulator / DeviceへのサンプルXAPのアンインストール..." );
  20. app = WP7Device.GetApplication(appID);
  21. app.Uninstall();
  22. Console .WriteLine( 「Windows Phone 7エミュレーター/デバイスからアンインストールされたサンプルXAP ...」 );
  23. }
  24. // XAPをインストールします
  25. Console .WriteLine( 「Windows Phone 7エミュレーター/デバイスへのサンプルXAPのインストール...」 );
  26. app = WP7Device.InstallApplication(
  27. appID
  28. appID
  29. 「NormalApp」
  30. @ "D:\ visual studio 2010 \ Projects \ ConsoleApplication1 \ WindowsPhoneApplication1 \ ApplicationIcon.png"
  31. @ "D:\ visual studio 2010 \ Projects \ ConsoleApplication1 \ WindowsPhoneApplication1 \ Bin \ Debug \ WindowsPhoneApplication1.xap" );
  32. Console .WriteLine( "Windows Phone 7 EmulatorにインストールされたサンプルXAP ..." );
  33. //アプリケーションを起動します
  34. Console .WriteLine( "Windows Phone 7 Emulatorでサンプルアプリを起動しています..." );
  35. app.Launch();
  36. Console .WriteLine( "Windows Phone 7 Emulatorでサンプルアプリを起動..." );
  37. Console .WriteLine( "Foo.txt分離ストレージファイルの読み取り:" );
  38. Thread.Sleep(10000);
  39. //app.GetIsolatedStore(); <-NotImplementedExceptionがスローされます
  40. オブジェクト ConManServer = WP7Device.GetType()。GetField( "mConmanServer" 、BindingFlags.NonPublic | BindingFlags.Instance).GetValue(WP7Device);
  41. FileDeployer f =(FileDeployer) typeof (FileDeployer).GetConstructors(BindingFlags.Instance | BindingFlags.NonPublic)[0] .Invoke( new object [] {ConManServer});
  42. f.ReceiveFile( @ "\ Applications \ Data \" + appID + @ " \ data \ isolatedstore \ Foo.txt "、@ " \ Foo.txt "); Console.WriteLine( "\ t " + File.ReadAllText(@ " foo.txt"));
  43. Console .ReadLine();
*このソースコードは、 ソースコードハイライターで強調表示されました。


終わり



この投稿では、WP7エミュレーター/デバイスでの展開プロセスの自動化が必要な理由と、これを実現する方法について説明しました。

WP7でのXAPの展開を自動化する方法をご理解いただけたことを願っています。

このシリーズの次回の記事では、WP7の継続的インテグレーションのセットアップについて説明します。



All Articles