Christopher Tacke
OpenNETCF Consulting
December 2005
日本語版最終更新日 2006 年 5 月 12 日
適用対象:
Microsoft .NET Compact Framework 2.0
Windows Mobile 5.0
Microsoft Windows CE
Microsoft ActiveSync
Microsoft Visual Studio 2005
要約: アプリケーションを Windows Mobile ベースのデバイスに配置する方法について説明します。Visual Studio 2005 を使用して、デバイス用の .cab ファイルを作成し、デスクトップ コンピュータ用の Microsoft Installer パッケージを作成します。
Microsoft ダウンロード センターから Deploy_CF2_Apps_Cab_Msi.msi をダウンロードしてください。
目次
はじめに
デバイスへの配置の概要
Visual Studio を使用したデバイス用 .cab ファイルの作成
デスクトップ コンピュータ用 Microsoft Installer パッケージの作成
まとめ
はじめに
あなたが、今後ベストセラーになりそうな埋め込みアプリケーションを開発したとします。次に行うべき手順は、ユーザーやデバイスにアプリケーションを届けることです。デスクトップのコンピュータ アプリケーションなら話は簡単です。MSI(Microsoft Installer)パッケージを生成する、配置パッケージ用のプロジェクトを作成し、.msi パッケージを配置するだけです。しかし、デバイスの場合はそれほど簡単ではありません。この記事では、アプリケーションをインストールするのに Windows Mobile ベースのデバイスでは何が必要か、配置をより簡単に行うのに Microsoft ActiveSync をどのように使用すればよいか、プロセス全体をシームレスに行うのに Microsoft Visual Studio 2005 をどのように使用すればよいか、について説明します。
アプリケーションのデバイスへの配置は、簡単なデスクトップ コンピュータ アプリケーションの配置よりも多くの変動要素がありますが、ユーザーが行うプロセスは、デスクトップ コンピュータ アプリケーションの場合と同じように簡単である必要があります。デバイスへの配置をデスクトップ コンピュータへの配置と同様に簡単に行うには、プロセス全体および関与するすべての変動要素を理解することが重要です。プロセスと変動要素を理解したら、もとになるシステムが複雑かどうかに関らず、どんな配置でも作成できます。
デバイスへの配置に不可欠な 3 つの主要なシステムがあります。1 つ目は、デスクトップ コンピュータです。2 つ目は、Microsoft ActiveSync です。3 つ目は、wceload.exe と呼ばれる、デバイス用 .cab ファイル展開アプリケーションです。これらのシステムに、さまざまなプロセッサや、マネージ コードとアンマネージ コードが混在している可能性を加えると、配置の全体像を把握することができます。この記事では、その全体像の把握を助けるために、まずデバイスから説明します。
デバイスへの配置の概要
ユーザーにとって、デバイスへの配置は、デスクトップ コンピュータ アプリケーションの配置と同じです。ユーザーは、.msi ファイルをダウンロードするか受け取り、デスクトップ コンピュータ上で実行します。Microsoft Installer で表示されるいくつかのウィザード画面に従うと、アプリケーションがインストールされます。
ただし、開発者から見ると、.msi ファイルは、配置パッケージを作成するときに行う多くの手順の中で最後に行うものでしかありません。Windows Mobile ベースのデバイスは、.msi ファイルを直接使用できません。代わりに、プログラムのインストールを行う .cab ファイルが必要です。.msi ファイルがユーザーの環境で使用できるように、開発者は、ActiveSync Application Manager に、.cab ファイルをデバイスにコピーするようプログラム内部から命令します。このとき、複数のデバイスに配置したり、ファイルを後で削除できるようにするオプションもあります。
ユーザーが望む、わかりやすいインストール作業を実現するには、次の手順に従う必要があります。
- ターゲット デバイス向けの .cab ファイルを作成します。
- アプリケーション ファイルとレジストリ エントリを .cab ファイルに追加します。
- ActiveSync を使用して .cab ファイルを登録します。これで、ファイルをデスクトップ コンピュータから配置できます。
- インストールまたはアンインストール中にインストーラ ファイルが行う必要があるカスタム動作用のコードを提供します。
- この情報のすべてと、アプリケーションに必要なすべてを、1 つの配置可能な .msi ファイルにパッケージ化します。
この記事では、OpenNETCF WiFiDiscovery アプリケーションを配置する実際の例を使用して、各手順を説明します。
Visual Studio を使用したデバイス用 .cab ファイルの作成
配置パッケージを作成する場合は、ターゲット デバイスに実際にインストールされる .cab ファイルを生成する必要があります。デバイス開発の経験がある場合、または多くのサードパーティのアプリケーションをデバイスにインストールしたことがある場合は、.cab ファイルに詳しいことでしょう。本来、.cab ファイルは、アプリケーションのファイル、必要なレジストリ エントリ、およびデバイス上のインストーラ用のいくつかの文字列リソースを格納している圧縮ファイルです。.cab ファイルは、wceload.exe によって展開され、逐次解釈実行されます。このツールは、すべての Pocket PC と Windows Mobile ベースの Smartphone デバイス、および多くの汎用 Windows CE デバイス上に存在します。
Windows CE ベースのデバイスでは、オペレーション システムのバージョンやプロセッサのアーキテクチャが異なる可能性があるので、アプリケーション インストール パッケージに複数の .cab ファイルが含まれている場合があります。デバイスがサポートするプロセッサとオペレーティング システム バージョンの組み合わせごとに 1 つずつの .cab ファイルを含む場合です。たとえば、Microsoft .NET Compact Framework バージョン 2.0 自体には、7 つの .cab ファイルがあります。
この時点で、「でも、マネージ アプリケーションは、プロセッサから独立している MSIL(Microsoft Intermediate Language)を使用しています。なぜ 1 つの .cab ファイルだけを使用できないのでしょうか?」 という疑問が思い浮かぶかもしれません。これはよい質問です。Microsoft Visual Studio .NET 2003 は、複数の .cab ファイルを生成するように選択されると、常に複数の .cab ファイルを作成します。その理由は、インストーラ .cab ファイルに setup.dll と呼ばれるファイルが格納されていることがあるためです。この .dll ファイルには、アプリケーションがインストールまたはアンインストールされるときにインストーラが実行する特別な命令が含まれており、アンマネージ コードで作成する必要があります。このため、プロセッサの種類とオペレーティング システムのバージョンごとに異なるインストールが必要です。
アプリケーションに特別なニーズがない場合は、setup.dll ファイルは必要ありません。1 つの .cab ファイルだけで動作します。この記事の例も、1 つの .cab ファイルで動作します。
アプリケーションのソリューションに、Smart Device Cab Project を追加する必要があります。この例の場合は、図 1 に示すように、プロジェクトに DeploymentCAB という名前が付けられています。

