【お知らせ】プログラミング記事の投稿はQiitaに移行しました。

VC#ExpressでWindows Mobile開発

  • Visual C# 2010 Express Editionでの手順 ⇒ id:n7shi:20101120
  • この記事の開発手法について発表を行います。(2009/10/31 14:00〜14:30) ⇒ id:n7shi:20091007
  • 発表は終了しました。資料を公開しています。 ⇒ id:n7shi:20091031
  • VB.NETではmscorlibを差し替える設定が分からないため、同じ手法は使えません。
    • 【追記】id:n7shi:20101120のコメントでVB.NET 2008での設定方法を教えていただきました。

Windows Mobileアプリケーションの開発はVisual Studio 2008 Professionalが必要とされています。しかし以下のような制限付きですが、無料版のExpress Editionで開発することも可能です。

  1. エミュレータデバッグできない
  2. GUIデザイナの生成するコードに修正が必要

この制限を逆手に取って、VC#Expressを利用してWindows Mobile/XP/Vistaで共通に動くアプリケーションを開発する方法をご紹介します。

アプリケーション例

この手法で作られたアプリケーションの例です。

Windows Mobileで動かすためには.NET Compact Frameworkのインストールが必要です。Ad[es]WILLCOM 03にはプレインストールされていますが、3.5を要求するものは以下をインストールする必要があります。

デバッグ

.NETアプリケーションはバイナリがCILという中間コードで、実行時にJITでネイティブコードに変換されます。そのためx86やARMといったCPUの違いに関係なく、同一のバイナリが動きます。

このことを利用すれば開発マシン(XP/Vista: 以下PC)で直接動かしてデバッグできます。もちろん細かい部分ではWindows Mobileと動作が異なります。無料で入手できるエミュレータについては後述します。

用意するもの

プロジェクト作成手順

Express Editionでは直接Windows Mobileアプリケーションが選択できないため手動設定します。VC#を起動したときに表示されるスタートページがタブに残ったままだとデバッグ後の復帰が遅くなるため、閉じておくことを推奨します。

  1. 新規に「Windows フォームアプリケーション」を作成
  2. ファイル→すべてを保存
  3. ソリューションエクスプローラでプロジェクトを右クリック→プロパティ
  4. 対象のフレームワークでバージョンを選択。2.0推奨。3.5はサウンド機能などどうしても必要なときに選択。
  5. フレームワークのバージョンを変えるとプロパティが閉じるため再度プロパティを表示
  6. 「ビルド」タブ→詳細設定→「mscorlib.dllを参照しない」にチェック→OK
  7. 「参照パス」タブ→.NET Compact Frameworkのパスを追加:【2.0の場合】C:\Program Files\Microsoft.NET\SDK\CompactFramework\v2.0\WindowsCE\
  8. ソリューションエクスプローラで参照設定の項目をすべて削除
  9. ソリューションエクスプローラで参照設定を右クリック→参照の追加
  10. 「参照の追加」ダイアログ→「パス」をクリックしてソート→.NET Compact Frameworkのパス(先ほど追加したもの)から必要なものを追加:【例】mscorlib, System.Data, System, System.Drawing, System.Windows.Forms, System.Xml
  11. ソリューションエクスプローラでPropertiesからSettings.settingsを削除
  12. デバッグデバッグ開始
  13. ビルドエラーが発生しました。続行して、最後に成功したビルドを実行しますか?→いいえ
  14. エラーになっているのはCompact Frameworkでサポートされていないものなので、エラーがなくなるまで削除

これでウィンドウが表示されるだけのアプリケーションが完成です。出力されたEXEファイルをWindows Mobileにコピーすればそのまま動きます。

エミュレータ

Windows Mobile (ARM)

出力されたEXEはPC上でもそのまま動くため、大まかな動作確認はPCでも可能です。しかし細かい部分で実機と動作が異なるため(例:イメージのα値が無視される)、実機での動作確認は必須です。毎回実機で動作確認するのは大変ですが、無料でエミュレータが入手できます。

エミュレータはスタートメニューから起動します。色々な解像度がありますが、よく使うのは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を起動すると、ファイルの転送ができるため便利です。

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を使用します。

※古いPocket PCのSDKを使用しているのは、新しいWindows MobileSDKは有償の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の利用シーンとも相性が良さそうです。