この記事では、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の自動化を開始できます。
最終的には次のようになります。

次の一連のアクションを実行する必要があります。
- WP7 CoreCon SDKのインスタンスを取得します
- エミュレータ/デバイスへのリンクを取得
- エミュレーター/デバイスに接続する
- 前のバージョンを削除
- xapをインストールする
- アプリケーションを実行する
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 .
// 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 .
// 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を使用して物理デバイスに接続しようとします。
*このソースコードは、 ソースコードハイライターで強調表示されました。
- //エミュレータ/デバイスを取得します
- bool useEmulator = true ;
- デバイスWP7Device = null ;
- if (useEmulator)
- WP7Device = WP7SDK.GetDevices()。Single(d => d.Name == "Windows Phone 7 Emulator" );
- 他に
- WP7Device = WP7SDK.GetDevices()。Single(d => d.Name == "Windows Phone 7 Device" );
エミュレーター/デバイスに接続する
次に、WP7でエミュレーター/デバイスを実行します。
標準のWP7エミュレーターイメージを起動することに注意してください。 以前の記事で、ロック解除ROMをデフォルトROMとして使用する方法を説明しました。
*このソースコードは、 ソースコードハイライターで強調表示されました。
- // WP7エミュレーター/デバイスに接続します
- Console .WriteLine( "Windows Phone 7エミュレーター/デバイスへの接続..." );
- WP7Device.Connect();
- Console .WriteLine( "Windows Phone 7エミュレーター/接続されたデバイス..." );
前のバージョンを削除
次に、アプリケーションが既にインストールされていることを確認する必要があります。インストールされている場合は削除します。
UpdateApplicationメソッドは現在のCoreCon APIでは機能しないため、これはインストール済みのアプリケーションを更新する最も簡単な方法です。
アプリケーションをインストールまたはアンインストールするには 、アプリケーション製品識別子(GUID)が必要です。
Properties / WMAppManifest.xmlファイルからアプリケーションGUIDを取得できます 。

次のコードは、アプリケーションがインストールされているかどうかを確認し、インストールされている場合は削除します。
*このソースコードは、 ソースコードハイライターで強調表示されました。
- Guid appID = new Guid ( "{5e75bba1-fbf6-463c-94ac-fa4a78f8fd12}" );
- RemoteApplicationアプリ。
- if (WP7Device.IsApplicationInstalled(appID))
- {
- Console .WriteLine( "Windows Phone 7 Emulator / DeviceへのサンプルXAPのアンインストール..." );
- app = WP7Device.GetApplication(appID);
- app.Uninstall();
- Console .WriteLine( 「Windows Phone 7エミュレーター/デバイスからアンインストールされたサンプルXAP ...」 );
- }
XAPインストール
次に、XAPをインストールします。
これを行うには、次に関する情報が必要です。
- XAPの場所。
- アプリケーションGUID。
- アプリケーションアイコンの場所。
*このソースコードは、 ソースコードハイライターで強調表示されました。
- // XAPをインストールします
- Console .WriteLine( 「Windows Phone 7エミュレーター/デバイスへのサンプルXAPのインストール...」 );
- app = WP7Device.InstallApplication(
- appID
- appID
- 「NormalApp」 、
- @ "D:\ visual studio 2010 \ Projects \ ConsoleApplication1 \ WindowsPhoneApplication1 \ ApplicationIcon.png" 、
- @ "D:\ visual studio 2010 \ Projects \ ConsoleApplication1 \ WindowsPhoneApplication1 \ Bin \ Debug \ WindowsPhoneApplication1.xap" );
- Console .WriteLine( "Windows Phone 7 EmulatorにインストールされたサンプルXAP ..." );
アプリケーションの起動
最後のステップ:アプリケーションを起動します。
*このソースコードは、 ソースコードハイライターで強調表示されました。
- //アプリケーションを起動します
- Console .WriteLine( "Windows Phone 7 Emulatorでサンプルアプリを起動しています..." );
- app.Launch();
- Console .WriteLine( "Windows Phone 7 Emulatorでサンプルアプリを起動..." );
できました。 実際、サンプルを実行すると、アプリケーションは次のように機能します。