図 1. 新しい Smart Device Cab Project をアプリケーションのソリューションに追加
次に、Cab プロジェクトにファイルを追加する必要があります。次の 2 つの方法で、ファイルを追加できます。配置する個々のファイルを選択するか、ソリューション中で別のプロジェクトを選択してその出力が .cab ファイルに追加されるようにします。配置するファイルを明示的に選択することはどんなファイルに対しても可能ですが、プロジェクトの出力を追加できると便利です。これは、プロジェクトの変更を適用して Cab プロジェクト コンテンツを最新の状態にしておくことが簡単になり、検出されたすべての参照が自動的に追加されるためです。ソリューション エクスプローラで、DeploymentCAB プロジェクトを右クリックし、[追加]を選択し、[プロジェクト出力]をクリックします。図 2 のダイアログ ボックスが表示されます。

図 2. アプリケーション プロジェクトの出力を Cab プロジェクトに追加
図 3 に示すように、この例では、アプリケーション プロジェクトは、OpenNETCF Smart Device Framework ライブラリを参照しています。このライブラリは自動的に取り込まれます。

図 3. ソリューション エクスプローラに表示されたプロジェクト出力と依存関係
ソリューションを検索するときのわかりやすさのために、このプロジェクトにDeploymentCAB という名前を付けました。ただし、Visual Studio 2005 は、生成される .cab ファイルの既定の名称としてプロジェクト名を使用します。DeploymentCAB.cab という .cab ファイルの配置はわかりにくいので、図 4 に示すように、プロジェクトのプロパティを変更することにより、実際の出力ファイル名を変えられます。

