- Visual C# 2010 Express Editionでの手順 ⇒ id:n7shi:20101120
この記事の開発手法について発表を行います。(2009/10/31 14:00〜14:30) ⇒ id:n7shi:20091007- 発表は終了しました。資料を公開しています。 ⇒ id:n7shi:20091031
VB.NETではmscorlibを差し替える設定が分からないため、同じ手法は使えません。
Windows Mobileアプリケーションの開発はVisual Studio 2008 Professionalが必要とされています。しかし以下のような制限付きですが、無料版のExpress Editionで開発することも可能です。
この制限を逆手に取って、VC#Expressを利用してWindows Mobile/XP/Vistaで共通に動くアプリケーションを開発する方法をご紹介します。
アプリケーション例
この手法で作られたアプリケーションの例です。
- id:n7shi:20091006 GLES#
- id:n7shi:20090914 YOPViewer.NET
- id:n7shi:20090811 MIZU GAME
- id:n7shi:20090801 スーパーマリョーワールド(仮)
- id:n7shi:20080511 TwitterWM
- Japan
- id:m107:20081124 h01 (要3.5)
- id:m107:20081208 やよいに元気をもらおう (要3.5)
Windows Mobileで動かすためには.NET Compact Frameworkのインストールが必要です。Ad[es]やWILLCOM 03にはプレインストールされていますが、3.5を要求するものは以下をインストールする必要があります。
デバッグ
.NETアプリケーションはバイナリがCILという中間コードで、実行時にJITでネイティブコードに変換されます。そのためx86やARMといったCPUの違いに関係なく、同一のバイナリが動きます。
このことを利用すれば開発マシン(XP/Vista: 以下PC)で直接動かしてデバッグできます。もちろん細かい部分ではWindows Mobileと動作が異なります。無料で入手できるエミュレータについては後述します。
用意するもの
- Windows XPまたはVistaのマシン
- Visual C# 2008 Express Edition (ユーザー登録が不要なオフラインインストールがお勧めです)
- .NET Compact Framework 2.0 Service Pack 2 再頒布可能パッケージまたは.NET Compact Framework 3.5 再頒布可能パッケージ
プロジェクト作成手順
Express Editionでは直接Windows Mobileアプリケーションが選択できないため手動設定します。VC#を起動したときに表示されるスタートページがタブに残ったままだとデバッグ後の復帰が遅くなるため、閉じておくことを推奨します。
- 新規に「Windows フォームアプリケーション」を作成
- ファイル→すべてを保存
- ソリューションエクスプローラでプロジェクトを右クリック→プロパティ
- 対象のフレームワークでバージョンを選択。2.0推奨。3.5はサウンド機能などどうしても必要なときに選択。
- フレームワークのバージョンを変えるとプロパティが閉じるため再度プロパティを表示
- 「ビルド」タブ→詳細設定→「mscorlib.dllを参照しない」にチェック→OK
- 「参照パス」タブ→.NET Compact Frameworkのパスを追加:【2.0の場合】C:\Program Files\Microsoft.NET\SDK\CompactFramework\v2.0\WindowsCE\
- ソリューションエクスプローラで参照設定の項目をすべて削除
- ソリューションエクスプローラで参照設定を右クリック→参照の追加
- 「参照の追加」ダイアログ→「パス」をクリックしてソート→.NET Compact Frameworkのパス(先ほど追加したもの)から必要なものを追加:【例】mscorlib, System.Data, System, System.Drawing, System.Windows.Forms, System.Xml
- ソリューションエクスプローラでPropertiesからSettings.settingsを削除
- デバッグ→デバッグ開始
- ビルドエラーが発生しました。続行して、最後に成功したビルドを実行しますか?→いいえ
- エラーになっているのはCompact Frameworkでサポートされていないものなので、エラーがなくなるまで削除
これでウィンドウが表示されるだけのアプリケーションが完成です。出力されたEXEファイルをWindows Mobileにコピーすればそのまま動きます。
エミュレータ
Windows Mobile (ARM)
出力されたEXEはPC上でもそのまま動くため、大まかな動作確認はPCでも可能です。しかし細かい部分で実機と動作が異なるため(例:イメージのα値が無視される)、実機での動作確認は必須です。毎回実機で動作確認するのは大変ですが、無料でエミュレータが入手できます。
- Windows Mobile 6 Localized Emulator Images
- 0411/Windows Mobile 6 Professional Images (JPN).msi を選択してください。
エミュレータはスタートメニューから起動します。色々な解像度がありますが、よく使うのはVGAだと思います。
- Windows Mobile 6 SDK → Standalone Emulator Images → Japanese → Professional VGA
ファイルの受け渡しは共有フォルダを指定すると便利です。指定したパスがStorage Cardとしてアクセスできます。VC# Expressはエミュレータと連携できないため、アプリケーションの開発中はDebugフォルダを共有すると便利です。
- File → Configure → General → Shared folder
エミュレータイメージには.NET Compact Framework 2.0がインストール済みです。そのため.NET Compact Framework 2.0のアプリケーションはEXEをコピーするだけで動きます。ARMをエミュレートしているため、ネイティブバイナリはARMのものしか動きません。
Pocket PC (x86)
ARMのエミュレータは動作が遅いため、ARMやWindows Mobile特有の機能を使わない場合は、x86の古いPocket PCエミュレータを使った方が便利かもしれません。eVC++とPocket PC SDKをインストールすると使えます。
以下にインストールされるWindows CE Remote File ViewerからPOCKET PC 2003 Emulatorを起動すると、ファイルの転送ができるため便利です。
- C:\Program Files\Common Files\Microsoft Shared\Windows CE Tools\Platman\bin\cefilevw.exe
Windows CE Remote File Viewerとは別にフォルダを共有することもできます。転送よりも共有の方が高速です。
- エミュレータ → フォルダの共有
エミュレータ起動後に.NET Compact Frameworkのインストールが必要です。PCからCABファイルをコピーしてインストールします。
エミュレートするのはx86のため、ARMバイナリは一切動きません。
GUIデザイナ
Expressでは正式に.NET Compact Frameworkに対応していないため、GUIデザイナの出力するコードがそのままではエラーになってしまいます。たとえばテキストボックスを1つ置いただけでも次のようなエラーになります。
'Form1' に 'PerformLayout' の定義が含まれておらず、型 Form1' の最初の引数を受け付ける拡張メソッドが見つかりませんでした。using ディレクティブまたはアセンブリ参照が不足しています。
Form1.Designer.cs内に自動生成されたthis.PerformLayout();がエラーになっています。これは.NET Compact Frameworkでサポートされていないので行ごと削除します。このようにデザイナを利用する場合は手動で修正する必要があります。
レイアウト
これで実行できるようにはなりますが、Windows Mobileでは文字のサイズが異なるためデザインが崩れてしまいます。これはWindows XP/Vistaと共用する上で問題になります。Dockなどでレイアウトを調整しても、コントロールのサイズ(縦幅など)までは調整できません。
これをスマートに解決する方法はないため、以下のようなコードで調整することになります。
public partial class Form1 : Form { public Form1() { InitializeComponent(); if (Environment.OSVersion.Platform == PlatformID.WinCE) { label1.Height = textBox1.Height; } } }
この例ではTextBoxがMultiline=falseの状態でHeight固定になることを利用しています。
CAB インストーラ
SDKのCAB File Wizardを使用します。
- SDK for Windows Mobile 2003-based Pocket PCs
- C:\Program Files\Windows CE Tools\wce420\POCKET PC 2003\Tools\Cabwiz.exe
※古いPocket PCのSDKを使用しているのは、新しいWindows MobileのSDKは有償のVisual Studioを要求するためです。Visual Studioの体験版で回避したり、msiexecで抽出したりはできますが、説明は省略します。
EXEと同じフォルダに以下のようなINFファイルを作成してCabwiz.exeにドラッグ&ドロップすればCABファイルが出力されます。同時に出力されるDATファイルはインストールには不要です。
[Version] Signature="$Windows NT$" Provider="開発元名" CESignature="$Windows CE$" [CEStrings] AppName="アプリケーション名" InstallDir=%CE1%\%AppName% [Strings] Manufacturer="開発元名" [CEDevice] VersionMin=4.0 VersionMax=5.99 BuildMax=0xE0000000 [DefaultInstall] CEShortcuts=Shortcuts AddReg=RegKeys CopyFiles=Files.Common1 [SourceDisksNames] 1=,"Common1",,".\" [SourceDisksFiles] "アプリケーション名.exe"=1 [DestinationDirs] Shortcuts=0,%CE2%\Start Menu Files.Common1=0,"%InstallDir%" [Files.Common1] "アプリケーション名.exe","アプリケーション名.exe",,0 [Shortcuts] "アプリケーション名",0,"アプリケーション名.exe","%CE17%" [RegKeys]
最後に
Windows Mobile/XP/Vistaで同一のバイナリが動くと言えば聞こえが良いのですが、実際にはバッドノウハウの塊です。しかもノウハウの蓄積もほとんどないのが現状です。
GUIレイアウトの問題は厄介ですが、逆に言えばGUIを使わなければ問題は少なくなります。独自描画を多用するゲームは比較的向いているのではないでしょうか。電車の中などでのちょっとした息抜きに遊ぶようなゲームであれば、Windows Mobileの利用シーンとも相性が良さそうです。