それでは、なぜWP7エミュレーターの自動化が役立つのでしょうか?
優れたユースケースは多数あります。自動ユニットテスト、エミュレーターへのナイトリービルドのロード、さらには顧客がWP7エミュレーターを使用する能力です。
実際、WP7エミュレーターの自動化が役立つ場合には多くの理由と状況があり、自分でプロジェクトでそれを使用する方法を理解できます。
たとえば、 Vertigoでは、オートメーションを使用して、お客様が所有しているマルチタッチラップトップでWP7エミュレーターを実行しています。
これにより、クライアントはVisual Studio 2010をインストールしなくても現在のビルドにアクセスできます。
分離ストレージへのアクセス
それを使用する1つの方法は、私にとって特に興味深いものです。夜間ビルド用のプロジェクトのすべてのユニットテストを自動的に起動します。

WP7エミュレーターを自動化するために、以前に実行したアクションに限定することができますが、どのようにして結果を取得しますか? または指示を得る?
私が思いつく最も簡単な方法は、コールドストレージを介して通信することでした-隔離されたストレージでファイルを読み書きします。

まず、WP7アプリケーションIsoStoreにファイルを書き込むことから始めます。
このコードはWP7エミュレーター/デバイスで実行されることに注意してください。
*このソースコードは、 ソースコードハイライターで強調表示されました。
- パブリック MainPage()
- {
- InitializeComponent();
- SupportedOrientations = SupportedPageOrientation.Portrait | SupportedPageOrientation.Landscape;
- 使用 ( var isoStore = IsolatedStorageFile.GetUserStoreForApplication())
- 使用 ( var sw = new StreamWriter(isoStore.OpenFile( "Foo.txt" 、 FileMode .OpenOrCreate、FileAccess.Write)))
- {
- sw.Write( "Hello WP7!(WP7 IsoStoreから作成、Console Harnessによって読み取られます!)" );
- }
- }
基本的に、IsoStoreにfoo.txtファイルを追加し、それにテキストを追加しました。
次に、RemoteIsolatedStorageクラスを使用してIsoStoreエミュレーターにアクセスしますが、CoreCon10にはまだ含まれていません。