図 4. 生成される .cab ファイル名の変更
この変更は、出力ファイル名にのみ影響します。変更するには、ソリューション エクスプローラ内でプロジェクトを選択し、[プロジェクト]メニューの[プロパティ]をクリックして行います。Visual Studio の[プロパティ]ペイン内で出力ファイル名を変更できないことは、少し分かりづらいかもしれません。[プロパティ]ペイン内の設定は、ActiveSync インストーラの UI(ユーザー インターフェイス)が[Product Name]や[Company]などの情報を提供する方法に影響します。
.cab ファイルは、Smart Device Cab Project でも、実際はデスクトップ上の cabwiz.exe と呼ばれるアプリケーションによって生成されます。Visual Studio は、実際のファイルを生成するために、cabwiz.exe を呼び出すだけです。.cab ファイルに格納されるファイルとレジストリの変更に関する情報は、表示するテキストと共に .inf ファイルに含まれています。このファイルは、Visual Studio が Cab プロジェクトの設定に基づいて生成します。
.inf ファイルの正確な形式に関するオンライン ドキュメントは、多数あるので、その詳細についてここでは説明しません。ただし、[プロパティ]ペイン(図 5)への変更は .inf ファイル内に反映されるということを認識することが重要です。たとえば、[プロパティ]ペインの[Product Name]エントリを変更すると、出力 .inf ファイルの 1 行が書き変えられます。この記事の少し後で、どのように情報が生成されるかを説明します。

図 5. プロパティの変更によるインストール テキストの設定
この記事で前述したように、レジストリ エントリも .cab ファイルに追加できます。ソリューション エクスプローラで[レジストリ エディタ]アイコンをクリックして、エディタ UI を開いて変更を加えるだけです。図 6 は、レジストリに WiFiDiscovery アプリケーションのバージョン番号を追加する例です。Smart Device Cab Project に追加するエントリは、インストールを行うデスクトップ コンピュータではなく、ターゲット デバイスに適用されることを忘れないでください。デスクトップ コンピュータにレジストリ エントリが必要な場合は、他のプロジェクトで行います。

図 6. デバイス用レジストリ エントリの追加
すべてのファイルとレジストリ エントリをプロジェクトに追加し、[プロパティ]ペインを調整して ActiveSync とデバイスの .cab ファイル インストーラが表示する情報を反映すると、プロジェクトがビルドできます。図 7 のような出力(.cab ファイル、ビルド失敗時に役立つ .log ファイル、および .inf ファイル)が生成されます。

図 7. Cab プロジェクトの出力ファイル
テスト中にデバイス側のインストール プロセスが期待どおりの動作をしない場合(ダイアログ キャプションが正しくない、ファイルが足りない、デバイスのレジストリ設定が正しくない、デバイスのレジストリ設定が足りない場合など)、このような挙動のデバッグは .inf ファイルを確認することから始めます。Visual Studio 2005 は、.cab ファイルの生成に使用するわかりやすい UI を提供しますが、cabwiz.exe は、実際は .inf ファイルを使用して .cab ファイルを生成します。また、すべての .cab ファイルの動作は .inf ファイルに反映されています。
.cab ファイルの生成を確認したら、配置パッケージのこの部分が完了したことになります。次に、この記事では、デスクトップ コンピュータ用の部分を説明します。
デスクトップ コンピュータ用 Microsoft Installer パッケージの作成
ダウンロード用の .cab ファイルを提供することはアプリケーションを配置するための方法の 1 つですが、ほとんどのユーザーはその処理方法を知らないので、ユーザーよりサポートに連絡してもらう(最もよいシナリオ)か、顧客を失います(最も悪いシナリオ)。デスクトップ コンピュータ用のインストーラ パッケージは、ユーザーに、インストールがわかりやすく、プロフェッショナルだと感じさせる「マジック」をかけることができます。
デバイス アプリケーションの場合、インストーラは、次の 2 つのことを行う必要があります。インストール用の通常のウィザード画面をユーザーに提供することと、ユーザーに特別な追加手順を実行させずに接続されたデバイスにアプリケーションを配置することです。このセクションでは、この両方を説明します。
ActiveSync を使用した登録
ActiveSync は、CeAppMgr.exe というアプリケーションを使用して、接続された Windows Mobile ベースのデバイスへのアプリケーションのインストールを処理します。CeAppMgr.exe は、ActiveSync アプリケーションの一部としてデスクトップ コンピュータにインストールされています。CeAppMgr.exe には、登録されるアプリケーションを配置するための .ini ファイルが必要で、この .ini ファイルは手動で生成される必要があります。しかし、そのファイルの形式は複雑ではありません。
メモ .ini ファイルを生成およびテストする際に、CeAppMgr.exe からのデバッグ出力をオンにすれば大変役に立ちます。CeAppMgr.exe は、.ini ファイルの構文解析結果を報告する簡単な MessageBox を表示します。
デバッグをオンにするには、デスクトップ コンピュータに次のレジストリ キーを設定します。
[HKLM\Software\Microsoft\Windows CE Services\AppMgr]
"ReportErrors"=dword:1
次のコード例は、WiFiDiscovery の登録に使用する .ini ファイルです。参考に、行番号を追加していることに注意してください。.ini ファイルに記述する必要はありません。
01 [CEAppManager]
02 Version = 1.0
03 Component = OpenNETCF WiFiDiscovery
04
05 [OpenNETCF WiFiDiscovery]
06 Description = Sample WiFi Network Discovery Application using the
SDF
07 CabFiles = WiFiDiscovery.cab
1 行目は、これが CeAppMgr.exe 用の .ini ファイルであることを示します。この行は必須です。
2 行目は、このファイルがサポートする CeAppMgr.exe のバージョンを示します。これは、アプリケーションのバージョンではありません。
3 行目は、コンポーネント名を示します。このコード行で使用されている名前は、このファイルの後のほうで角かっこで囲んで記載されている必要があります。(この例では、5 行目)
5 行目は、コンポーネントを記述するセクションの開始行です。
6 行目は、ActiveSync インストーラの UI 画面上にプログラムの説明として表示されるテキストです。(後で、配置パッケージをテストするとき、図 17 で示されます)
7 行目は、このインストールに使用される .cab ファイルのすべてを、コンマ区切りのリストで列挙します。このリスト内でスペースを使用してはいけません。
前述したように、.cab ファイルには、サポートするプロセッサとオペレーティング システムのバージョンが内部に保持されているので、ここで必要なことは、すべての .cab ファイルをリスト化するだけです。ActiveSync は、どの cab ファイルを使用すべきか認識します。また、これらのファイルは、サブディレクトリ内に配置できます。サブディレクトリを使用する場合、.cab ファイル名には、ActiveSync インストール フォルダからの相対パスを使用します(後でより詳しくこのトピックについて説明します)。
インストール中のカスタム動作
ここでも、インストールをわかりやすくプロフェッショナルなものにするには、いくつかの基本的なガイドラインと標準規格に従う必要があります。CeAppMgr.exe を使用して登録されるインストール用のアプリケーションは、通常 ActiveSync インストール フォルダのサブフォルダにあります。(実際は、Designed for Windows Mobile logo certification)
ユーザーは、ActiveSync を別の場所にインストールできます。また、ActiveSync が検索できない場所にアプリケーション ファイルをインストールするオプションをユーザーに使用させないよう、パスの場所を決定し、必要なファイルを適切な場所に自動的に配置するインストール プログラムが必要です。これには、Microsoft Installer の機能が使用できます。この機能は、インストール プロセスの特定の時点で自動的に実行させるカスタム動作をエクスポートするクラス ライブラリを提供することを可能にします。実際、このメカニズムを使用して、.ini ファイルにより CEAppMgr.exe を起動します。
図 8 に示すように、新しい Windows クラス ライブラリ プロジェクトをアプリケーション ソリューションに追加するだけです。この例では、InstallerDLL という名前です。