RemoteApplication.GetIsolatedStorage()を使用しますが、まだ実装されていません。
代わりに、FileDeployerクラスを使用します。
アプリケーションで使用できるFileDeployerクラスのコピーの取得には、いくつかの反射的な魔法が含まれます。
*このソースコードは、 ソースコードハイライターで強調表示されました。
- Thread.Sleep(10000);
- //app.GetIsolatedStore(); <-NotImplementedExceptionがスローされます
- オブジェクト ConManServer = WP7Device.GetType()。GetField( "mConmanServer" 、BindingFlags.NonPublic | BindingFlags.Instance).GetValue(WP7Device);
- FileDeployer f =(FileDeployer) typeof (FileDeployer).GetConstructors(BindingFlags.Instance | BindingFlags.NonPublic)[0] .Invoke( new object [] {ConManServer});
次に、foo.txtファイルをアプリケーションの分離ストレージからローカルバイナリフォルダーにコピーし、コンソールに表示します。
*このソースコードは、 ソースコードハイライターで強調表示されました。
- f.ReceiveFile( @ "\ Applications \ Data \" + appID + @ " \ data \ isolatedstore \ Foo.txt "、@ " \ Foo.txt "); Console.WriteLine( "\ t " + File.ReadAllText(@ " foo.txt"));
この例を実行すると、IsoStoreから取得したテキストがコンソールに表示されます。

これで完了です。 WP7エミュレーター/デバイスとマネージド.netコードの間に双方向通信チャネルを確立しました。
コード
このプロジェクトで作成したコードは次のとおりです。
*このソースコードは、 ソースコードハイライターで強調表示されました。
- // CoreCon WP7 SDKを取得します
- DatastoreManager dsmgrObj = 新しい DatastoreManager(1033);
- プラットフォームWP7SDK = dsmgrObj.GetPlatforms()。シングル(p => p.Name == "新しいWindows Mobile 7 SDK" );
- //エミュレータ/デバイスを取得します
- bool useEmulator = true ;
- デバイスWP7Device = null ;
- if (useEmulator)
- WP7Device = WP7SDK.GetDevices()。Single(d => d.Name == "Windows Phone 7 Emulator" );
- 他に
- WP7Device = WP7SDK.GetDevices()。Single(d => d.Name == "Windows Phone 7 Device" );
- // WP7エミュレーター/デバイスに接続します
- Console .WriteLine( "Windows Phone 7エミュレーター/デバイスへの接続..." );
- WP7Device.Connect();
- Console .WriteLine( "Windows Phone 7エミュレーター/接続されたデバイス..." );
- Guid appID = new Guid ( "{5e75bba1-fbf6-463c-94ac-fa4a78f8fd12}" );
- RemoteApplicationアプリ。
- if (WP7Device.IsApplicationInstalled(appID))
- {
- Console .WriteLine( "Windows Phone 7 Emulator / DeviceへのサンプルXAPのアンインストール..." );
- app = WP7Device.GetApplication(appID);
- app.Uninstall();
- Console .WriteLine( 「Windows Phone 7エミュレーター/デバイスからアンインストールされたサンプルXAP ...」 );
- }
- // XAPをインストールします
- Console .WriteLine( 「Windows Phone 7エミュレーター/デバイスへのサンプルXAPのインストール...」 );
- app = WP7Device.InstallApplication(
- appID
- appID
- 「NormalApp」 、
- @ "D:\ visual studio 2010 \ Projects \ ConsoleApplication1 \ WindowsPhoneApplication1 \ ApplicationIcon.png" 、
- @ "D:\ visual studio 2010 \ Projects \ ConsoleApplication1 \ WindowsPhoneApplication1 \ Bin \ Debug \ WindowsPhoneApplication1.xap" );
- Console .WriteLine( "Windows Phone 7 EmulatorにインストールされたサンプルXAP ..." );
- //アプリケーションを起動します
- Console .WriteLine( "Windows Phone 7 Emulatorでサンプルアプリを起動しています..." );
- app.Launch();
- Console .WriteLine( "Windows Phone 7 Emulatorでサンプルアプリを起動..." );
- Console .WriteLine( "Foo.txt分離ストレージファイルの読み取り:" );
- Thread.Sleep(10000);
- //app.GetIsolatedStore(); <-NotImplementedExceptionがスローされます
- オブジェクト ConManServer = WP7Device.GetType()。GetField( "mConmanServer" 、BindingFlags.NonPublic | BindingFlags.Instance).GetValue(WP7Device);
- FileDeployer f =(FileDeployer) typeof (FileDeployer).GetConstructors(BindingFlags.Instance | BindingFlags.NonPublic)[0] .Invoke( new object [] {ConManServer});
- f.ReceiveFile( @ "\ Applications \ Data \" + appID + @ " \ data \ isolatedstore \ Foo.txt "、@ " \ Foo.txt "); Console.WriteLine( "\ t " + File.ReadAllText(@ " foo.txt"));
- Console .ReadLine();
終わり
この投稿では、WP7エミュレーター/デバイスでの展開プロセスの自動化が必要な理由と、これを実現する方法について説明しました。
WP7でのXAPの展開を自動化する方法をご理解いただけたことを願っています。
このシリーズの次回の記事では、WP7の継続的インテグレーションのセットアップについて説明します。