図 8. 新しい Windows クラス ライブラリ プロジェクトの追加
ウィザードが初期状態として生成するクラス1 は、使わないので削除します。代わりに、カスタム インストーラ クラスを使用します。このクラスは、特別なタイプです。複雑なインストール プロセスが必要な場合は、汎用クラスを追加して使用することももちろん可能です。この例では、複雑なことをする必要はありません。
図 9 に示すように、新しいカスタム インストーラ クラスを InstallerDLL プロジェクトに追加するには、ソリューション エクスプローラで、InstallerDll プロジェクトを右クリックし、[追加]をポイントし、[New Item]をクリックします。

図 9. インストーラ クラスのプロジェクトへの追加
インストーラ クラスは、インストールとアンインストールに関連するいくつかのイベントをサポートします。この例では、BeforeInstall を使用してファイルを ActiveSync フォルダにコピーし、CEAppMgr.exe を使用して登録します。また、AfterInstall を使用してインストール パスからファイルを削除します(不必要な重複ファイルを維持する必要はありません)。自動アンインストーラは他の場所にコピーしたファイルを関知しないので、BeforeUninstall を使用して ActiveSync フォルダからファイルを削除します。
クラス コンストラクタ内で処理したいイベントがあれば、それぞれについて登録します。コードの例を示します。
public CustomInstaller()
{
InitializeComponent();
this.BeforeInstall +=
new InstallEventHandler(CustomInstaller_BeforeInstall);
this.AfterInstall +=
new InstallEventHandler(CustomInstaller_AfterInstall);
this.BeforeUninstall +=
new InstallEventHandler(CustomInstaller_BeforeUninstall);
}
コード全体で使用する定数をいくつか定義する必要があります。コードの例を示します。
private const string CEAPPMGR_PATH =
@"SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\CEAPPMGR.EXE";
private const string ACTIVESYNC_INSTALL_PATH =
@"SOFTWARE\Microsoft\Windows CE Services";
private const string INSTALLED_DIR = "InstalledDir";
private const string CEAPPMGR_EXE_FILE = @"CEAPPMGR.EXE";
private const string CEAPPMGR_INI_FILE = @"WiFiDiscovery.ini";
private const string APP_SUBDIR = @"\OpenNETCF WiFiDiscovery";
private string TEMP_PATH =
Environment.SystemDirectory + @"\TEMP\WiFiDiscovery";
アプリケーションをインストールおよびアンインストールできるように、ActiveSync がインストールされている場所を認識する必要があるので、レジストリからこの情報を抽出するヘルパー メソッドが必要です。コードの例を示します。
private string GetAppInstallDirectory()
{
// ActiveSync がインストールされているディレクトリを取得します
RegistryKey keyActiveSync =
Registry.LocalMachine.OpenSubKey(ACTIVESYNC_INSTALL_PATH);
if (keyActiveSync == null)
{
throw new Exception("ActiveSync is not installed.");
}
// ActiveSync フォルダの下のターゲット ディレクトリのパスを作成します
string activeSyncPath =
(string)keyActiveSync.GetValue(INSTALLED_DIR);
string installPath = activeSyncPath + APP_SUBDIR;
keyActiveSync.Close();
return installPath;
}
次に、イベント ハンドラを見てみましょう。アプリケーションをインストールする前に、インストール フォルダが ActiveSync フォルダ内になるよう、パスを決定する必要があります。このパスを決定するには、前のコード例のように、GetAppInstallDirectory メソッドを呼び出します。これで、アプリケーション ファイルのすべてをディレクトリにコピーできます。
アプリケーション ファイルをコピーしたら、CeAppMgr.exe がインストールされた場所を判別する必要があります。この情報もレジストリから取得できます。そして、.ini ファイルの絶対パスをパラメータとして CeAppMgr.exe を呼び出します。この手順により、アプリケーションを登録し、ActiveSync インストール ウィザードを開始します。コードの例を示します。
void CustomInstaller_BeforeInstall(object sender, InstallEventArgs e)
{
// アプリケーションがインストールされる場所を検索します
string installPath = GetAppInstallDirectory();
// ターゲット ディレクトリを作成します
Directory.CreateDirectory(installPath);
// アプリケーション ファイルをそのディレクトリにコピーします
foreach (string installFile in Directory.GetFiles(TEMP_PATH))
{
File.Copy(installFile, Path.Combine(installPath,
Path.GetFileName(installFile)), true);
}
// CeAppMgr.exe のパスを取得します
RegistryKey keyAppMgr =
Registry.LocalMachine.OpenSubKey(CEAPPMGR_PATH);
string appMgrPath = (string)keyAppMgr.GetValue(null);
keyAppMgr.Close();
// CeAppMgr.exe を実行して、ファイルをデバイスにインストールします
System.Diagnostics.Process.Start(appMgrPath,
"\"" + Path.Combine(installPath, CEAPPMGR_INI_FILE) + "\"");
}
アプリケーションを ActiveSync フォルダにインストールしたら、ファイルを最初にインストールした一時フォルダから削除します。コードの例を示します。
void CustomInstaller_AfterInstall(object sender, InstallEventArgs e)
{
// 一時ファイルを削除します
foreach (string tempFile in Directory.GetFiles(TEMP_PATH))
{
File.Delete(tempFile);
}
}
これで、カスタム インストール手順が完了しますが、インストール プロセス中にファイルを移動したため、Microsoft Installer には場所がわかりません。したがって、手動でファイルを削除する必要があります。このため、アンインストール用のカスタム動作が必要です。ここでも、ファイルをコピーしたディレクトリを判定し、反復コードで各ファイルを削除します。コードの例を示します。
void CustomInstaller_BeforeUninstall(object sender, InstallEventArgs e)
{
// アプリケーションがインストールされている場所を検索します
string installPath = GetAppInstallDirectory();
// ファイルを削除します
foreach (string appFile in Directory.GetFiles(installPath))
{
File.Delete(appFile);
}
// フォルダを削除します
Directory.Delete(installPath);
}
すべてのイベント ハンドラを作成したら InstallerDLL プロジェクトをコンパイルし、最後の手順で使用するクラス ライブラリを生成するだけです。
MSI の作成
これが最後の手順です。実際の .msi ファイルを作成します。このセクションでは、デバイス固有の情報に的を絞り、読者への練習問題として、ウィザード UI の変更などのトピックには触れません。
メモ Visual Studio を使用して Microsoft Installer パッケージを作成する方法の詳細については、Visual Studio Installer Reference を参照してください。
まず、図 10 に示すように、新しいセットアップ プロジェクトを既存のソリューションに追加します。この例では、セットアップ プロジェクトに DeploymentMSI という名前を付けます。

図 10. セットアップ プロジェクトのソリューションへの追加
ここでも、[プロパティ]ペインの[Application Name]、[Company]、[SupportUrl]などを更新するのが良いでしょう。これらの項目は、インストール ウィザードの進行中にデスクトップ コンピュータに表示されます。
Visual Studio は、既定の出力ファイル名をプロジェクト名に設定します。この名前は、ユーザーにとってわかりにくいので、[プロジェクト]メニューをクリックし、[プロパティ]コマンドを選択して、図 11 のようなダイアログ ボックスを開きます。このダイアログ ボックスで、出力ファイル名を指定します。

図 11. 出力ファイル名のプロパティの設定
次に、インストール ファイルを配置するデスクトップ コンピュータ上の場所を選択する必要があります。前述のとおり、ファイルは最終的に ActiveSync のサブフォルダに配置する必要がありますが、インストーラが実行されるまで、その場所はわかりません(カスタム動作を通してのみ、その場所がわかります)。したがって、単純に Windows のシステム フォルダ内に WiFiDiscovery と呼ばれる一時フォルダを作成し、そこにファイルを配置します。図 12 に示すように、インストーラ プロジェクトのファイル システム エクスプローラを使用して、新しいフォルダを生成します。

図 12. システム フォルダのプロジェクトへの追加
フォルダを作成したら、そこに入れるファイルを追加できます。ここでも、処理を簡略化するために、明示的にファイルを指定する代わりに、ソリューション内の別のプロジェクトの出力を追加できます。図 13 のダイアログ ボックスでは、InstallerCAB プロジェクトの出力を追加しています。

図 13. cab プロジェクト出力のインストーラへの追加
次に、InstallerDLL プロジェクトで作成したカスタム動作を使用するように .msi ファイルをセットアップする必要があります。カスタム動作エディタを開くために、ショートカット メニューを使用するか(DeploymentMSI プロジェクトを右クリックし、[カスタム動作]をクリック)、ソリューション エクスプローラの上部にある[カスタム動作エディタ]アイコンをクリックし、[カスタム動作の追加]を選択します。
新しく作成した一時フォルダを選択し、図 14 に示した[プロジェクト出力グループの追加]ダイアログ ボックスを使用して、InstallerDLL プロジェクトの出力を追加します。

図 14. カスタム インストーラ DLL のインストーラへの追加
カスタム動作 DLL を追加することで、カスタム コードをデスクトップ コンピュータの .msi ファイルの展開ツールに結び付けます。.msi ファイルの展開ツールは、ユーザーによって実行されるときにカスタム DLL を呼び出し、指示された動作を実行します。これにより、ほとんど無制限の柔軟性が提供され、アプリケーションの完璧なインストールに必要な操作を実行することが可能になります。
出力を追加したら、図 15 に示すダイアログ ボックスに表示されることを確認して、カスタム インストーラがプロジェクトに追加されたことを検証します。

図 15. カスタム インストーラが追加されたことの確認
図 16 に示すように、カスタム動作エクスプローラは、すべての動作について、使用される InstallerDLL の出力を表示します。

図 16. インストーラに適用されるカスタム動作
最後に、CeAppMgr.exe が使用する .ini ファイルを明示的に追加する必要があります。これで、プロジェクトが完成し、図 17 に示すように、プログラムの Microsoft Installer パッケージを作成するのに使用できます。

図 17. インストーラに追加されたすべてのファイル
ソリューションの他のプロジェクトをすべてビルドしたことを確認してから、DeploymentMSI プロジェクトをビルドして、出力 .msi ファイルを作成します。
最後に、インストーラを詳細にテストできます。Windows Mobile ベースのデバイスが ActiveSync によって接続されているか、Visual Studio 2005 のデバイス エミュレータの 1 つがクレードルとして選択されていることを確認します。[ソリューション エクスプローラ]で、DeploymentMSI プロジェクトを右クリックし、ショートカット メニューの[インストール]を選択します。(選択肢として[アンインストール]も表示されます。これは、パッケージのアンインストール プロセスのテストに役立ちます。)すべてがうまくいくと、インストーラ ウィザードが開きます。ウィザードの指示に従うと、図 18 に示すように、CeAppMgr.exe がインストール ダイアログ ボックスを開きます。

図 18. ActiveSync Application Manager
デバイスに表示されるダイアログ ボックスの指示に従うと、WiFiDiscovery アプリケーションがモバイル デバイスにインストールされます。
まとめ
モバイル デバイス アプリケーションの配置は、依然として、ポイントしてクリックするだけの簡単なプロセスではありません(特に、アプリケーション用のロゴ証明書を取得し、アプリケーションのインストールをユーザにとって簡単なものにする場合)。この記事では、標準的なインストールに必要な基本の手順について説明しましたが、すべての可能性と不測の事態については説明していません。しかし、アプリケーションの配置に関するニーズの複雑さによって、インストールに必要なすべてか、修正して使用できる堅固な基礎かのどちらかを提供しています。今後開発するアプリケーションのために配置パッケージを作成する必要がある場合に、少なくとも、公開を成功に導く手順がわかるはずです。