.NET Compact Framework に関するよくある質問

Microsoft .NET Compact Framework に関してよくある質問への回答を示します。この FAQ への項目の追加を希望する場合は、netcffaq@microsoft.com に電子メール (英語) を送信してください。

1. 開発

1.1. Microsoft .NET Compact Framework とは何ですか。
1.2. .NET Compact Framework アプリケーションを開発するにはどのようなツールが必要ですか。
1.3. 最新のツールとソフトウェアはどこでダウンロードできますか。
1.4. .NET Compact Framework によってサポートされているのは、どのようなデバイスですか。
1.5. 将来的にどのようなデバイスが .NET Compact Framework によってサポートされますか。
1.6. デバッガがエミュレータとの接続の確立に失敗するのはなぜですか (アプリケーションの起動エラー)。
1.7. .NET Framework と .NET Compact Framework の相違点は何ですか。
1.8. .NET Compact Framework SP1 の新機能は何ですか。
1.9. Microsoft .NET Compact Framework 開発における Pocket PC と Windows CE .NET の相違点は何ですか。
1.10. .NET Compact Framework ベースのアプリケーションの作成方法の詳細について、どこで参照できますか。
1.11. .NET Compact Framework のドキュメントはどこにありますか。
1.12. デバッガを実行するたびに、依存するファイルがコピーされないように指定する方法を教えてください。
1.13. エミュレータのプロパティを設定する方法を教えてください。
1.14. Microsoft .NET Compact Framework アプリケーションをデバッグする方法を教えてください。
1.15. Visual Basic .NET を使用してデバイス用アプリケーションの開発を開始する方法を教えてください。
1.16. .NET Compact Framework Assemblies をグローバル アセンブリ キャッシュ (GAC) にインストールする方法を教えてください。
1.17. Visual Studio .NET 2003 からスマート デバイス アプリケーションを配置するときに発生する "共有違反" に対処する方法を教えてください。
1.18. 共通言語ランタイム (CLR) とは何ですか。
1.19. グローバル アセンブリ キャッシュ (GAC) とは何ですか。
1.20. .NET Compact Framework ではどのようにメモリが管理されますか。
1.21. ネットワーク プロトコル数が 50 を超えるとデバイスに配置できなくなるのはなぜですか。
1.22. 複数のプラットフォームにまたがるバイナリが存在するのはなぜですか。
1.23. すべての ARM バイナリについて説明してください。
1.24. デバイスでレジストリを書き込む方法を教えてください。
1.25. .CAB ファイルをインストール後に削除されないようにする方法を教えてください。
1.26. デバイスにインストールされた .NET Compact Framework のバージョンを確認する方法を教えてください。
1.27. ファイルをエミュレータにコピーする方法を教えてください。

2. グラフィックス

2.1. グラフィックス オブジェクトの作成方法を教えてください。
2.2. GDI+ レンダリングを最適化する方法を教えてください。
2.3. フォーム上にイメージを描画する方法を教えてください。
2.4. 透過的なイメージを描画する方法を教えてください。
2.5. TextBox で CreateGraphics を呼び出すと失敗するのはなぜですか。
2.6. テキストのスクリーン サイズを決定する方法を教えてください。
2.7. ペンの幅を設定できますか。

3. 配置

3.1. PocketPC セットアップ アプリケーションの作成方法を教えてください。
3.2. アプリケーションのインストールに含めることができる再配布可能パッケージはどれですか。
3.3. デスクトップでは .NET Framework を必要としないインストール プログラムの作成方法を教えてください。
3.4. Pocket PC プラットフォームに依存しない CAB ファイルを作成する方法を教えてください。
3.5. 各プロセッサの種類に対応する 3 種類の CAB ファイルがあるのはなぜですか。
3.6. ターゲット デバイス上に .NET Compact Framework が存在するかどうか検出し、必要に応じて .NET Compact Framework をインストールするデスクトップ インストーラを作成する方法を教えてください。
3.7. .NET Compact Framework Service Pack をエミュレータに配置する方法を教えてください。

4. グラフィカル ユーザー インターフェイス (GUI) : フォーム

4.1. 全画面表示フォームの作成方法を教えてください。
4.2. 読み込み関数に対してフォーム コンストラクタを使用する必要があるのは、どのような場合ですか。
4.3. スマート最小化ボタンを閉じるボタンに置き換える方法を教えてください。
4.4. Microsoft .NET Compact Framework に対応する複数フォーム アプリケーション フレームワークの作成方法を教えてください。
4.5. Microsoft .NET Compact Framework ベースのアプリケーションのフォーム読み込みパフォーマンスを向上させる方法を教えてください。
4.6. フォームのスタイルを実行時に変更する方法を教えてください。
4.7. フォームのコンテンツをスクロールする方法を教えてください。
4.8. フローティング フォームの作成方法を教えてください。フォームが常に全画面表示のようになります。
4.9. フォームを強制的に最小化された状態にしておく方法を教えてください。
4.10. 多数のコントロールが付いているスマート デバイス フォームがあります。実行時に "NotSupportedException" が発生するのはなぜですか。
4.11. フォームを閉じる適切なメソッドは Application.Exit と Form.Close のどちらですか。
4.12. Windows Mobile 2003 for Smartphone で [中止]、[再試行]、および [Fail] のボタンのセット、または [はい]、[いいえ]、[キャンセル] ボタンのセット、または既定のボタンとして 3 番目のボタンが付いた MessageBox を表示すると、結果として NotSupportedException が発生します。これはなぜですか。
4.13. Pocket PC の [スタート] メニューの最近使用したアプリケーション (MRU) の一覧にアイコンを表示する方法を教えてください。
4.14. フォームを画面中央に配置する方法を教えてください。

5. グラフィカル ユーザー インターフェイス (GUI) : 全般

5.1. イメージ ボタンまたは複数行のテキスト ボタンの作成方法を教えてください。
5.2. .NET Compact Framework では TextBox.AcceptsReturn はどのように動作しますか。
5.3. データが ComboBox に読み込まれると SelectedIndexChanged イベントがトリガされないのはなぜですか。
5.4. Show と ShowDialog の相違点は何ですか。
5.5. ContextMenu の区分線を作成できないのはなぜですか。
5.6. 実行時に ImageList を ToolBar に割り当ててもイメージが表示されないのはなぜですか。
5.7. 待機中のカーソルの設定方法を教えてください。
5.8. メニュー項目にアンパサンド (&) を表示する方法を教えてください。
5.9. Microsoft .NET Compact Framework ベースのアニメーション コントロールの作成方法を教えてください。
5.10. .NET Compact Framework のカスタム コントロールの作成方法を教えてください。
5.11. Microsoft .NET Compact Framework ベースのイメージ ボタンの作成方法を教えてください。
5.12. Microsoft .NET Compact Framework の MessageWindow クラスの使用方法を教えてください。
5.13. DataGrid に行と列を追加する方法を教えてください。
5.14. DataGrid でセル編集を実装する方法を教えてください。
5.15. DataGrid の DataSource を設定する方法を教えてください。
5.16. DataGrid の列を並べ替える方法を教えてください。
5.17. ListView の項目を並べ替える方法を教えてください。
5.18. InputPanel コンポーネント (SIP) の使用方法を教えてください。
5.19. カスタム イベントの作成方法を教えてください。
5.20. オーナー描画リスト ボックスの作成方法を教えてください。
5.21. true/false チェック ボックスの作成方法を教えてください。
5.22. InputPanel.Enabled = true と設定すると例外が発生するのはなぜですか。
5.23. カスタム コントロールが親のフォントを自動的に継承しないのはなぜですか。
5.24. 新しいテキストを手動で入力すると、NumericUpDown コントロールと DomainUpDown コントロールがそれぞれの ValueChanged イベントと SelectedItemChanged イベントを発生させないのはなぜですか。
5.25. NumericUpDown コントロールの値が、設定された Increment 値以外の値ずつ増加するのはなぜですか。
5.26. StatusBar コントロールをフォームの任意の場所に配置できません。いつも下端に配置されてしまいますが、これはなぜですか。
5.27. カスタム コントロールが親の背景色を自動的に継承しないのはなぜですか。
5.28. NumericUpDown コントロールでは、小数値は受け入れられますが、2^16 を超える数値は使用されないようです。これはなぜですか。
5.29. DomainUpDown コントロールにテキストを入力し、このコントロールで関連項目を選択することができません。これはなぜですか。
5.30. OpenFileDialog がマイ ドキュメント フォルダに制限されているのはなぜですか。
5.31. メニューを使用しないで SIP (InputPanel) をアクティブにする方法を教えてください。
5.32. TreeView 内のすべてのノードにサブノードを追加する方法を教えてください。
5.33. DataGrid 内の行または列の数を確認する方法を教えてください。
5.34. オーナー描画 Listbox の作成方法を教えてください。

6. 相互運用性とネイティブ コード

6.1. ネイティブ DLL 内にある関数を呼び出す方法を教えてください。
6.2. P/Invoke の宣言を支援するために dumpbin.exe を使用する方法を教えてください。
6.3. Microsoft .NET Compact Framework ベース アプリケーションのアンマネージ関数の記述方法を教えてください。
6.4. GetTickCount に P/Invoke を実行する方法を教えてください。
6.5. デバイスが使用できるメモリの量を判断する方法を教えてください。
6.6. フォームを強制的に最小化された状態にしておく方法を教えてください。
6.7. .NET Compact Framework で Platform Invoke (P/Invoke) の実行中に型をマーシャリングする方法を教えてください。
6.8. コントロールまたはフォームのハンドル (HWND) の取得方法を教えてください。
6.9. パフォーマンス カウンタ関数の使用方法を教えてください。
6.10. P/Invoke を使用したマーシャリング型には、どのような制限がありますか。
6.11. GetLastError に P/Invoke を実行すると、不適切なリターン コードが返されるのはなぜですか。
6.12. ネイティブ関数に渡すことができる引数の数に制限はありますか。
6.13. ネイティブ関数に P/Invoke を実行すると "NotSupportedException" が発生するのはなぜですか。
6.14. byte[] を IntPtr に変換する方法を教えてください。
6.15. ネイティブ DLL から関数を呼び出すと MissingMethodException が発生するのはなぜですか。

7. 全般

7.1. アプリケーションのルート ディレクトリを確認する方法を教えてください。
7.2. 正確な時間間隔を計算する方法を教えてください。
7.3. 埋め込まれたリソースにストリームとしてアクセスする方法を教えてください。
7.4. "An unhandled exception of type 'System.Net.Sockets.SocketException' occurred in System.dll" というメッセージが表示されるのはなぜですか。
7.5. パフォーマンス モニタの使用方法を教えてください。
7.6. アプリケーションが閉じられないようにする方法を教えてください。
7.7. 使用中のアプリケーション内から別のアプリケーションを起動する方法を教えてください。
7.8. .NET Compact Framework アプリケーションによって作成されるのはどのスレッドですか。
7.9. バイト配列を構造体に変換する方法を教えてください。
7.10. カスタム デリゲートを作成して呼び出しに渡すことはできますか。
7.11. Microsoft .NET Compact Framework から Phone API にアクセスする方法を教えてください。
7.12. Pocket PC で GUID を生成する方法を教えてください。
7.13. Pocket Outlook データを Microsoft .NET Compact Framework ベースのアプリケーションに組み込む方法を教えてください。
7.14. .NET Compact Framework 内のファイルのバージョンを確認できますか。
7.15. Microsoft .NET Compact Framework バックグラウンド処理の手法としては、どのようなものがありますか。
7.16. Microsoft .NET Compact Framework マルチスレッドに関するヒントにはどのようなものがありますか。
7.17. スマート デバイス アプリケーションで難読化機能を使用する方法を教えてください。
7.18. 暗号化サービスを使用してデータを暗号化および復号化する方法を教えてください。
7.19. .NET Compact Framework を使用して一意の Windows CE デバイス ID を取得する方法を教えてください。
7.20. Microsoft .NET Compact Framework ベースのアプリケーションから Short Message Service のメッセージを送信する方法を教えてください。
7.21. Control.Name プロパティを使用しないでイベントの送信元を確認する方法を教えてください。
7.22. スレッドでメソッドのパラメータを呼び出す方法を教えてください。
7.23. 通知と時刻指定アプリケーションの作成方法を教えてください。
7.24. サウンドを再生する方法を教えてください。
7.25. コマンド ライン引数の使用方法を教えてください。
7.26. 破棄されたオブジェクト上でプロパティまたはメソッドを使用すると、例外が発生するのはなぜですか。
7.27. EnterTab、および方向キーを押したことを示すイベントを取得する方法を教えてください。
7.28. 読み取り専用ファイルの削除方法を教えてください。
7.29. 実行時にメンバが存在するかどうかを確認する方法を教えてください。
7.30. デバイス名をプログラムによって確認する方法を教えてください。
7.31. コマンド ラインから C# スマート デバイス プロジェクトを作成する方法を教えてください。
7.32. 実行中のスレッドを中止する方法を教えてください。
7.33. Pocket PC エミュレータで動画を再生できないのはなぜですか。
7.34. アクティブなアプリケーションの一覧にフォームのタイトルが表示されないようにする方法を教えてください。
7.35. コントロールのインスタンス名からそのコントロールにアクセスする方法を教えてください。
7.36. ハードウェアの方向パッド ボタンを検出する方法を教えてください。
7.37. クリック イベントだけがサポートされている場合にダブルクリック イベントを取得する方法を教えてください。
7.38. onenter/onleave スタイルの通知を取得する方法を教えてください。
7.39. アプリケーションを停止しないモーダル ダイアログで、スレッド化を使用する方法を教えてください。

8. 通信と Web サービス

8.1. TCP ソケットを経由してデータをデスクトップ サーバーへ送信する方法を教えてください。
8.2. ローカル ホスト上で Web サービスにアクセスできないのはなぜですか。
8.3. Microsoft .NET Compact Framework を使用して Web サービスを処理する方法を教えてください。
8.4. プロキシを使用して HTTP GET 要求を送信する方法を教えてください。
8.5. Web サービスを使用する方法を教えてください。
8.6. Microsoft MapPoint 3.0 を使用して地図を取得する方法を教えてください。
8.7. MapPoint 3.0 を使用して地図と経路図を取得する方法を教えてください。

9. SQL CE とデータ

9.1. .NET Compact Framework、SQL Server CE、およびレプリケーションを使用してアプリケーションを開発する場合の考慮事項には、どのようなものがありますか。
9.2. .NET Compact Framework を使用したマージ レプリケーションの使用方法を教えてください。
9.3. XML を使用した ADO.NET データ連結の使用方法を教えてください。
9.4. SQL Server CE データベースの作成方法を教えてください。
9.5. SQL Server CE のパラメータ化されたクエリの送信方法を教えてください。

10. 追加情報

10.1. Pocket TaskVision アプリケーション
10.2. .NET Compact Framework ベースのプロセス マネージャの作成
10.3. Microsoft .NET Compact Framework を使用したモバイル ゲームの開発
10.4. .NET Compact Framework ベースの DateTimePicker コントロールの作成
10.5. Pocket PC シグネチャ キャプチャ アプリケーションの作成
10.6. .NET Compact Framework ベースのアプリケーションの開発に関する情報を提供しているマイクロソフト以外の会社の web サイトはありますか。

11. 接続

11.1. ActiveSync を使用して Windows CE デバイスに配置できないのはなぜですか。
11.2. ActiveSync を使用して CEPC またはその他の x86 ベースの Windows CE デバイスをデバッグできないのはなぜですか。
11.3. デバイス上に Toolhelp.dll がない場合にデバッグが失敗するのはなぜですか。
11.4. ネットワーク プロトコル数が 50 を超えるとデバイスに配置できなくなるのはなぜですか。
11.5. ActiveSync をアンインストールした後に ActiveSync を使用してデバイスに配置できないのはなぜですか。
11.6. コンピュータ名またはユーザー名をローカライズするとデバイスへの配置が失敗する可能性があります。これはなぜですか。
11.7. ログオン ユーザーが Administrators グループに含まれていない場合にデバイスへの配置が失敗するのはなぜですか。
11.8. Pocket PC デバイスまたはエミュレータへの配置が共有違反エラーによって失敗するのはなぜですか。
11.9. Windows Server 2003 コンピュータ上でエミュレータを初めて使用したときにセキュリティの警告メッセージが発生するのはなぜですか。
11.10. エミュレータの起動中に見つからないファイルに関するエラー メッセージが表示されるのはなぜですか。
11.11. エミュレータの配置の初回試行時に失敗することがあるのはなぜですか。
11.12. [デバイスへの接続] ボタンを使用してエミュレータを起動した後に、初めて試行した配置が失敗するのはなぜですか。
11.13. コンピュータがネットワークに接続されていない場合にエミュレータのデバッグが失敗するのはなぜですか。
11.14. エミュレータが COM ポートを使用すると、エミュレータが起動しない (画面が黒で表示される) のはなぜですか。
11.15. Visual Studio .NET 2003 Emulator が eMbedded Visual Tools Emulator と同時に動作しないのはなぜですか。
11.16. TCP 接続があっても ActiveSync 接続がないデバイスに配置できないのはなぜですか。

Top of Page ページのトップへ

1. 開発

1.1. Microsoft .NET Compact Framework とは何ですか。
Microsoft .NET Compact Framework は、Microsoft .NET イニシアティブのスマート デバイス開発フレームワークであり、いつでも、どこでも、どんなデバイスでもユーザーにすばらしい体験を提供するという、マイクロソフトの目標を実現するための重要な部分を担っています。.NET Compact Framework は、マネージ コードや Web サービスの世界をスマート デバイスにもたらし、携帯情報端末 (PDA)、携帯電話、セットトップ ボックスなどのデバイスで、セキュリティで保護された、ダウンロード可能なアプリケーションを実行できるようにします。

https://msdn.microsoft.com/mobility/prodtechinfo/devtools/netcf/overview/default.aspx (英語)

1.2. .NET Compact Framework アプリケーションを開発するにはどのようなツールが必要ですか。
Pocket PC 2000、Pocket PC 2002、および Windows CE .NET 4.1 に基づいたデバイスに対応する .NET Compact Framework ベースのアプリケーションを開発するには、Visual Studio .NET 2003 が必要です。.NET Compact Framework は、Visual Studio .NET 2003 の一部として提供されます。
https://msdn.microsoft.com/mobility/prodtechinfo/devtools/vstudio/default.aspx (英語)

追加 SDK は、最新の Windows Mobile プラットフォーム上での開発に使用できます。

Windows Mobile 2003 Pocket PC SDK
https://www.microsoft.com/downloads/details.aspx?displaylang=ja&FamilyID;=9996b314-0364-4623-9ede-0b5fbb133652

Windows Mobile 2003 Smartphone SDK
https://www.microsoft.com/downloads/details.aspx?familyid=a6c4f799-ec5c-427c-807c-4c0f96765a81&displaylang=en

次の記事では、.NET Compact Framework 1.0 と Visual Studio .NET 2003 を使用した、堅牢なスマート クライアント デバイス アプリケーションの開発の手順について説明します。
https://www.microsoft.com/japan/msdn/net/compactframework/netcfgetstarted.asp (英語)

1.3.最新のツールとソフトウェアはどこでダウンロードできますか。
Visual Studio .NET 2003 の評価版は次の Web サイトから入手できます。
https://www.microsoft.com/japan/msdn/vstudio/productinfo/trial/default.asp (英語)

最新のプラットフォームの更新と .NET Compact Framework サービス パックは次の Web サイトから入手できます。
https://msdn.microsoft.com/mobility/downloads/default.aspx (英語)

1.4. .NET Compact Framework によってサポートされているのは、どのようなデバイスですか。
.NET Compact Framework は、Pocket PC 2000、Pocket PC 2002、Windows Mobile 2003 ベースの Pocket PC と Smartphones と Windows CE .NET 4.1 以降を実行している埋め込みシステムでサポートされます。

1.5. 将来的にどのようなデバイスが .NET Compact Framework によってサポートされますか。
.NET Compact Framework は、将来の Pocket PC デバイス、Pocket PC Phone Edition、Smartphone、Windows CE for Automotive、MSTV などを含め、進化を続けるすべての Microsoft スマート デバイスにおけるオペレーティング システム (OS) コンポーネントとなる予定です。個別のデバイスについての時期的な決定は、個別の製品リリース サイクルによって決定されます。

Windows CE .NET 4.1 も .NET Compact Framework を統合された OS コンポーネントとしてサポートします。このため OEM で Platform Builder ツールを使用して、すべての新しい Windows CE 搭載デバイスに .NET Compact Framework を埋め込むことができるようになります。

1.6. デバッガがエミュレータとの接続の確立に失敗するのはなぜですか (アプリケーションの起動エラー)。
次のリンクは、デバッグのセットアップおよびトラブルシューティングのガイドです。
https://download.microsoft.com/download/c/d/b/cdbff573-73fb-4f9f-a464-c5adc890e1ae/Readme.htm

1.7. .NET Framework と .NET Compact Framework の相違点は何ですか。
.NET Framework と .NET Compact Framework の比較については、次の Web サイトを参照してください。
https://www.microsoft.com/japan/msdn/library/ja/dv\_evtuv/html/etconComparisonsWithNETFramework.asp

.NET Compact Framework Class Library Comparison Tool の情報
https://msdn.microsoft.com/library/en-us/dv_spchk/html/NET_Compact_Framework.htm

1.8. .NET Compact Framework SP1 (SP1) の新機能は何ですか。
.NET Compact Framework SP1 は、多数の欠陥に対する修正を提供します。修正の一覧は、次の Web サイトで入手できます。
https://www.microsoft.com/downloads/details.aspx?displaylang=ja&FamilyID;=1f62a2a3-7282-4ba9-b26b-2267e972501d

1.9. .NET Compact Framework 開発における Pocket PC と Windows CE .NET の相違点は何ですか。
次の記事では、Pocket PC と CE .NET プラットフォーム向けに Microsoft .NET Compact Framework ベースのアプリケーションを開発する場合の相違点の概要が示されています。
https://msdn.microsoft.com/library/en-us/dnnetcomp/html/netcfPPCtoCE.asp (英語)

1.10. .NET Compact Framework ベースのアプリケーションの作成方法の詳細について、どこで参照できますか。
以下のリソースは、.NET Compact Framework ベース のアプリケーションの作成方法を習得するために役立つ情報を提供しています。

1.11. .NET Compact Framework のドキュメントはどこにありますか。
https://www.microsoft.com/japan/msdn/library/ja/dv\_evtuv/html/etconNETCompactFramework.asp

1.12. デバッガを実行するたびに、依存するファイルがコピーされないように指定する方法を教えてください。
Visual Studio .NET 2003 で、当該項目を右クリックし、[プロパティ] をクリックします。[ビルド アクション] を [なし] に変更します。このファイルはコピーされなくなります。ファイルが変更され、再度コピーすることが必要になった場合は、[ビルド アクション] を [コンテンツ] に変更します。

1.13. エミュレータのプロパティを設定する方法を教えてください。
Visual Studio .NET 2003 のメニューで、[ツール] メニューの [オプション] をクリックします。次に、[デバイス ツール] フォルダを開き、[デバイス] を選択します。[デバイス] 選択リストを表示するダイアログ ボックスが表示されます。変更するデバイスを選択し、[構成] ボタンをクリックします。

複数のタブがあるダイアログ ボックスが表示されます。これらのタブでは、メモリやスクリーン サイズなどの設定にアクセスして変更できます。

1.14. Microsoft .NET Compact Framework アプリケーションをデバッグする方法を教えてください。
Microsoft .NET Compact Framework は、Visual Studio .NET 2003 に完全に統合され、Visual Studio .NET の他のアプリケーション タイプで使用可能なデバッグ機能をサポートします。しかし、別のデバイス上やエミュレータで実行中のアプリケーションをデバッグするには、特別な配慮が必要です。.NET Compact Framework のデバッグ機能を最大限活用するには、次の提案事項を参照してください。
https://www.microsoft.com/japan/msdn/net/compactframework/CompactFXDebug.asp

1.15. Visual Basic .NET を使用してデバイス用アプリケーションの開発を開始する方法を教えてください。
Visual Studio .NET の Smart Device Extensions (SDE) を使用して、.NET Compact Framework をサポートするスマート デバイス用 Windows アプリケーションを開発する方法を習得します。次の記事では、開発全体、デバッグ、および配置プロセスの確認を行い、.NET Framework と .NET Compact Framework の相違点について検証します。
https://msdn.microsoft.com/library/en-us/dnnetcomp/html/sdeforvb.asp (英語)

1.16. .NET Compact Framework Assemblies をグローバル アセンブリ キャッシュ (GAC) にインストールする方法を教えてください。
https://msdn.microsoft.com/library/en-us/dncfhowto/html/HOWTOGAC.asp (英語)

1.17. Visual Studio .NET 2003 からスマート デバイス アプリケーションを配置するときに発生する "共有違反" に対処する方法を教えてください。
次の記事では、Visual Studio .NET 2003 から各開発者のアプリケーションを配置できないようにする共有違反の原因を説明し、これに対処する方法を示します。
https://msdn.microsoft.com/library/en-us/dncfhowto/html/HOWTOSharingviolation.asp (英語)

1.18. 共通言語ランタイム (CLR) とは何ですか。
.NET Compact Framework には、共通言語ランタイムと呼ばれるランタイム環境が用意されています。共通言語ランタイムは、コードを実行し、配置プロセスを簡略化するサービスを提供します。詳細については、次の概要を参照してください。
https://www.microsoft.com/japan/msdn/library/ja/cpguide/html/cpconcommonlanguageruntimeoverview.asp

1.19. グローバル アセンブリ キャッシュ (GAC) とは何ですか。
共通言語ランタイムがインストールされた各コンピュータには、グローバル アセンブリ キャッシュと呼ばれるコンピュータ全体にわたるコード キャッシュが用意されています。グローバル アセンブリ キャッシュには、特にコンピュータ上の複数のアプリケーションによって共有されるように設計されているアセンブリが格納されます。GAC の詳細については、次の記事を参照してください。
https://www.microsoft.com/japan/msdn/library/ja/cpguide/html/cpconglobalassemblycache.asp

1.20. .NET Compact Framework ではどのようにメモリが管理されますか。
自動メモリ管理は、マネージ実行の間に CLR によって提供されるサービスの 1 つです。CLR ガベージ コレクタは、次の記事で説明されるように、アプリケーションのメモリの割り当てと解放を管理します。
https://www.microsoft.com/japan/msdn/library/ja/cpguide/html/cpconautomaticmemorymanagement.asp

1.21. ネットワーク プロトコル数が 50 を超えるとデバイスに配置できなくなるのはなぜですか。
症状 : Ctrl キーを押しながら F5 キーを押すか、F5 キーを押すと [配置エラー] メッセージ ボックスが表示されます。

原因 : この問題は既に確認されています。.NET Framework メソッド System.Net.Dns.GetHostName は、現在のコンピュータに 50 を超えるネットワーク プロトコルのバインドがインストールされている場合に例外をスローします。このメソッドは、Visual Studio .NET によって呼び出され、この例外によって配置が失敗します。

対処方法 : 必要のない任意のネットワーク プロトコルをアンインストールします。これを行う 1 つの方法は、デバイス マネージャを使用するものです。[コンピュータの管理] の下で、[ネットワーク アダプタ] の下の使用されていないエントリを削除します。これ以外の対処方法としては、プロトコルをインストールしたアプリケーションをアンインストールします。

1.22. 複数のプラットフォームにまたがるバイナリが存在するのはなぜですか。
.NET Compact Framework と実行エンジンは、完全な .NET Framework と CLR との互換性を持つサブセット実装です。厳密な名前のバインド ポリシーがない場合、.NET Compact Framework に対してコンパイルされたアプリケーションは、いくつかの重要な例外を伴いながら、完全な .NET Framework をバインドし、.NET Framework で実行されます。

  • .NET Compact Framework アセンブリは、さまざまな厳密名とキーのペアを使用して署名されるため、CLR はこれらを完全な .NET の同等の要素と区別できます。
  • 完全な .NET Framework と CLR の将来のリリースには、互換性のある .NET Compact Framework 参照の代わりに、完全な .NET Framework アセンブリに置き換わるバインド ポリシーが含まれる予定です。この結果、一般的なケースにおいて、既存のコンポーネントを再リンクしないで再利用できるようになります。たとえば、コンポーネントが .NET Compact Framework システムと System.NET クラスだけを参照する場合も、再リンクしないで .NET Compact Framework と完全な .NET Framework の両方に対する互換性を保持した状態で実行されます。
  • Pocket PC 固有の UI コントロールなど .NET Compact Framework に固有の機能を参照する場合、プログラムは完全な .NET Framework へのバインドに失敗します。
  • 複数のプラットフォームにまたがるバイナリの互換性によってミドルウェア コンポーネントの開発と配置が簡略化されるのと同様に、マイクロソフトでは、リッチクライアント アプリケーションでデバイス固有の機能を活用することにより、ユーザーの操作感が向上するものと考えています。この考えには、最も望ましい GUI コードとはターゲット固有のものである、という推測も反映されています。
  • マイクロソフトは、デバイス固有の機能を個別の名前空間とアセンブリに分解することによって、バインド競合を回避することに尽力してきましたが、場合によってはバージョン 1 では対処できない、互換性のないファクタリングが発生する可能性もあります。このような場合に、不注意により完全な .NET Framework を使用したデバイス固有の機能を使用すると、アプリケーション読み込み例外ではなく実行時例外が発生します。

1.23. すべての ARM バイナリについて説明してください。
XScale は、ARMv5 命令セットをサポートしますが、ARMv4 命令セットに対する下位互換性もあります。ARMv4 命令セットには次の 3 種類があります。

  • ARMv4 : 32 ビット ARMv4 命令だけをサポートします。
  • ARMv4T : 'T' は Thumb の略です。Thumb は ARM 16 ビット命令モードです。
  • ARMv4I : 'I' は Interworking の略です。このタイプでは 32 ビット命令と 16 ビット命令が共存できます。

その他の ARM プロセッサについての説明を以下に示します。

  • StrongARM (SA1110) : ARMv4 命令だけをサポートします。
  • ARM920T など : 通常は上記の 3 つのタイプをすべてサポートします。

.NET Compact Framework は ARM に対する 3 つのバイナリ セットを提供します。

  • PocketPC 2000 および Pocket PC 2002 対応 ARMv4。これは、XScale を含む ARM デバイス上のすべての ARM を実行します。これらのデバイスに配置された CAB の名前には "arm" が付きます。
  • Windows CE.NET 対応 ARMv4。Platform Builder の ARMv4 カーネルを使用してコンパイルされた Windows CE.NET デバイス上で実行されます。これは Pocket PC 2003 用のバイナリでもあります。これらのデバイスに配置された CAB の名前には "armv4" が付きます。
  • Windows CE.NET 対応 ARMv4T または ARMv4I。これは、Platform Builder の ARMv4T カーネルまたは ARMv4I カーネルを使用してコンパイルされた Windows CE.NET デバイス上で実行されます。これらのデバイスに配置された CAB の名前には "armv4T" が付きます。

1.24. デバイスでレジストリを書き込む方法を教えてください。
Visual Studio .NET には、出荷時に Windows CE 用のリモート レジストリ エディタは含まれていません。次のいずれかをレジストリ キーのセットに対して使用します。

  • Microsoft Embedded Visual Tools Remote Registry Editor
  • Microsoft Windows CE Platform Builder Remote Registry Editor
  • PHM Pocket PC Registry Editor (このシェアウェアは Web 上で簡単に見つかります)

1.25. .CAB ファイルをインストール後に削除されないようにする方法を教えてください。
.CAB ファイルのプロパティを読み取り専用に設定することによって、その .CAB ファイルが自動的に削除されないようにすることができます。

1.26. デバイスにインストールされた .NET Compact Framework のバージョンを確認する方法を教えてください。

.NET Compact Framework の各バージョンには、個別の Win32 ファイル バージョン番号 (これは、Service Pack を含む Version 1 の .NET Compact Framework のすべてのリリースにわたって共通のアセンブリ バージョンとは個別のバージョン番号です) が付いてリリースされます。

インストールされたバージョンを確認するには、ファイル エクスプローラを使用してデバイス上の \Windows ディレクトリに移動し、CGACUTIL という名前のファイルをクリックします。デバイスにインストールされた .NET Compact Framework の Win32 ファイル バージョンを示すメッセージ ボックスが表示されます。

RTM = 1.0.2268.0
SP1 = 1.0.3111.0
SP2 = 1.0.3316.0

プログラムによってバージョンを確認するには、System.Environment.Version.ToString() を使用します。

1.27. ファイルをエミュレータにコピーする方法を教えてください。

1 つの方法として、開発 PC 上にファイルの共有を作成し、エミュレータのファイル エクスプローラを使用してその共有に接続する方法が挙げられます。こうすると、共有からファイルをコピーしてエミュレータのローカル ファイル システムに貼り付けることができます。他の方法としては、スマート デバイス プロジェクトにファイルを追加し、そのファイルの [ビルド アクション] プロパティを [コンテンツ] に設定する方法があります。[ファイルのプロパティ] の詳細については、Visual Studio .NET のオンライン ドキュメントを参照してください。

https://www.microsoft.com/japan/msdn/library/ja/Vbcon/html/vbconFileProperties.asp

スマート デバイス プロジェクトにコンテンツ ファイルを追加する方法を段階的に説明します。

  1. スマート デバイス プロジェクトを開くか、作成します。
  2. [表示] メニューで、[ソリューション エクスプローラ] をクリックします。
  3. ソリューション エクスプローラでプロジェクトを右クリックし、[追加] をポイントして [既存項目の追加] をクリックします。必要なファイルを参照し、プロジェクトに追加します。
  4. ソリューション エクスプローラで追加したファイルを右クリックし、[プロパティ] をクリックします。
  5. [ビルド アクション] プロパティが設定されていない場合は、[コンテンツ] に設定します。

Top of Page ページのトップへ

2. グラフィックス

 

2.1. グラフィックス オブジェクトの作成方法を教えてください。
グラフィックス オブジェクトの作成方法は、用途に応じて複数あります。

OnPaint から PaintEventArgs で提供されるオブジェクトを使用します。

//C#
protected override void OnPaint(PaintEventArgs e)
{
e.Graphics.DrawLine(...);
}

'VB
Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs)
e.Graphics.DrawLine(...)
End Sub 'OnPaint

コード内のその他の領域から、任意のコントロールのグラフィックス オブジェクトを作成するために、コントロールのメソッドである関数を使用できます。

//C#
using System.Drawing;

Graphics g = this.CreateGraphics();

'VB
Imports System.Drawing

Dim g As Graphics = Me.CreateGraphics()

ビットマップに直接描画します。

//C#
using System.Drawing;

Bitmap bm = new Bitmap(10,10);
Graphics g = Graphics.FromImage(bm);

'VB
Imports System.Drawing

Dim bm As New Bitmap(10, 10)
Dim g As Graphics = Graphics.FromImage(bm)

2.2. GDI+ レンダリングを最適化する方法を教えてください。
グラフィックス描画の呼び出しを使用する場合、描画速度の向上に役立つ基本的なコード作成方法がいくつか存在します。

  • グラフィックス オブジェクトを 1 つだけ作成します (または OnPaint 内の PaintEventArgs を 1 つ使用します)。
  • すべての描画をオフスクリーン ビットマップに対して実行してから、このビットマップをすべて一度にディスプレイに描画します。
  • イメージの変更された部分だけを再描画します。
  • 可能な場合は (伸縮などを行わないで) 描画先と描画元が同じサイズになるように描画します。

最も重要な点は、再描画する必要がある項目を追跡するために発生する描画の数を最小限に抑えることです。たとえば、カーソルをイメージにわたってドラッグする場合は、イメージ全体を再描画する必要はありません。ただし、イメージの中で上書きされる前のカーソル位置の部分は、再描画されます。

2.3. フォーム上にイメージを描画する方法を教えてください。
次のサンプルでは、フォームの背景イメージとしてグラフィックを表示する方法が示されています。
https://www.gotdotnet.com/japan/quickstart/CompactFramework/doc/bkgndimage.aspx

2.4. 透過的なイメージを描画する方法を教えてください。
透過的なイメージの描画には、透過色を指定する ImageAttributes オブジェクトが必要です。現在、.NET Compact Framework は、単一色のソース カラー キー透過性をサポートしています。SetColorKey 関数では色の範囲が考慮に入れられますが、最小色と最大色は同じになる必要があります。この条件を満たさない場合は、実行時 ArgumentException が発生します。

//C#
using System.Drawing.Imaging;

ImageAttributes attr = new ImageAttributes();

'VB
Imports System.Drawing.Imaging

Dim attr As New ImageAttributes()

次のコードは、イメージの左上のピクセルに基づいた透過性カラー キーを設定する方法を示します。

//C#
attr.SetColorKey(bmp.GetPixel(0,0), bmp.GetPixel(0,0));

'VB
attr.SetColorKey(bmp.GetPixel(0,0), bmp.GetPixel(0,0))

この色は、次に示すように明示的に設定することもできます。

//C#
attr.SetColorKey(Color.FromArgb(255,0,255),Color.FromArgb(255,0,255));
attr.SetColorKey(Color.Fuchsia, Color.Fuchsia);

'VB
attr.SetColorKey(Color.FromArgb(255,0,255),Color.FromArgb(255,0,255))
attr.SetColorKey(Color.Fuchsia, Color.Fuchsia)

その後、ImageAttributes オブジェクトをパラメータとしてとるオーバーロードされた Graphics.DrawImage 関数によってイメージを描画できます。

//C#
g.DrawImage(bmp, 0, 0, bmp.Width, bmp.Height,GraphicsUnit.Pixel, attr);

'VB
g.DrawImage(bmp, 0, 0, bmp.Width, bmp.Height,GraphicsUnit.Pixel, attr)

2.5. TextBox で CreateGraphics を呼び出すと失敗するのはなぜですか。
Control.CreateGraphics() をサポートするのは、Control クラスと Form クラスだけです。

2.6. テキストのスクリーン サイズを決定する方法を教えてください。
Graphics メソッドである MeasureString を使用します。次のコードは、いくつかのテキストの周囲にボックスを描画する方法を示します。

//C#
using System.Drawing;

protected override void OnPaint(PaintEventArgs e)
{
string s = "Hello World"

Pen pen = new Pen(Color.Fuchsia);
Font font = new Font("Arial", 18, FontStyle.Regular);
Brush brush = new SolidBrush(Color.Black);

SizeF sSize = e.Graphics.MeasureString(s, font);

Rectangle r = new Rectangle(9, 199,(int)sSize.Width + 1, (int)sSize.Height + 1);

e.Graphics.DrawRectangle(pen, r);
e.Graphics.DrawString(s, font, brush, 10.0f, 200.0f);

base.OnPaint (e);
}

'VB
Imports System.Drawing

Protected Overrides Sub OnPaint(e As PaintEventArgs)
Dim s As String = "Hello World"
  
Dim pen As New Pen(Color.Fuchsia)
Dim font As New Font("Arial", 18, FontStyle.Regular)
Dim brush = New SolidBrush(Color.Black)

Dim sSize As SizeF = e.Graphics.MeasureString(s, font)

Dim r As New Rectangle(9, 199, Fix(sSize.Width) + 1, Fix(sSize.Height) + 1)

e.Graphics.DrawRectangle(pen, r)
e.Graphics.DrawString(s, font, brush, 10F, 200F)

MyBase.OnPaint(e)

End Sub 'OnPaint

2.7. ペンの幅を設定できますか。
ペンの幅の設定は、.NET Compact Framework では行うことができません。これの代替案となる解決方法を以下に示します。

  • Graphics.FillRectangle メソッドを使用して塗りつぶされた四角形を描画する。
  • 複数の線を隣接して描画する。
  • GAPI を使用してカスタム グラフィック ルーチンを記述する。

 Top of Page ページのトップへ

3. 配置

3.1. PocketPC セットアップ アプリケーションの作成方法を教えてください。
この記事では、さまざまな Pocket PC デバイスにアプリケーションをインストールするために、デスクトップから実行する単一の .msi ファイルを作成する方法を示します。開発プロセスは自動化されているため、簡単に必要なすべてのコンポーネントをビルドして .msi ファイルにパッケージ化できます。C# と Microsoft Visual Basic .NET を使用した場合のサンプル コードが示されています。
https://msdn.microsoft.com/library/en-us/dnnetcomp/html/netcfdeployment.asp (英語)

3.2. アプリケーションのインストールに含めることができる再配布可能パッケージはどれですか。
独自に開発したアプリケーションと共に End-User Redist を顧客に提供して、顧客がデバイスを更新できるようにすることができます。この End User Redist を開いて、その内容を顧客に送付することはできません。ただし、Developer Redist を開いて、その内容を顧客に送付することはできます。

これらの .NET Compact Framework 再配布可能パッケージは、次の Web サイトからダウンロードできます。
https://msdn.microsoft.com/mobility/downloads/updates/default.aspx (英語)

3.3. デスクトップでは .NET Framework を必要としないインストール プログラムの作成方法を教えてください。
次の記事では、Pocket PC アプリケーションの正常なインストールについて説明されています。
https://www.microsoft.com/japan/mobile/developer/technicalarticles/installation.asp

3.4. Pocket PC プラットフォームに依存しない CAB ファイルを作成する方法を教えてください。
.inf ファイルを作成して、任意の Pocket PC デバイスにアプリケーションをインストールするための CAB ファイルを生成できます。手順については、次のサンプルを参照してください。
https://www.gotdotnet.com/japan/quickstart/CompactFramework/doc/cabfile.aspx

3.5. 各プロセッサの種類に対応する 3 種類の CAB ファイルがあるのはなぜですか。
各 CAB には、デバイスでフレームワーク依存性の検出を実行する、サイズの小さいネイティブ実行可能ファイルが含まれています。このユーティリティは、プロセッサ/プラットフォームに固有であり、各プロセッサの種類に対応する CABS が必要になります。

3.6. ターゲット デバイス上に .NET Compact Framework が存在するかどうか検出し、必要に応じて .NET Compact Framework をインストールするデスクトップ インストーラを作成する方法を教えてください。

MSDN ライブラリで「Creating an MSI Package that Detects and Updates the .NET Compact Framework (英語)」を参照してください。使用できる方法が説明されています。

3.7. .NET Compact Framework Service Pack をエミュレータに配置する方法を教えてください。

デスクトップ開発 PC にサービス パックの "開発者向け" バージョン ("Microsoft® .NET Compact Framework 1.0 SPx 開発者用 再頒布可能パッケージ" などと表記されます) をダウンロードしてインストールします。次の Web サイトからダウンロードできます。
https://www.microsoft.com/japan/msdn/vstudio/device/compactfx1SP2Redist.asp

次に、(次の段落の説明に従って) 適切な .NET Compact Framework CAB ファイルをエミュレータにコピーします。エミュレータ内部から [ファイル エクスプローラ] を PC 上の共有にポイントし、CAB をコピーしてエミュレータのファイル システム上の任意の場所に貼り付けます。次に、[ファイル エクスプローラ] から CAB ファイルを起動します。上書きするかどうかをたずねられた場合は、すべて [はい] と答えます。

エミュレータ

CAB ファイル

Pocket PC 2002 netcf.core.ppc3.x86.cab
Windows Mobile 2003 for Pocket PC netcf.core.wce4.x86.cab
Windows Mobile 2003 for Smartphone RAM インストールはサポートされていません。

Top of Page ページのトップへ

4. グラフィカル ユーザー インターフェイス (GUI) : フォーム

4.1. 全画面表示フォームの作成方法を教えてください。
WindowState プロパティを Maximized に設定する必要があります。フォーム内の全画面表示イメージ内に "非表示" フォームを作成するには、FormBorderStyle も None に設定し、ControlBox もオフにし、フォームからすべてのメニュー インスタンスを削除する必要があります。

//C#
this.WindowState = FormWindowState.Maximized;
this.FormBorderStyle = FormBorderStyle.None;
this.ControlBox = false;
this.Menu = null;

'VB
Me.WindowState = FormWindowState.Maximized
Me.FormBorderStyle = FormBorderStyle.None
Me.ControlBox = False
Me.Menu = Nothing

4.2. 読み込み関数に対してフォーム コンストラクタを使用する必要があるのは、どのような場合ですか。
UI を含むすべてものに対しては、フォームの読み込み関数を使用することをお勧めします。通常、コンストラクタでは、データとコントロールのインスタンスの読み込みと作成を安全に実行できます。ただし、UI 要素を含むコントロールまたはフォームに対するすべての初期化は、読み込み関数で実行する必要があります。たとえば、コントロールのインスタンスを作成し、それをコンストラクタ内のフォームに追加することは安全に実行できますが、コントロールの位置の設定は読み込み関数で実行する必要があります。

4.3. スマート最小化ボタンを閉じるボタンに置き換える方法を教えてください。
ウィンドウ スタイルをスマート最小化ではなく閉じた状態に変換する設定は、IDE のデザイナ プロパティを通して、またはプログラムによって行うことができます。[(x)] ボタンはアプリケーションのスマート最小化を行いますが、[(ok)] ボタンはアプリケーションを閉じます。

デザイナからウィンドウ スタイルを変換するには
フォーム デザイナが開かれている Visual Studio IDE では、[プロパティ] を表示します。フォームを右クリックし、[プロパティ] をクリックします。[ウィンドウ スタイル] セクションで、MinimizeBox を [False] に設定します。

ウィンドウ スタイルをコードで変換するには
フォームの読み込み関数に次のコード行を追加するだけです。

//C#
this.MinimizeBox = false;

'VB
Me.MinimizeBox = False

4.4. Microsoft .NET Compact Framework に対応する複数フォーム アプリケーション フレームワークの作成方法を教えてください。
次の記事では、各開発者の .NET Compact Framework ベースのアプリケーションに対して、効率的なユーザー インターフェイス エンジンを作成する方法が示されています。
https://msdn.microsoft.com/library/en-us/dnnetcomp/html/netcfuiframework.asp (英語)

4.5. Microsoft .NET Compact Framework ベースのアプリケーションのフォーム読み込みパフォーマンスを向上させる方法を教えてください。
次に示す単純な最適化の手法を使用して、.NET Compact Framework Windows フォーム アプリケーションによる読み込みにかかる時間を削減する方法を習得します。
https://msdn.microsoft.com/library/en-us/dnnetcomp/html/netcfimproveformloadperf.asp (英語)

4.6. フォームのスタイルを実行時に変更する方法を教えてください。
次のクイックスタートでは、Pocket PC アプリケーションでフォームの外観や動作を変更するコード ステートメントについて説明します。
https://www.gotdotnet.com/japan/quickstart/CompactFramework/doc/ppcformproperties.aspx

4.7. フォームのコンテンツをスクロールする方法を教えてください。
このクイックスタートでは、水平および垂直方向のスクロール バー コントロールを使用してフォームのイメージを横や縦にスクロールする方法を示します。https://www.gotdotnet.com/japan/quickstart/CompactFramework/doc/scrolling.aspx

4.8. フローティング フォームの作成方法を教えてください。フォームが常に全画面表示のようになります。
境界線付きの トップレベル Forms は、常に全画面表示になり、移動したりサイズを変更したりすることはできません。境界線のないフォームや子フォームは、移動したりサイズを変更したりすることができます。

Form.BorderStyle = BorderStyle.None を使用します。

4.9. フォームを強制的に最小化された状態にしておく方法を教えてください。
この FAQ の「6.6. フォームを強制的に最小化された状態にしておく方法を教えてください。」を参照してください。

4.10. 多数のコントロールが付いているスマート デバイス フォームがあります。実行時に "NotSupportedException" が発生するのはなぜですか。
フォームに多数のコントロールがある場合、アプリケーションを実行したときに NotSupportedException が発生する可能性があります。デバッガで実行している場合は、多くの場合、フォームのコンストラクタ内の InitializeComponent() への呼び出しから例外がスローされたことが判明します。
この場合の一般的な原因としては、Compact Framework CLR に、メソッド単位の JIT コードは 64 KB というハード リミットがあることが考えられます。つまり、CLR が IL をメソッド (この場合、InitializeComponent メソッド) に対して変換する場合は、その結果のネイティブ コードは 64 KB 未満になる必要があります。結果のネイティブ コードがこれを超える場合、NotSupportedException がスローされます。(たとえば、F5 キーを使用して) デバッガで実行中の場合、および (Ctrl + F5 キーを使用して) デバッガなしで実行中の場合に、例外が表示される可能性もあります。これは、実行時に生成される追加コードがデバッガに必要とされるため、JIT コードのサイズが上限の 64 KB に近くなった場合に発生することがあります。

JIT コードのサイズはプロセッサ ファミリの間で異なるため (たとえば、多数の Pocket PC デバイスでは ARM 命令が使用されますが、エミュレータでは x86 命令が使用されます)、この例外がエミュレータ上ではなくデバイス上に (またはこの逆で) 発生する可能性があります。

この上限に達しない範囲であれば、フォーム上に配置できるコントロールの数についての "厳重な" 制約はありません。これは、デザイナが生成するコードの量がコントロールによって異なるためです。たとえば、Button コントロールは、通常、コントロールのプロパティの設定に応じて TabControl よりも少ないコードを生成します。ListBox や TreeView コントロールなど、コレクションを保持するコントロールは、プロパティ グリッドでビルダを使用してコントロールのコレクションを設定する場合に、非常に多くのコードを生成する可能性があります。また、(Localizable プロパティが True に設定されている場合) ローカライズされたフォーム上のコントロールは、ローカライズされていないフォームよりも多くのコードを生成します。これは、InitializeComponent で生成されたコードが、ハードコーディングされた値を使用するのではなく、リソース ファイルの値に基づいてプロパティを設定するためです。

この問題に遭遇した場合に使用できる手法をいくつか以下に示します。

  • 単一のフォームを複数のフォームに分割します。1 つのフォーム上に多数のコントロールを配置すると、フォームの読み込みとアプリケーションの起動時間に悪影響を与えます。可能な場合は、該当する UI を 2 つか 3 つのフォームに分割します。
  • デザイン時のビルダを使用してサイズの大きい内部コントロール コレクションを設定しないようにします。たとえば、多数のノードを TreeView コントロールの Nodes コレクションに追加する場合、この処理によって InitializeComponent メソッドに多数の追加コードが追加されます。可能な場合は、コードを移動して、コレクションをコンストラクタまたは Form.Load イベント ハンドラに挿入します。この方法は、デザイナを使用した場合に比べてコレクションの編集が簡単ではなくなるという短所がありますが、生成されるコードのサイズの削減には役立ちます。
  • InitializeComponent メソッドに独自のコードを追加しないようにします。このメソッドでは、デザイナによって生成されたコードに対して変更を加えたり追加を行うことがサポートされないため、これは一般的に推奨できるガイドラインです。デザイナによって生成されたコードに対して変更を加えたり追加を行うと、デザイナでも予測不可能な動作が引き起こされる可能性があります。フォームに独自のカスタム起動コードを追加する場合は、コンストラクタまたは Form.Load イベント ハンドラに対して行う必要があります。
  • 類似したコントロールは実行時にプログラムによって初期化します。たとえば、Text プロパティと Position プロパティだけが異なる 12 個の Button コントロールを作成する場合は、12 個のすべてのコントロールをデザイナによって生成されるコードで作成して初期化するのではなく、ループによって作成および初期化することを検討します。また、この処理を行うために独自のコードを記述する場合は、そのコードを InitializeComponent には入れないようにします。

InitializeComponent を変更した場合の副次的な悪影響として、外部のコードでインスタンス化された任意のコントロールがフォーム デザイナを使用して編集できなくなることがあります。また、InitializeComponent のコードを手動で編集する場合は、変更したコードをデザイナが適切に解釈できなくなり、デザイナにフォームが表示されなくなる可能性があります。これらの理由により、ここに示した InitializeComponent を変更しない回避策が推奨されます。

4.11. フォームを閉じる適切なメソッドは Application.Exit と Form.Close のどちらですか。
Application.Exit は、Win32 の PostQuitMessage() のような強制終了です。このメソッドは、すべてのメッセージ ポンプを中止し、呼び出し履歴をアンワインドし、システムに実行を返します。

Windows (Win32 または .NET) でアプリケーションを終了するための正しい方法は、アプリケーションのメイン アプリケーション ウィンドウを閉じる (つまり、Form.Close を使用する) ことです。メイン メッセージ ポンプが終了した後にまだ存在するウィンドウは、すべて手動で閉じる必要があります。アプリケーションを終了する前に、目的の動作に応じて Form.Close または Form.Dispose を呼び出してウィンドウを閉じることによって、ウィンドウを閉じるようにすることをお勧めします。.NET Framework の OnClosing() は、Win32 の WM_DESTROY ではなく WM_CLOSE のマネージ バージョンであることを覚えておく必要があります。

また、form.Close() を使用する場合は、アプリケーションで OnClosing または OnClosed イベントを処理することによって、項目のクリーンアップやファイルを閉じる操作などの処理を行う機会ができます。アプリケーションを Application.Exit を使用して中断した場合は、これらのイベントは呼び出されません。

4.12. Windows Mobile 2003 for Smartphone で [中止]、[再試行]、および [Fail] のボタンのセット、または [はい]、[いいえ]、[キャンセル] ボタンのセット、または既定のボタンとして 3 番目のボタンが付いた MessageBox を表示すると、結果として NotSupportedException が発生します。これはなぜですか。

Windows Mobile 2003 for Smartphone は、ボタンが 1 つまたは 2 つのメッセージ ボックスしかサポートしません。

4.13. Pocket PC の [スタート] メニューの最近使用したアプリケーション (MRU) の一覧にアイコンを表示する方法を教えてください。

\windows\start menu\programs の下の任意の場所にアプリケーションへのショートカットを作成します。このショートカットからアプリケーションを起動すると、そのアプリケーションのアイコンが MRU リストに表示されます。

4.14. フォームを画面中央に配置する方法を教えてください。

全画面表示ではないフォームを表示するには、そのフォームの FormBorderStyle プロパティが FormBorderStyle.None に設定されていることを確認します。フォームを画面中央に表示するには、フォームの FormLoad イベント ハンドラに次のコードを追加します。まず FormBorderStyle を FormBorderStyle.None に設定してから、次のコードを記述します。

//c#
Rectangle screen = Screen.PrimaryScreen.Bounds;
this.Location = new Point((screen.Width - this.Width) / 2, (screen.Height - this.Height ) / 2);

'VB
Dim theScreen As Rectangle
theScreen = Screen.PrimaryScreen.Bounds()
Me.Location = New Point((theScreen.Width - Me.Width) / 2, (theScreen.Height - Me.Height) / 2)

Top of Page ページのトップへ

5. グラフィカル ユーザー インターフェイス (GUI) : 全般

5.1. イメージ ボタンまたは複数行のテキスト ボタンの作成方法を教えてください。
イメージ ボタンまたは複数行のテキスト ボタンを作成するには、カスタム コントロールが必要です。カスタム コントロールは、任意の必要なカスタム データを使用してボタンの描画を継承できます。カスタム コントロールの作成の詳細については、次のリンクを参照してください。

https://msdn.microsoft.com/library/en-us/dnnetcomp/html/customctrlscompactfx.asp (英語)

次のクイックスタートでは、イメージ ボタンの作成方法が説明されています。
https://www.gotdotnet.com/japan/quickstart/CompactFramework/doc/picturebutton.aspx

5.2. .NET Compact Framework では TextBox.AcceptsReturn はどのように動作しますか。
AcceptsReturn は false に設定できますが、これは常に true として機能します。Enter キー を使用して特定のボタンをアクティブにする必要がある場合は、TextBox からクラスを派生し、KeyPress イベントが発生したときの Enter キーに対するイベント処理コードを指定できます。

5.3. データが ComboBox に読み込まれると SelectedIndexChanged イベントがトリガされないのはなぜですか。
この問題は既に確認されており、.NET Compact Framework の将来のバージョンで対応される予定です。

5.4. Show と ShowDialog の相違点は何ですか。
ShowDialog はフォームをモーダルとして表示します。つまり、これはブロッキング関数呼び出しであり、フォームが閉じられるまで値を返すことはありません。このメソッドは、閉じた状態を指定する DialogResult 列挙型を返します。

Show は、コントロールを表示する非ブロッキング関数であり、結果に関係なく値を直ちに返します。コントロールの表示は、Visible プロパティを true に設定した場合と同等に機能します。Show メソッドを呼び出すと、Hide メソッドが呼び出されるまで Visible プロパティは値 true を返します。

5.5. ContextMenu の区分線を作成できないのはなぜですか。
ContextMenu コントロールに ContextMenu 項目を追加した後に、その ContextMenu 項目を区分線に設定すると、NotSupportedException がスローされるというバグが既に確認されています。このバグの問題点は、メニュー項目が ContextMenu に追加され、その ContextMenu の親としてコントロールが設定された後では、そのメニュー項目を区分線としてマーク (変更) することができないという制約が、WinCE にあることです。Visual Studio 2003 では、デザイナがデバイス プロジェクトのコードを分割すると、この問題の原因となるデスクトップと同様の状態になります。この対処方法としては、InitilizeComponent の外部の別のメソッド内に ContextMenu を追加することが考えられます。

5.6. 実行時に ImageList を ToolBar に割り当ててもイメージが表示されないのはなぜですか。
ImageList は、通常、フォームの読み込み関数で ToolBar に割り当てることができますが、ToolBar ボタンのイメージ インデックスを再適用したことを再度確認します。ネイティブな ToolBar コントロールでは、ToolBar の ImageList の設定前に ToolBar ボタンのイメージ インデックスを設定することはサポートされていません。

5.7. 待機中のカーソルの設定方法を教えてください。
カーソルを待機中のカーソルに変更するコードは、次のとおりです。

//C#
Cursor.Current = Cursors.WaitCursor;

'VB
Cursor.Current = Cursors.WaitCursor

カーソルをデフォルトに変更するコードは、次のとおりです。

//C#
Cursor.Current = Cursors.Default;

'VB
Cursor.Current = Cursors.Default

5.8. メニュー項目にアンパサンド (&) を表示する方法を教えてください。
この機能は、現在 .NET Compact Framework ではサポートされていません。"&&" を使用しても、メニュー項目テキストにアンパサンドは表示されません。

5.9. Microsoft .NET Compact Framework ベースのアニメーション コントロールの作成方法を教えてください。
次の記事では、.NET Compact Framework ベースのアニメーション コントロールの作成方法を示します。
https://www.microsoft.com/japan/msdn/net/compactframework/animationcontrol.asp

5.10. .NET Compact Framework のカスタム コントロールの作成方法を教えてください。
.NET Compact Framework のコントロールを作成する方法を習得することにより、.NET Framework 上でコントロールを作成するスキルを増やしてください。次の記事には、カスタム コントロールのコード サンプルも含まれています。
https://msdn.microsoft.com/library/en-us/dnnetcomp/html/customctrlscompactfx.asp (英語)

5.11. Microsoft .NET Compact Framework ベースのイメージ ボタンの作成方法を教えてください。
次の記事では、.NET Compact Framework ベースのイメージ ボタンを作成する方法が説明されています。
https://www.microsoft.com/japan/msdn/net/compactframework/ImageButton.asp

5.12. Microsoft .NET Compact Framework の MessageWindow クラスの使用方法を教えてください。
.NET Compact Framework の MessageWindow クラスを使用して NotifyIcon を作成する方法を習得します。
https://msdn.microsoft.com/library/en-us/dnnetcomp/html/messagewindow.asp (英語)

次のクイックスタートでは、Rectangle 構造として定義されたカスタム コントロール内がマウス ポインタによってクリックされるか、Panel コントロール内がマウスによってクリックされると、MessageWindow を使用してメッセージがフォームに送信されます。
https://www.gotdotnet.com/japan/quickstart/CompactFramework/doc/messagewindow.aspx

5.13. DataGrid に行と列を追加する方法を教えてください。
次のクイックスタートでは、実行時に DataGrid コントロールの行と列を追加および削除する方法を説明します。
https://www.gotdotnet.com/japan/quickstart/CompactFramework/doc/datagridadding.aspx

5.14. DataGrid でセル編集を実装する方法を教えてください。
.NET Compact Framework の DataGrid コントロールは、完全な .NET Framework の DataGrid コントロールのほとんどすべての機能を提供します。.NET Compact Framework バージョンの DataGrid で大きく異なる点は、実行時に DataGrid のセルを編集できないということです。次のクイックスタートでは、セルをプログラムで編集する 1 つの方法を示しています。
https://www.gotdotnet.com/japan/quickstart/CompactFramework/doc/datagridediting.aspx

5.15. DataGrid の DataSource を設定する方法を教えてください。
.NET Compact Framework の DataGrid コントロールは、完全な .NET Framework の DataGrid コントロールのほとんどすべての機能を提供します。.NET Compact Framework バージョンで大きく異なる点は、コントロールの DataSource を DataSet に設定できないことです。
https://www.gotdotnet.com/japan/quickstart/CompactFramework/doc/datagrid.aspx

5.16. DataGrid の列を並べ替える方法を教えてください。
.NET Compact Framework の DataGrid コントロールは、完全な .NET Framework の DataGrid コントロールのほとんどすべての機能を提供します。.NET Compact Framework バージョンの DataGrid で大きく異なる点は、実行時に列を並べ替えることができないということです。
https://www.gotdotnet.com/japan/quickstart/CompactFramework/doc/datagridsorting.aspx

5.17. ListView の項目を並べ替える方法を教えてください。
.NET Compact Framework は、ListView.Sort メソッドをサポートしていませんが、項目を並べ替えることはできます。次のクイックスタートでは、IComparable インターフェイスの実装を定義して、ArrayList.Sort メソッドで使用します。
http://samples.gotdotnet.com/quickstart/CompactFramework/doc/listviewsort.aspx (英語)

5.18. InputPanel コンポーネント (SIP) の使用方法を教えてください。
次のクイックスタートでは、Pocket PC でソフト入力パネル (SIP) を有効および無効にする方法、および SIP が表示されたときのフォーム領域の変化に対応するためにタブ コントロールのサイズを変更する方法について説明します。
https://www.gotdotnet.com/japan/quickstart/CompactFramework/doc/inputpanel.aspx

複数のフォームは同じ InputPanel オブジェクトを共有する必要があります。これは、メイン フォームで InputPanel を作成し、後続のフォームにこの InputPanel を渡すか、SIP を利用する必要があるその他のフォームに複数の SIP コントロール メソッドまたはプロパティを公開することによって実行できます。

5.19. カスタム イベントの作成方法を教えてください。
次のクイックスタートでは、ダブルクリック イベントを実装するための Button クラスの派生方法と、メソッドのオーバーライド方法について説明します。このカスタム イベントは、SystemInformation.DoubleClickTime 値の範囲内でクリックが 2 回行われた場合に発生します。SystemInformation.DoubleClickTime 値は、有効なダブルクリックのマウス クリックの間隔として見込まれているミリ秒数を示します。
https://www.gotdotnet.com/japan/quickstart/CompactFramework/doc/btndclick.aspx

.NET Compact Framework では、基本 Windows.Forms.Control クラスを含むコントロールの OnEnter メソッドと OnLeave メソッドはサポートされていません。ただし、Control.OnMouseMove メソッドはサポートされているため、このメソッドと Control.Capture プロパティを使用して、マウスがコントロールの内部と外部のどちらにあるかを判断できます。
https://www.gotdotnet.com/japan/quickstart/CompactFramework/doc/enterleave.aspx

5.20. オーナー描画リスト ボックスの作成方法を教えてください。
.NET Compact Framework を使用してオーナー描画リスト ボックスを作成できます。.NET Compact Framework ではリスト ボックスや他のコントロールの DrawMode、DrawItem、およびその他の描画メンバをサポートしていませんが、その機能をプログラムすることはできます。次のクイックスタートでは、オーナー描画リスト ボックスを作成するためのカスタム コントロール クラスを提供し、そのコントロールをフォントを選択するためのリスト ボックスとして実装します。
https://www.gotdotnet.com/japan/quickstart/CompactFramework/doc/ownerdrawnlistbox.aspx

5.21. true/false チェック ボックスの作成方法を教えてください。
次のクイックスタートでは、Windows.Forms.CheckBox コントロールの機能を拡張し、True/False チェック ボックスを作成します。
https://www.gotdotnet.com/japan/quickstart/CompactFramework/doc/tfcheckbox.aspx

5.22. InputPanel.Enabled = true と設定すると例外が発生するのはなぜですか。
InputPanel コンポーネントを使用する場合は、MainMenu コントロールがフォーム上にあり、そのフォームが画面に表示される必要があります。

5.23. カスタム コントロールが親のフォントを自動的に継承しないのはなぜですか。
この動作は、.NET Compact Framework ではサポートされていません。

5.24. 新しいテキストを手動で入力すると、NumericUpDown コントロールと DomainUpDown コントロールがそれぞれの ValueChanged イベントと SelectedItemChanged イベントを発生させないのはなぜですか。
ValueChanged イベントと SelectedItemChanged イベントは、ユーザーがコントロールの値をコードで変更した場合だけ発生するか、上向きの矢印と下向きの矢印を経由して発生します。これらのイベントは、ユーザーがコントロールにテキストを入力しても発生しません。

5.25. NumericUpDown コントロールの値が、設定された Increment 値以外の値ずつ増加するのはなぜですか。
上方向キーまたは下方向キーを押した後に表示される次の値がインクリメントの倍数ではない場合は、次のインクリメントの倍数が見つかるまで、その方向での数値の変化 (増加または減少) を続けます。

5.26. StatusBar コントロールをフォームの任意の場所に配置できません。いつも下端に配置されてしまいますが、これはなぜですか。
StatusBar コントロールは、常にフォームの下端にドッキングされます。このコントロールのサイズは変更できません。

5.27. カスタム コントロールが親の背景色を自動的に継承しないのはなぜですか。
この動作は、.NET Compact Framework ではサポートされていません。これに対処するには、OnParentChanged メソッドをオーバーライドし、色を手動で設定します。

//C#
protected override void OnParentChanged(EventArgs e)
{
base.OnParentChanged(e);
this.BackColor = Parent.BackColor;
}

'VB
Protected Overrides Sub OnParentChanged(ByVal e As EventArgs)
MyBase.OnParentChanged(e)
Me.BackColor = Parent.BackColor
End Sub 'OnParentChanged

5.28. NumericUpDown コントロールでは、小数値は受け入れられますが、2^16 を超える数値は使用されないようです。これはなぜですか。
数値コントロールである NumericUpDown は小数値を受け入れますが、.NET Compact Framework ではこのコントロールの値は整数として処理されます。たとえば、10.23 を指定すると、コントロールによって 10 として評価されます。また、このコントロールは、Pocket PC に実装された場合は 16 ビットの符号付き整数を超える値を受け入れません。

5.29. DomainUpDown コントロールにテキストを入力し、このコントロールで関連項目を選択することができません。これはなぜですか。
DomainUpDown コントロールは、(完全な .NET Framework とは異なり) コントロールに入力されたテキストの検証を実行しません。新しいテキストを入力してから上方向矢印または下方向矢印を押すと、変更を行う前に次の項目であった項目に移動します。

5.30. OpenFileDialog がマイ ドキュメント フォルダに制限されているのはなぜですか。
OpenFileDialog の初期ディレクトリは、マイ ドキュメント フォルダまたはその任意のサブフォルダに制限されています。この制限は、ユーザーが各自のファイルを標準のディレクトリの下に編成できるようにするため、Pocket PC オペレーティング システムによって設定されているものです。

5.31. メニューを使用しないで SIP (InputPanel) をアクティブにする方法を教えてください。
SIP は、次のように関数 "SipShowIM" に P/Invoking を実行することによってアクティブにすることができます。

//C#
using System.Runtime.InteropServices;

const uint SIPF_OFF = 0x0;
const uint SIPF_ON = 0x1;

[DllImport("coredll.dll")]
private extern static void SipShowIM(uint dwFlag);

'VB
Imports System.Runtime.InteropServices

Const SIPF_OFF As Integer = &H0;
Const SIPF_ON As Integer = &H1;

<DllImport("coredll.dll")> _
Private Shared Function SipShowIM(ByVal dwFlag As Integer) As Integer
End Function

5.32. TreeView 内のすべてのノードにサブノードを追加する方法を教えてください。

すべてのノードへのサブノードの追加は、TreeView 内のすべてのノードに対して反復処理を行い、各ノードに新しいノードを追加することによって行うことができます。

//C#
foreach (TreeNode node in treeView1.Nodes)
{
    node.Nodes.Add(new TreeNode("SubNode"));
}

'VB
Dim node As TreeNode
For Each node In  treeView1.Nodes
    node.Nodes.Add(New TreeNode("SubNode"))
Next node

5.33. DataGrid 内の行または列の数を確認する方法を教えてください。

DataGrid 内の行数と列数はデータ ソース自体から確認できます。以下に例を示します。

//C#
DataSet ds = new DataSet();

int numRows = ds.Tables[0].Rows.Count;
int numCols = ds.Tables[0].Columns.Count;

'VB
Dim ds As New DataSet()

Dim numRows As Integer = ds.Tables(0).Rows.Count
Dim numCols As Integer = ds.Tables(0).Columns.Count

DataGrid が DataView に連結されている場合は、DataView.Count を使用することもできます。

5.34. オーナー描画 Listbox の作成方法を教えてください。

.NET Compact Framework クイックスタート チュートリアルの「イベントの実装」のトピックを参照してください。

https://www.gotdotnet.com/japan/quickstart/CompactFramework/doc/btndclick.aspx

Top of Page ページのトップへ

6. 相互運用性とネイティブ コード

6.1. ネイティブ DLL 内にある関数を呼び出す方法を教えてください。
ネイティブ DLL 関数は、Platform Invoke (P/Invoke) によって呼び出すことができます。この操作の手順と、この技法の詳細については、次の記事を参照してください。

6.2. P/Invoke の宣言を支援するために dumpbin.exe を使用する方法を教えてください。
この FAQ のトピック「6.1. ネイティブ DLL 内にある関数を呼び出す方法を教えてください。」を参照してください。

6.3. Microsoft .NET Compact Framework ベース アプリケーションのアンマネージ関数の記述方法を教えてください。
この FAQ のトピック「6.1. ネイティブ DLL 内にある関数を呼び出す方法を教えてください。」を参照してください。

6.4. GetTickCount に P/Invoke を実行する方法を教えてください。
GetTickCount 関数の実行内容は Environment.TickCount の実行内容とまったく同じであるため、GetTickCount 関数に P/Invoke を実行する必要はありません。
この FAQ のトピック「7.2. 正確な時間間隔を計算する方法を教えてください。」を参照してください。

6.5. デバイスが使用できるメモリの量を判断する方法を教えてください。
GetSystemMemoryDivision 関数と GlobalMemorySystem 関数に P/Invoke を実行して、メモリがどのようにプログラムとストレージに分割および割り当てられているかを判断できます。

パラメータの定義については、API 参照ドキュメントを参照してください。

//C#
using System.Runtime.InteropServices;

public class MEMORYSTATUS
{
public uint dwLength;
public uint dwMemoryLoad;
public uint dwTotalPhys;
public uint dwAvailPhys;
public uint dwTotalPageFile;
public uint dwAvailPageFile;
public uint dwTotalVirtual;
public uint dwAvailVirtual;
}

[DllImport("CoreDll.dll")]
public static extern void GlobalMemoryStatus
(
MEMORYSTATUS lpBuffer
);

[DllImport("CoreDll.dll")]
public static extern int GetSystemMemoryDivision
(
ref uint lpdwStorePages,
ref uint lpdwRamPages,
ref uint lpdwPageSize
);

public void Test()
{
uint storePages = 0;
uint ramPages = 0;
uint pageSize = 0;
int res = GetSystemMemoryDivision(ref storePages, ref ramPages, ref pageSize);

MEMORYSTATUS memStatus = new MEMORYSTATUS();
GlobalMemoryStatus(memStatus);
}

'VB
Imports System.Runtime.InteropServices

Public Structure MEMORYSTATUS
Public dwLength As UInt32
Public dwMemoryLoad As UInt32
Public dwTotalPhys As UInt32
Public dwAvailPhys As UInt32
Public dwTotalPageFile As UInt32
Public dwAvailPageFile As UInt32
Public dwTotalVirtual As UInt32
Public dwAvailVirtual As UInt32
End Structure 'MEMORYSTATUS

<DllImport("coredll.dll")> _
Private Shared Sub GlobalMemoryStatus(ByRef ms As MEMORYSTATUS)
End Sub

<DllImport("CoreDll.dll")> _
Public Shared Function GetSystemMemoryDivision( _
ByRef lpdwStorePages As UInt32, _
ByRef lpdwRamPages As UInt32, _
ByRef lpdwPageSize As UInt32) As Integer
End Function

Public Shared Sub Test()
Dim storePages As UInt32
Dim ramPages As UInt32
Dim pageSize As UInt32
Dim res As Integer = GetSystemMemoryDivision(storePages, ramPages, pageSize)

Dim memStatus As New MEMORYSTATUS
GlobalMemoryStatus(memStatus)
End Sub 'Test

6.6. フォームを強制的に最小化された状態にしておく方法を教えてください。

  1. フォームの OnGotFocus メソッドをオーバーライドします。
  2. フォームのウィンドウを検索します。
  3. ShowWindow(hwnd, SW_MINIMIZE) を呼び出して、フォームを強制的に最小化します。
//C#
using System.Runtime.InteropServices;

[DllImport("CoreDll")]
public static extern IntPtr FindWindow(string className,string WindowsName);

[DllImport("CoreDll")]
public static extern bool ShowWindow(IntPtr hwnd,int nCmdShow);

const int SW_MINIMIZE = 6;

protected override void OnGotFocus(EventArgs e)
{
IntPtr hwnd = FindWindow(null, this.Text);
ShowWindow(hwnd, SW_MINIMIZE);
base.OnGotFocus(e);
}

'VB
Imports System.Runtime.InteropServices

<DllImport("CoreDll")> _
Public Shared Function FindWindow(ByVal className As String, ByVal WindowsName As String) As IntPtr
End Function

<DllImport("CoreDll")> _
Public Shared Function ShowWindow(ByVal hwnd As IntPtr,ByVal nCmdShow As Integer) As Boolean
End Function

Private Const SW_MINIMIZE As Integer = 6

Protected Overrides Sub OnGotFocus(ByVal e As EventArgs)
Dim hwnd As IntPtr = FindWindow(Nothing, Me.Text)
ShowWindow(hwnd, SW_MINIMIZE)
MyBase.OnGotFocus(e)
End Sub 'OnGotFocus

6.7. .NET Compact Framework で Platform Invoke (P/Invoke) の実行中に型をマーシャリングする方法を教えてください。
この FAQ のトピック「6.1. ネイティブ DLL 内にある関数を呼び出す方法を教えてください。」を参照してください。

6.8. コントロールまたはフォームのハンドル (HWND) の取得方法を教えてください。
コントロールの HWND ハンドルにアクセスできる P/Invoke を使用する方法がいくつかあります。これらの方法のうち 2 つを次に示します。1 つは GetCapture を、もう 1 つは FindWindow を使用します。

//C#
[DllImport("coredll.dll"]
public static extern IntPtr GetCapture();

[DllImport("coredll.dll")]
public static extern IntPtr FindWindow(String lpClassName, String lpWindowName);

this.Text = "FindMe";
IntPtr hwnd1 = FindWindow(null, "FindMe");

this.Capture = true;
IntPtr hwnd2 = GetCapture();
this.Capture = false;

'VB
Public Shared Function GetCapture() As IntPtr
End Function

Public Shared Function FindWindow(ByVal lpClassName As String, ByVal lpWindowName As String) As IntPtr
End Function

Me.Text = "FindMe"
Dim deskWin As IntPtr = FindWindow(Nothing, "FindMe")

Me.Capture = True
Dim hwnd As IntPtr = GetCapture()
Me.Capture = False

6.9. パフォーマンス カウンタ関数の使用方法を教えてください。
QueryPerformanceFrequency 関数と QueryPerformanceCounter 関数を使用して、高分解能のタイミング ソリューションを作成できます。これらの関数は OEM 固有であり、実装されていない場合は、通常、デフォルトで GetTickCount 関数が設定されます。したがって、これらの関数を使用することにより、タイマが実装されている場合、そのタイマが可能な限り正確かどうかが常に確認されます。この関数は、実装されると、GetTickCount または Environment.TickCount よりも大幅にタイマの精度を向上します。実際には、GetTickCount は Environment.TickCount によって呼び出されます。

パフォーマンス カウンタが GetTickCount のインスタンスである場合、QueryPerformanceFrequency はタイマ頻度として 1000 を設定します。これらの関数が実装されていない場合は、0 が返されます。 次のコードは、これらの関数の使用方法を示します。

//C#
[DllImport("CoreDll.dll")]
public static extern int QueryPerformanceFrequency(ref Int64 lpFrequency);

[DllImport("CoreDll.dll")]
public static extern int QueryPerformanceCounter(ref Int64 lpPerformanceCount);

private void TestTimer()
{
System.Int64 freq = 0;
if (QueryPerformanceFrequency(ref freq) != 0)
  {
System.Int64 count1 = 0;
System.Int64 count2 = 0;

if (QueryPerformanceCounter(ref count1) != 0)
    {
System.Threading.Thread.Sleep(1200);
QueryPerformanceCounter(ref count2);
System.Int64 time_ms = (count2 - count1) * 1000 / freq;
    }
  }
}

'VB
<DllImport("CoreDll.dll")>
Public Shared Function QueryPerformanceFrequency(ByRef lpFrequency As Int64) As Integer
End Function

Public Shared Function QueryPerformanceCounter(ByRef lpPerformanceCount As Int64) As Integer
End Function

Private Sub TestTimer()
Dim freq As System.Int64 = 0

If QueryPerformanceFrequency(freq)  0 Then
Dim count1 As System.Int64 = 0
Dim count2 As System.Int64 = 0

If QueryPerformanceCounter(count1)  0 Then
System.Threading.Thread.Sleep(1200)
QueryPerformanceCounter(count2)
Dim time_ms As System.Int64 = (count2 - count1) * 1000 / freq
End If
End If
End Sub 'TestTimer

6.10. P/Invoke を使用したマーシャリング型には、どのような制限がありますか。

  • 戻り値

    • 32 ビット以下の値型である必要がある。
    • 浮動小数点型ではない。
  • パラメータ

    • blittable 型のマーシャリングだけをサポートする。

      • blittable 型 : マネージとネイティブの両方のメモリで同じ表現になる。

      • 非 blittable 型 : メモリ変換が必要である。

      • blittable 型のみであるため、すべてのオブジェクトは固定され、コピーされることはない。

        • 例外 : VB.NET での String ByVal の引き渡し。
      • 入れ子になったオブジェクトのマーシャリングは、メモリ変換 (非 blittable 型) が必要なため、行うことができない。

    • 32 ビット以下の値型である必要がある。

      • 値はスタックで引き渡される。
      • 例外 : float32
    • 参照

      • blittable 参照型を引き渡す。
      • 参照を値型に引き渡す。
      • この方法は float32 を引き渡す方法である。
    • 値型の配列を引き渡すことができる。

      • ネイティブでは、最初のオブジェクトへのポインタを取得し、オブジェクトは予測どおり順次配置される。
    • String は特別で、char 配列を引き渡す : 変更不可。

    • StringBuilder は特別で、char 配列を引き渡す : 変更可能 (長さは個別に引き渡す必要がある)。

    • メモ : C# bool は、8 ビットで Win32 BOOL と等価ではない。

    • 配置 : 既定のコンパイラ配置 (4 バイト)。

    • Marshal.GetLastWin32Error は GetLastError() セマンティクスをサポートする。

    • サポート対象外

      • MarshalAs : 非 blittable 型はサポートされない。
      • StructLayout : レイアウトを変更できない。
      • デリゲート。
      • DateTime。
      • 既定の呼び出し規約だけサポートされる。

6.11. GetLastError に P/Invoke を実行すると、不適切なリターン コードが返されるのはなぜですか。
一般的に、Windows GetLastError() API に P/Invoke を実行するという方法は推奨されません。これは、CLR によって作成されたネイティブ呼び出しが、最後のエラー コードを変更した可能性があるためです。代わりに、P/Invoke 宣言をマークして、返されたエラー コードを保存し、System.Runtime.InteropServices.Marshal.GetLastWin32Error() メソッドを呼び出してエラー コードを取得します。

using System.Runtime.InteropServices;

[DllImport("coredll.dll", SetLastError=true)]
int myFoo(...);

Foo(...)
{
    int rc = myFoo(...);

    if (rc == false)
    {
        throw new Win32Exception(Marshal.GetLastWin32Error(), "Foo failed");
    }
}

6.12. ネイティブ関数に渡すことができる引数の数に制限はありますか。
制限はあります。.NET Compact Framework バージョン 1 での上限は 12 です。

6.13. ネイティブ関数に P/Invoke を実行すると "NotSupportedException" が発生するのはなぜですか。
よくある原因として、次の 3 つが考えられます。

  • マネージ コード内の宣言が間違っている。
  • .NET Compact Framework が意図している処理をサポートしていない。
  • dll 名がエクスポート時に破壊された。

次の点を確認します。

  • .NET Compact Framework P/Invoke 制限事項に違反していないか。
  • 引数の中にメモリの事前割り当てが必要なものがないか (つまり、引数がポインタではないか)。その場合は、既存の変数に参照を渡す必要がある。
  • エクスポートした関数の名前が正しいか。DUMPBIN.EXE を使用して確認できる。
  • 引き渡そうとしている引数の数が多すぎないか。

たとえば、上記の 2 番目の点に該当するのは、RegOpenKey API が最後のパラメータとして HKEY へのポインタを必要とする場合です。この場合は、宣言と呼び出しを次のように行います。

//C#
[DllImport("coredll.dll", SetLastError=true)]
public static extern long RegOpenKey(
    IntPtr hkey,
    string lpSubKey,
    ref IntPtr hkeyResult
);

public long OpenMySubKey()
{
    IntPtr hkey = IntPtr.Zero;
    return RegOpenKey(HKEY_CLASSES_ROOT, "MySubKey", ref hkey);
}

'VB
<DllImport("coredll.dll", SetLastError:=True)> _
Public Shared Function RegOpenKey(ByVal hkey As IntPtr, ByVal lpSubKey As String, ByRef hkeyResult As IntPtr) As Long
End Function

Public Function OpenMySubKey() As Long
    Dim hkey As IntPtr = IntPtr.Zero
    Return RegOpenKey(HKEY_CLASSES_ROOT, "MySubKey", hkey)
End Function 'OpenMySubKey

6.14. byte[] を IntPtr に変換する方法を教えてください。
バイト配列に対応する IntPtr にアクセスする方法はいくつかあります。

最初に、セーフ モード以外のコード ブロックを使用して、バイト配列へのポインタに直接アクセスする方法を示します。

//C#
unsafe
{
    byte[] test = new byte[5];
    fixed (byte* p = &test;[0])
    {
        *p = 0xff;
    }
}

GCHandle を使用してオブジェクトを固定することもできます。

//C#
using System.Runtime.InteropServices;

byte[] test = new byte[5];
GCHandle hObject = GCHandle.Alloc(test, GCHandleType.Pinned);
IntPtr pObject = hObject.AddrOfPinnedObject();

if(hObject.IsAllocated)
    hObject.Free();

'VB
Imports System.Runtime.InteropServices

Dim test(4) As Byte
Dim hObject As GCHandle = GCHandle.Alloc(test, GCHandleType.Pinned)
Dim pObject As IntPtr = hObject.AddrOfPinnedObject()
If hObject.IsAllocated Then
    hObject.Free()
End If

最後の方法として、LocalAlloc を使用してメモリのブロックを作成し、データをこのブロックにマーシャリングすることにより、これと同じ処理を行うことができます。

//C#
[DllImport("coredll.dll",SetLastError=true)]
public static extern IntPtr LocalAlloc(uint uFlags, uint uBytes);
        
[DllImport("coredll.dll",SetLastError=true)]
public static extern IntPtr LocalFree(IntPtr hMem);

[DllImport("coredll.dll",SetLastError=true)]
public static extern IntPtr LocalReAlloc(IntPtr hMem, uint uBytes, uint fuFlags);

public const uint LMEM_FIXED = 0;
public const uint LMEM_MOVEABLE = 2;
public const uint LMEM_ZEROINIT = 0x0040;

byte[] test = new byte[5];
IntPtr p = LocalAlloc(LMEM_FIXED | LMEM_ZEROINIT, (uint)test.Length);

if (p == IntPtr.Zero)
{
    throw new OutOfMemoryException();
}
else
{
    Marshal.Copy(test, 0, p, test.Length);
}

'VB
<DllImport("coredll.dll", SetLastError:=True)> _
Public Shared Function LocalAlloc(ByVal uFlags As UInt32, ByVal uBytes As UInt32) As IntPtr
End Function

<DllImport("coredll.dll", SetLastError:=True)> _
Public Shared Function LocalFree(ByVal hMem As IntPtr) As IntPtr
End Function

<DllImport("coredll.dll", SetLastError:=True)> _
Public Shared Function LocalReAlloc(ByVal hMem As IntPtr, ByVal uBytes As UInt32, ByVal fuFlags As UInt32) As IntPtr
End Function

Public Const LMEM_FIXED As Integer = 0
Public Const LMEM_MOVEABLE As Integer = 2
Public Const LMEM_ZEROINIT As Integer = &H40;

Dim test(4) As Byte
Dim p As IntPtr = LocalAlloc(Convert.ToUInt32(LMEM_FIXED Or LMEM_ZEROINIT), Convert.ToUInt32(test.Length))
If p.Equals(IntPtr.Zero) Then
    Throw New OutOfMemoryException
Else
    Marshal.Copy(test, 0, p, test.Length)
End If

6.15. ネイティブ DLL から関数を呼び出すと MissingMethodException が発生するのはなぜですか。
MissingMethodException について確認する場合、考慮する必要がある点がいくつかあります。この例外が発生した場合は、次の点を確認してください。

最新の Microsoft eMbedded Visual Tools のダウンロードについては、以下のページを参照してください。
https://www.microsoft.com/japan/msdn/vstudio/device/factsheet.asp
https://www.microsoft.com/japan/msdn/vstudio/device/datasheet.asp

Top of Page ページのトップへ

7. 全般

7.1. アプリケーションのルート ディレクトリを確認する方法を教えてください。
アプリケーションは、Reflection を利用して、アプリケーションの実行元となったディレクトリを確認し、IO.Path 名前空間を使用してそのディレクトリを簡単に変更できます。

//C#
using System.Reflection;
using System.IO;

// 次の場合は、完全なディレクトリと exe 名になります。
String fullAppName = Assembly.GetExecutingAssembly().GetName().CodeBase;

// 次の場合は、exe 名が除外されます。
String fullAppPath = Path.GetDirectoryName(fullAppName);

// 次の場合は、パスにファイル名が追加されます。
String splashImageName = Path.Combine(fullAppPath, "myfile.txt");

'VB
Imports System.IO
Imports System.Reflection

' 次の場合は、完全なディレクトリと exe 名になります。
Dim fullAppName As String = [Assembly].GetExecutingAssembly().GetName().CodeBase

' 次の場合は、exe 名が除外されます。
Dim fullAppPath As String = Path.GetDirectoryName(fullAppName)

' 次の場合は、パスにファイル名が追加されます。
Dim splashImageName As String = Path.Combine(fullAppPath, "myfile.txt")

現在実行中のアプリケーションのパスを確認する方法を習得します。Embedded Visual Basic では、アプリケーション パスの実行は、App.Path プロパティを通して使用できます。アプリケーションのパスの実行は、アセンブリの AssemblyName オブジェクトの実行を調べることによって確認できます。このオブジェクトは、アセンブリの ID を完全に記述します。https://msdn.microsoft.com/library/en-us/dncfhowto/html/HOWTOExecutingAppPath.asp (英語)

次のクイックスタートでは、アセンブリと関連付けられたデータ ファイルを含むディレクトリへのパスの指定について説明します。Windows CE .NET では、本質的にアプリケーションに対してディレクトリの現在の設定は提供されません。
https://www.gotdotnet.com/japan/quickstart/CompactFramework/doc/getappdir.aspx

7.2. 正確な時間間隔を計算する方法を教えてください。
アプリケーションには、時間間隔を決定するための 4 つの主な方法が用意されています。

  • System.Environment.TickCount
    デバイスがオンにされてから経過したミリ秒数を表す符号付き整数値を保持します。ただし、.NET Compact Framework は非決定性であるため、値は 500 ミリ秒分解能を超える精度では保証されませんが、通常、これより高い精度になります。
  • GetTickCount()
    プロパティ Environment.TickCount は GetTickCount 関数を呼び出すため、この関数に対して P/Invoking を実行することに特に利点はありません。
  • パフォーマンス モニタ
    プロファイリングの目的で使用できますが、この用途の対象として想定されているのは、リリースされているアプリケーションではありません。詳細については、この FAQ のトピック「7.5. パフォーマンス モニタの使用方法を教えてください。」を参照してください。
  • タイマ
    アプリケーションは、System.Threading.Timer を使用して特定の間隔に設定されたスレッド タイマに、デリゲートを提供できます。
  • パフォーマンス カウンタ
    QueryPerformanceCounter 関数は、OEM によって実装されている場合、設定可能な最高分解能タイマを提供することを保証します。

7.3. 埋め込まれたリソースにストリームとしてアクセスする方法を教えてください。
埋め込まれたリソースにアクセスするには、アプリケーションは単純に関連付けられたアセンブリにアクセスし、関数 GetManifestResourceStream を呼び出す必要があります。埋め込まれたリソースからビットマップを作成する場合の例を次に示します。

//C#
using System.Reflection;

Assembly asm = Assembly.GetExecutingAssembly();
Bitmap bmpSprite = new Bitmap(asm.GetManifestResourceStream("AssemblyName.FileName"));

'VB
Imports System.Reflection

Dim asm As [Assembly] = [Assembly].GetExecutingAssembly()
Dim bmpSprite As New Bitmap(asm.GetManifestResourceStream("AssemblyName.FileName"))

上記の例では、asm.GetName().Name に対する呼び出しを経由して、文字列の AssemblyName 部分を実行時に取得できます。

メモ : アセンブリ名に空白が含まれる場合は、空白はアンダースコア "_" に置き換えられ、この置き換えられた名前を使用してアクセスする必要があります。

7.4. "An unhandled exception of type 'System.Net.Sockets.SocketException' occurred in System.dll" というメッセージが表示されるのはなぜですか。
これは、.NET Compact Framework のバグです。Windows CE 上で基盤となる Secure Sockets Layer (SSL) 実装にある制限のために発生します。ただし、この問題に対する対処方法はあります。req.AllowWriteStreamBuffering を true に設定し、req.ContentLength を設定しない場合、例外が表示されなくなります。

7.5. パフォーマンス モニタの使用方法を教えてください。
パフォーマンス カウンタは、デバイスのレジストリを変更することによって作成されます。

  1. 次のレジストリ キーを作成します。"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETCompactFramework\PerfMonitor"
  2. Counters という名前のこのキー内で DWORD 型値を作成します。
  3. Counters の値を 1 に設定してパフォーマンス カウンタを有効にするか、0 に設定して無効にします。

パフォーマンス カウンタを有効にすると、アプリケーションが閉じられたときに "mscoree.stat" という名前のテキスト ファイルが作成されます。このファイルは、デバイスのルート ディレクトリ内にあります。これは、"固定長" の区切り記号付きファイルなので、Excel に直接インポートできます。

メモ : プロファイリング中には、マネージ アプリケーションを 1 つだけ実行できます。
メモ : カウンタを使用すると、パフォーマンスが 30 パーセント減速します。

7.6. アプリケーションが閉じられないようにする方法を教えてください。
アプリケーションは OnClosing メソッドをオーバーライドでき、CancelEventArgs.Cancel を true に設定して閉じる操作をキャンセルできます。

//C#
protected override void OnClosing(CancelEventArgs e)
{
e.Cancel = true;
}

'VB
Protected Overrides Sub OnClosing(ByVal e As CancelEventArgs)
e.Cancel = True
End Sub 'OnClosing

7.7. 使用中のアプリケーション内から別のアプリケーションを起動する方法を教えてください。
ネイティブ CreateProcess 関数を呼び出して 2 つ目のアプリケーションを起動し、次にネイティブ WaitForSingleObject 関数を呼び出し、2 つ目のアプリケーションが終了するまで呼び出し元のアプリケーションを一時停止できます。次のクイックスタートでは、Pocket PC 電卓を使用した場合のこのプロセスの例を示します。
https://www.gotdotnet.com/japan/quickstart/CompactFramework/doc/waitforsingleobject.aspx

7.8. .NET Compact Framework アプリケーションによって作成されるのはどのスレッドですか。
.NET Compact Framework アプリケーションによって最大 4 つまでのスレッドが作成されます。

  • メイン アプリケーション スレッド。
  • システムまたはアプリケーションによってスケジュールできるさまざまな周期タイマまたはタイム アウトを制御するために使用するスレッド。
  • (Windows XP には存在しても Windows CE には存在しない動作をメディアが感知することをシミュレートして) アクティブ TCP/IP インターフェイスに対する変更を追跡するために使用するスレッド。
  • オブジェクト Finalizers を実行するために使用するスレッド。このスレッドは、最初の終了可能オブジェクトに対してガベージ コレクションが行われるときに作成されます。

7.9. バイト配列を構造体に変換する方法を教えてください。
C++ では、クラスまたは構造体メモリ マップをファイルに保存し、これを型のキャストによってクラスに直接再読み込みするのが便利で効率的ですが、マネージ コードの性質により、これは実行できません。ただし、メモリ マップをデータとして格納するクラスを作成し、データにアクセスして設定するためにプロパティを利用することはできます。以下に例を示します。

//C#
public class MyClass
{
protected byte[] m_data = null;
// uint uiDummy
// short sDummy
  
// これは安全ではないビットなので、
// バイト配列長が 6 ではない場合は、例外をスローするか、
// アサートする必要があります。m_data = new byte[6] と設定してから
// バイトを m_data にコピーする方法では、安全性が向上しますが、
// メモリの効率は低下します。
public MyClass(byte[] bytes) {m_data = bytes;}

// uint の Get/Set
public uint uiDummy
  {
get {return BitConverter.ToUInt32(m_data, 0);}
set
    {
Buffer.BlockCopy(BitConverter.GetBytes(value),0,m_data,0,BitConverter.GetBytes(value).Length);
    }
  }

// short の Get/Set
public short sDummy
  {
get {return BitConverter.ToInt16(m_data, 4);}
set
    {
Buffer.BlockCopy(BitConverter.GetBytes(value),0,m_data,4,BitConverter.GetBytes(value).Length);
    }
  }
}

byte[] fromFile = {1,1,1,1,2,2};
MyClass myClass = new MyClass(fromFile);

uint test1 = myClass.uiDummy; // 0x1010101
short test2 = myClass.sDummy; // 0x202

myClass.sDummy = 0x0505;      // short のテスト設定
uint test4 = myClass.uiDummy; // 0x1010101
short test5 = myClass.sDummy; // 0x505

'VB
Public Class ByteClass
Protected m_data As Byte() = Nothing

' uint uiDummy
' short sDummy
' これは安全ではないビットなので、バイト配列長が 6 ではない場合は、
' 例外をスローするか、アサートする必要があります。m_data = new byte[6] 
' と設定してから、バイトを m_data にコピーする方法では、
' 安全性は向上しますが、メモリの効率は低下します。
Public Sub New(ByVal bytes() As Byte)
m_data = bytes
End Sub 'New

' uint の Get/Set
Public Property uiDummy() As UInt32
Get
Return BitConverter.ToUInt32(m_data, 0)
End Get
Set(ByVal Value As System.UInt32)
Buffer.BlockCopy(BitConverter.GetBytes(Value),0,m_data,0,BitConverter.GetBytes(Value).Length)
End Set
End Property

' short の Get/Set
Public Property sDummy() As Short
Get
Return BitConverter.ToInt16(m_data, 4)
End Get
Set(ByVal Value As Short)
Buffer.BlockCopy(BitConverter.GetBytes(Value),0,m_data,4,BitConverter.GetBytes(Value).Length)
End Set
End Property
End Class 'ByteClass

Dim fromFile As Byte() = {1, 1, 1, 1, 2, 2}
Dim testClass As New ByteClass(fromFile)

Dim test1 As System.UInt32 = testClass.uiDummy ' 0x1010101 
Dim test2 As Short = testClass.sDummy          ' 0x202
testClass.sDummy = &H505                       ' short のテスト
Dim test4 As System.UInt32 = testClass.uiDummy ' 0x1010101
Dim test5 As Short = testClass.sDummy          ' 0x505

7.10. カスタム デリゲートを作成して呼び出しに渡すことはできますか。
いいえ、.NET Compact Framework では、EventHandler メソッドしか呼び出すことはできません。これを実行するための適切なメソッドを次に示します。

//C#
public void HandleMe(object o, EventArgs e) {...}
form.Invoke(new EventHandler(form.HandleMe));

'VB
Public Sub HandleMe(o As Object, e As EventArgs)
End Sub 'HandleMe
form.Invoke(New EventHandler(AddressOf form.HandleMe))

次のコードはコンパイルされますが、適切には動作しません。

//C#
public delegate void MyHandler();
public void HandleMeBadly() {...}
form.Invoke(new MyHandler(form.HandleMeBadly));

'VB
Delegate Sub MyHandler()
Public Sub HandleMeBadly()
End Sub 'HandleMeBadly
form.Invoke(New MyHandler(form.HandleMeBadly))

7.11. Microsoft .NET Compact Framework から Phone API にアクセスする方法を教えてください。
.NET Compact Framework ベース アプリケーションから Phone API にアクセスする方法については、次の記事を参照してください。

https://msdn.microsoft.com/library/en-us/dnnetcomp/html/netcfphoneapi.asp (英語)

7.12. Pocket PC で GUID を生成する方法を教えてください。
Guid.NewGuid メソッドは新しい GUID を生成しますが、これは .NET Compact Framework ではサポートされていません。Pocket PC アプリケーション用にドキュメント化された GUID 仕様に準拠した GUID オブジェクトを生成する方法については、次の記事を参照してください。
https://msdn.microsoft.com/library/en-us/dnnetcomp/html/PPCGuidGen.asp (英語)

7.13. Pocket Outlook データを Microsoft .NET Compact Framework ベースのアプリケーションに組み込む方法を教えてください。
次の記事では、InTheHand Pocket Outlook .NET コンポーネントの使用方法が説明されています。
https://msdn.microsoft.com/library/en-us/dnnetcomp/html/inthehandpoom.asp (英語)

7.14. .NET Compact Framework 内のファイルのバージョンを確認できますか。
Visual Studio .NET 2003 のヘルプでは、「C# Programmer's Reference」で GetFileVersionInfo を P/Invoke する .NET Compact Framework の安全でないコードのサンプルを示します。このサンプルの問題点は、この機能を提供している OEM の責任であり、常に保証されるものではありません。

Assembly のバージョンを確認するために、次のように Reflection を使用できます。

//C#
using System.Reflection;

String ver = Assembly.GetExecutingAssembly().GetName().Version.ToString();

'VB
Imports System.Reflection;

Dim ver As String = [Assembly].GetExecutingAssembly().GetName().Version.ToString()

7.15. Microsoft .NET Compact Framework バックグラウンド処理の手法としては、どのようなものがありますか。
バックグラウンド処理の実行は、さまざまな影響を与えるため、注意深く設計する必要があります。次の文書では、バックグラウンド処理を最大限活用するためのいくつかの提案事項を示し、対処する必要がある問題の多くについて説明します。
https://msdn.microsoft.com/library/en-us/dnnetcomp/html/BackgroundProcess.asp (英語)

7.16. Microsoft .NET Compact Framework マルチスレッドに関するヒントにはどのようなものがありますか。
.NET Compact Framework を使用して Windows フォーム アプリケーションで複数のスレッドを使用する方法を習得します。
https://msdn.microsoft.com/library/en-us/dnnetcomp/html/netcfmultithreadedapp.asp (英語)

7.17. スマート デバイス アプリケーションで難読化機能を使用する方法を教えてください。
PreEmptive Dotfuscator という難読化ツールを使用してソース コードを保護する方法を習得します。
https://msdn.microsoft.com/library/en-us/dnnetcomp/html/netcfobfuscation.asp (英語)

7.18. 暗号化サービスを使用してデータを暗号化および復号化する方法を教えてください。
この FAQ のトピック「10.5. Pocket PC シグネチャ キャプチャ アプリケーションの作成」を参照してください。

7.19. .NET Compact Framework を使用して一意の Windows CE デバイス ID を取得する方法を教えてください。
.NET Compact Framework を使用して Windows CE デバイスからデバイス ID を取得する方法を習得します。
https://msdn.microsoft.com/library/en-us/dnnetcomp/html/retrievedeviceid.asp (英語)

プラットフォーム呼び出しを使用して Pocket PC のデバイス ID (シリアル番号とも呼ばれます) を取得できます。次のクイックスタートでは、アプリケーションを実行すると、メッセージ ボックスに ID が表示されます。
https://www.gotdotnet.com/japan/quickstart/CompactFramework/doc/deviceid.aspx

7.20. Microsoft .NET Compact Framework ベースのアプリケーションから Short Message Service のメッセージを送信する方法を教えてください。
次の記事では、.NET Compact Framework ベースのアプリケーションから Short Message Service のメッセージを送信する方法を示します。
https://msdn.microsoft.com/library/en-us/dnnetcomp/html/netcfsendsms.asp (英語)

7.21. Control.Name プロパティを使用しないでイベントの送信元を確認する方法を教えてください。
次の記事では、.NET Compact Framework のコントロールが名前プロパティをサポートしていない場合にイベントの送信元を確認する方法を説明します。
https://msdn.microsoft.com/library/en-us/dncfhowto/html/HOWTOsenderevent.asp (英語)

7.22. スレッドでメソッドのパラメータを呼び出す方法を教えてください。
アプリケーションでスレッドを使用してユーザー インターフェイスを更新すると、パフォーマンスを向上できます。コントロールの作成スレッド上でメソッドを呼び出すための Invoke、BeginInvoke、および EndInvoke の各メソッドは、基本 Control クラスで提供されます。ただし、.NET Compact Framework では、非同期の BeginInvoke と EndInvoke の呼び出しはサポートされていません。また、現在、同期呼び出しに対して呼び出すパラメータの引き渡しもサポートされていません。次のクイックスタートでは、カスタム クラス ControlInvoker を使用して、同期呼び出しに対して呼び出すパラメータを渡す機能が提供されています。このクラスは Invoke メソッドへのパラメータの引渡しをできるようにします。
https://www.gotdotnet.com/japan/quickstart/CompactFramework/doc/controlinvoker.aspx

7.23. 通知と時刻指定アプリケーションの作成方法を教えてください。
次のクイックスタートには、ユーザーへの通知アプリケーションと時刻指定アプリケーションを設定するためのプラットフォーム呼び出し宣言とメソッドが含まれています。指定した時刻または通知に対応して通知ダイアログ ボックスを表示するようにスケジュールすることができます。また、指定された時刻に、または通知に対応して、アプリケーションが実行されるように設定することもできます。
https://www.gotdotnet.com/japan/quickstart/CompactFramework/doc/notifications.aspx

7.24. サウンドを再生する方法を教えてください。
次のクイックスタートでは、プラットフォームを呼び出し、2 つの WAV ファイルの 1 つを埋め込まれたリソース、もう 1 つをコンテンツとして再生します。フォームには 2 つのボタンがあり、1 つは埋め込まれたリソースから Chimes.wav を再生し、もう 1 つは Chord.wav を個別のファイルとして再生します。
https://www.gotdotnet.com/japan/quickstart/CompactFramework/doc/playsounds.aspx

7.25. コマンド ライン引数の使用方法を教えてください。
コードでコマンド ライン引数にアクセスするには、単純にメインの定義を変更して、適切なパラメータを受け入れます。次のコードは、この方法を示したものです。

//C#
static void Main(string[] args)
{
// ここで目的の操作を実行します。
}

'VB
Shared Sub Main(ByVal args() As String)
'ここで目的の操作を実行します。
End Sub

Microsoft Visual Studio 2003 でデバッグする場合、コマンド ライン パラメータは IDE を使用して設定できます。メイン メニューの [プロジェクト] の [プロジェクト名のプロパティ] をクリックします。[プロパティ ページ] ダイアログ ボックスでは、[構成プロパティ] をポイントし、[デバッグ] をクリックします。[コマンドライン引数] テキスト ボックスに文字列を入力します。

7.26. 破棄されたオブジェクト上でプロパティまたはメソッドを使用すると、例外が発生するのはなぜですか。
完全な .NET Framework では、破棄されたオブジェクト上のプロパティまたはメソッドへのアクセスが常に成功するよう保証されていません。ただし、Text などの一部のプロパティへのアクセスは、多くの場合、.NET Framework では成功しません。.NET Framework と .NET Compact Framework では実装が異なるため、破棄されたオブジェクト上のメソッドまたはプロパティへのアクセスは、.NET Compact Framework ではほとんどの場合に失敗します。

7.27. Enter、Tab、および方向キーを押したことを示すイベントを取得する方法を教えてください。
文字以外のキー (方向キーなど) を取得するには、KeyDown イベントと KeyUp イベントを使用します。

現在、.NET Compact Framework では、コントロール (フォーム、パネル、テキストボックスの各コントロール、およびカスタム コントロール) の選択番号に対応するキー イベントだけをサポートしています。SP2 のリリースでは、すべてのコントロールに対するキー イベントにサポートが拡張される予定です。

既知のバグのため、現在はキーボードで Tab キーを押してもエミュレータでは正しく機能しませんが、エミュレータに対する SIP の使用は正しく機能します。

これは、.NET Compact Framework の問題というより VS に関連して発生したエミュレータに関する問題であると推測されます。.NET Compact Framework は、OS から対応するネイティブ WM_KEY* メッセージを受け取るたびに、Key イベントを発生させるだけです。エミュレータでネイティブ アプリケーションを実行する場合は、キーボードの Tab キーを押しても WM_KEYDOWN を取得しません。エミュレータまたは実際のデバイスを使用して SIP を使用する場合は、問題はありません。

7.28. 読み取り専用ファイルの削除方法を教えてください。
System.IO.FileInfo クラスを使用してファイル属性にアクセスします。

//C#
System.IO.FileInfo fi = new System.IO.FileInfo("filename");
// readonly 属性を削除します。
fi.Attributes -= System.IO.FileAttributes.ReadOnly;
System.IO.File.Delete("filename");

'VB
Dim fi As New System.IO.FileInfo("filename")
'readonly 属性を削除します。
fi.Attributes -= IO.FileAttributes.ReadOnly
System.IO.File.Delete("filename")

7.29. 実行時にメンバが存在するかどうかを確認する方法を教えてください。

Reflection を使用することにより、実行時にメンバが存在するかどうかを確認できます。次のコードは、Reflection を使用して "Width" プロパティと Bitmap オブジェクトの "GetPixel" メソッドにアクセスする方法を示します。"Width" プロパティの場合、コードは "get" コンポーネントを使用してすべての "public" プロパティをエミュレートし、"Width" という名前のプロパティを検索します。"GetPixel" のサンプルは、パラメータの順序が不明な場合に Reflection を使用して既知の関数を呼び出す方法を示します。このサンプルは、作成者がピクセル位置 x、y を取得する "GetPixel" という名前のメソッドがあることは知りながら、それらがパラメータ リストに表示される順序を知らない場合を想定して設定されています。このサンプルでは、メソッドがエミュレートされ、"GetPixel" という名前のメソッドが検索されてから、パラメータ リストがエミュレートされて、最初または 2 番目のパラメータが "X" という名前かどうかが確認されます。ハードウェアのピクセル フォーマットの違いに応じて、GetPixel から返される値は、このサンプルで SetPixel によって設定される値とは異なる可能性があることに注意してください。

Reflection は実行時の機能を確認するための多数の有効なツールを提供します。詳細については、System.Type と名前空間 System.Reflection に関するドキュメントを参照してください。

//C#
using System.Reflection;
using System.Drawing;

Bitmap bm = new Bitmap(200, 100);
int width = 0;

// テストのために 1 ピクセルを明示的に設定します。
int x = 199;
int y = 20;
Color pixColor = Color.Black;
bm.SetPixel(x,y,Color.Magenta);

// "Width" プロパティを取得します。
PropertyInfo[] propInfo =
  bm.GetType().GetProperties(BindingFlags.GetProperty | BindingFlags.Public | BindingFlags.Instance);

for (int i = 0; i < propInfo.Length; i++)
{
    if (propInfo[i].Name == "Width")
    {
        width = (int)propInfo[i].GetValue(bm, null);
        break;
    }
}

// GetPixel メソッドを呼び出します。
MethodInfo[] methInfo = bm.GetType().GetMethods(BindingFlags.Public | BindingFlags.Instance);
for (int i = 0; i < methInfo.Length; i++)
{
    if (methInfo[i].Name == "GetPixel")
    {
        ParameterInfo[] paramInfo = methInfo[i].GetParameters();
        if (paramInfo.Length == 2)
    {

    object[] xy = new object[2];
    if (paramInfo[0].Name == "x")
    {
        xy[0] = x;
        xy[1] = y;
    }
    else
    {
        xy[1] = x;
        xy[0] = y;
    }

    pixColor = (Color)methInfo[i].Invoke(bm, xy);
    break;
}

'VB
Imports System.Reflection
Imports System.Drawing

Dim bm As New Bitmap(200, 100)
Dim width As Integer = 0

' テストのために 1 ピクセルを明示的に設定します。
Dim x As Integer = 199
Dim y As Integer = 20
Dim pixColor As Color = Color.Black
bm.SetPixel(x, y, Color.Magenta)

' "Width" プロパティを取得します。
Dim propInfo As PropertyInfo() = _
  bm.GetType().GetProperties((BindingFlags.GetProperty Or BindingFlags.Public Or BindingFlags.Instance))

Dim i As Integer
For i = 0 To propInfo.Length - 1
    If propInfo(i).Name = "Width" Then
        width = Fix(propInfo(i).GetValue(bm, Nothing))
        Exit For
    End If
Next i

' SetPixel メソッドを呼び出します。
Dim methInfo As MethodInfo() = bm.GetType().GetMethods((BindingFlags.Public Or BindingFlags.Instance))
For i = 0 To methInfo.Length - 1
    If methInfo(i).Name = "GetPixel" Then
        Dim paramInfo As ParameterInfo() = methInfo(i).GetParameters()
        If paramInfo.Length = 2 Then
            Dim xy(1) As Object

            If paramInfo(0).Name = "x" Then
                xy(0) = x
                xy(1) = y
            Else
                xy(1) = x
                xy(0) = y
            End If

            pixColor = CType(methInfo(i).Invoke(bm, xy), Color)
            Exit For
        End If
    End If
Next i

7.30. デバイス名をプログラムによって確認する方法を教えてください。

次のコードに示すように System.Net 名前空間を使用してデバイス名にアクセスできます。

//C#
String devName = System.Net.Dns.GetHostName();

'VB
Dim devName As String = System.Net.Dns.GetHostName()

7.31. コマンド ラインから C# スマート デバイス プロジェクトを作成する方法を教えてください。

set CFPath=%SystemDrive%\Program Files\Microsoft Visual Studio .NET 2003\CompactFrameworkSDK\v1.0.5000\Windows CE
csc Form1.cs /noconfig /nostdlib /lib:"%CFPath%"
 /r:"%CFPath%\system.dll";"%CFPath%\system.drawing.dll";

"%CFPath%\system.windows.forms.dll";"%CFPath%\mscorlib.dll"

7.32. 実行中のスレッドを中止する方法を教えてください。

.NET Compact Framework の Thread クラスに対する Abort メソッドは存在しません。このため、スレッドは実行中のプロシージャから戻すことによって中止する必要があります。通常、アプリケーションはグローバル変数を設定することによって、スレッドに終了イベントを通知します。すると、メイン スレッドは、ワーカー スレッドがアプリケーションの終了前に処理を終了するまで待機します。次の項目は、この処理を実行する方法を示します。

https://msdn.microsoft.com/library/default.asp?url=/library/en-us/dncfhowto/html/stopmt.asp (英語)

7.33. Pocket PC エミュレータで動画を再生できないのはなぜですか。

Windows Media Player は Pocket PC 2003 エミュレータだけで使用できます。Windows Media Player インストール パッケージは、ActiveSync を使用して接続されたハードウェア デバイスへのインストールに対応しており、エミュレータにはインストールされません。

7.34. アクティブなアプリケーションの一覧にフォームのタイトルが表示されないようにする方法を教えてください。

Pocket PC の [実行中のプログラム] の一覧には、開いているフォームがすべて列挙されます。この一覧内にフォームが表示されないようにするには、単純にそのフォームのキャプションが空の文字列になるように設定します。次の例は、別のフォームの内部からフォームが表示されている場合に、一覧内にアプリケーション名だけが表示されるようにする方法を示します。

//C#
string AppName = "MyApp";

Form1 form1 = new Form1();
this.Text = "";
form1.Text = AppName;
form1.ShowDialog();
this.Text = AppName;

'VB
Dim AppName As String = "MyApp"

Dim form1 As New Form1()
Me.Text = ""
form1.Text = AppName
form1.ShowDialog()
Me.Text = AppName

7.35. コントロールのインスタンス名からそのコントロールにアクセスする方法を教えてください。

Reflection を使用して、コントロール インスタンスを名前によって検索できます。次にサンプル コードをいくつか示します。

//C#
private void Form1_Load(object sender, System.EventArgs e)
{
    ComboBox c = (ComboBox)this.ControlFromName("combobox1");
    c.Items.Add("1");
    this.GetControls();
}

private Control ControlFromName(string name)
{
    object o = this.GetType().GetField(name, System.Reflection.BindingFlags.NonPublic |
      System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.IgnoreCase).GetValue(this);

    return((Control)o);
}

private void GetControls()
{
    System.Reflection.FieldInfo[] fis = this.GetType().GetFields
    (
        System.Reflection.BindingFlags.NonPublic | 
        System.Reflection.BindingFlags.Instance |
        System.Reflection.BindingFlags.IgnoreCase
    );

    foreach(System.Reflection.FieldInfo fi in fis)
    {
        if (fi.GetValue(this) is Control)
            MessageBox.Show(fi.Name);
    }
}
'VB
Private Function ControlFromName(ByVal name As String) As Control
    Dim o As ObjectDim o As Object
    o = Me.GetType().GetField(name, Reflection.BindingFlags.NonPublic Or _
      Reflection.BindingFlags.Instance Or _
      Reflection.BindingFlags.IgnoreCase).GetValue(Me)
   
    Return (CType(o, Control))
End Function

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    Dim c As ComboBox
    c = CType(ControlFromName("_combobox1"), ComboBox)
    c.Items.Add("1")
    Me.GetControls()e.GetControls()
End Sub

Private Sub GetControls()
    Dim fis As System.Reflection.FieldInfo()

    fis = Me.GetType().GetFields(Reflection.BindingFlags.NonPublic Or _
      Reflection.BindingFlags.Instance Or _
      Reflection.BindingFlags.IgnoreCase)

    For Each fi As Reflection.FieldInfo In fis
        If TypeOf (fi.GetValue(Me)) Is Control Then
            MessageBox.Show(fi.Name)
        End Ifnd If
    Next
End Sub

7.36. ハードウェアの方向パッド ボタンを検出する方法を教えてください。

ハードウェアの方向パッド ボタンは、KeyEventArgs パラメータから KeyCode を比較することにより、標準のキー イベントを通して検出できます。

//C#
protected override void OnKeyDown(KeyEventArgs e)
{
    switch (e.KeyCode)
    {
        case Keys.Up:
            MessageBox.Show("Up Key Pressed");
            break;
        case Keys.Down:
            MessageBox.Show("Down Key Pressed");
            break;
        case Keys.Left:
            MessageBox.Show("Left Key Pressed");
            break;
        case Keys.Right:
            MessageBox.Show("Right Key Pressed");
            break;
    }
    base.OnKeyDown (e);
}
'VB
Protected Overrides Sub OnKeyDown(e As KeyEventArgs)
    Select Case e.KeyCode
        Case Keys.Up
            MessageBox.Show("Up Key Pressed")
        Case Keys.Down
            MessageBox.Show("Down Key Pressed")
        Case Keys.Left
            MessageBox.Show("Left Key Pressed")
        Case Keys.Right
            MessageBox.Show("Right Key Pressed")
    End Select
     
    MyBase.OnKeyDown(e)

End Sub 'OnKeyDown

7.37. クリック イベントだけがサポートされている場合にダブルクリック イベントを取得する方法を教えてください。

.NET Compact Framework クイックスタート チュートリアルの「イベントの実装」のトピックを参照してください。

https://www.gotdotnet.com/japan/quickstart/CompactFramework/doc/btndclick.aspx

7.38.onenter/onleave スタイルの通知を取得する方法を教えてください。
.NET Compact Framework クイックスタート チュートリアルの「OnEnter/OnLeave 機能」を参照してください。

https://www.gotdotnet.com/japan/quickstart/CompactFramework/doc/enterleave.aspx

7.39.アプリケーションを停止しないモーダル ダイアログで、スレッド化を使用する方法を教えてください。

モーダル ダイアログのように動作するモードレス ダイアログを作成します。

//C#
using System;
using System.Drawing;
using System.Windows.Forms;
using System.Collections;
using System.ComponentModel;

public interface IModelessDialogCallback
{
    void DialogResultCallback(DialogResult result);
}

public class Test : System.Windows.Forms.Form, IModelessDialogCallback
{
    ModelessDialog dlg;
    Button bShow;
    int counter = 0;

    protected override void OnLoad(EventArgs e)
    {
        this.Text = "Modal(less) Dialog Example";

        this.bShow = new Button();
        this.bShow.Parent = this;
        this.bShow.Bounds = new Rectangle (10, 10, 150, 30);
        this.bShow.Text = "Show Dialog";
        this.bShow.Click += new EventHandler(this._Click);

        this.dlg = new ModelessDialog(this);
    }


    private void _Click(object o, EventArgs e)
    {
        this.Enabled = false;
        this.bShow.Text = "waiting for dlg";
        dlg.Show();
    }

    public void DialogResultCallback(DialogResult result)
    {
        MessageBox.Show("dialog returned: " + (result == DialogResult.OK ? "OK" : "Cancel"));
        this.Enabled = true;
        this.bShow.Text = "Show Dialog:" + ++counter;
    }

    public static void Main()
    {
        Application.Run(new Test());
    }
}

public class ModelessDialog : Form
{
    IModelessDialogCallback parent;
    Button bOK, bCancel;

    public ModelessDialog(IModelessDialogCallback parent)
    {
        this.parent = parent;
        this.Text = "Modeless Dialog";

        this.bOK = new Button();
        this.bOK.Parent = this;
        this.bOK.Bounds = new Rectangle (10, 10, 150, 30);
        this.bOK.Text = "OK";
        this.bOK.Click += new EventHandler(this._Click);

        this.bCancel = new Button();
        this.bCancel.Parent = this;
        this.bCancel.Bounds = new Rectangle (10, 50, 150, 30);
        this.bCancel.Text = "Cancel";
        this.bCancel.Click += new EventHandler(this._Click);
    }

    private void _Click(object o, EventArgs e)
    {
        this.Hide();
        this.parent.DialogResultCallback(o == this.bOK ? DialogResult.OK : DialogResult.Cancel);
    }

    protected override void OnClosing(CancelEventArgs e)
    {
        e.Cancel = true;
        this.Hide();
        this.parent.DialogResultCallback(DialogResult.Cancel);
    }
}

'VB
Imports System
Imports System.Drawing
Imports System.Windows.Forms
Imports System.Collections
Imports System.ComponentModel

Public Interface IModelessDialogCallback
   Sub DialogResultCallback(result As DialogResult)
End Interface IModelessDialogCallback'


Public Class Test
   Inherits System.Windows.Forms.Form
   Implements IModelessDialogCallback
   Private dlg As ModelessDialog
   Private bShow As Button
   Private counter As Integer = 0
   
   Protected Overrides Sub OnLoad(e As EventArgs)
      Me.Text = "Modal(less) Dialog Example"
      
      Me.bShow = New Button()
      Me.bShow.Parent = Me
      Me.bShow.Bounds = New Rectangle(10, 10, 150, 30)
      Me.bShow.Text = "Show Dialog"
      AddHandler Me.bShow.Click, AddressOf Me._Click
      
      Me.dlg = New ModelessDialog(Me)
   End Sub 'OnLoad
   
   Private Sub _Click(o As Object, e As EventArgs)
      Me.Enabled = False
      Me.bShow.Text = "waiting for dlg"
      dlg.Show()
   End Sub '_Click
   
   Public Sub DialogResultCallback(ByVal result As DialogResult) Implements IModelessDialogCallback.DialogResultCallback
      MessageBox.Show(("dialog returned: " + IIf(result = DialogResult.OK, "OK", "Cancel")))
      Me.Enabled = True
      counter += 1
      Me.bShow.Text = String.Format("Show Dialog: {0}", counter)
   End Sub 'DialogResultCallback

   Public Shared Sub Main()
      Application.Run(New Test)
   End Sub 'Main
End Class 'Test

Public Class ModelessDialog
   Inherits Form
   Private myParent As IModelessDialogCallback
   Private bOK, bCancel As Button
   
   Public Sub New(parent As IModelessDialogCallback)
      Me.myParent = parent
      Me.Text = "Modeless Dialog"
      
      Me.bOK = New Button()
      Me.bOK.Parent = Me
      Me.bOK.Bounds = New Rectangle(10, 10, 150, 30)
      Me.bOK.Text = "OK"
      AddHandler Me.bOK.Click, AddressOf Me._Click
      
      Me.bCancel = New Button()
      Me.bCancel.Parent = Me
      Me.bCancel.Bounds = New Rectangle(10, 50, 150, 30)
      Me.bCancel.Text = "Cancel"
      AddHandler Me.bCancel.Click, AddressOf Me._Click
   End Sub 'New
   
   Private Sub _Click(o As Object, e As EventArgs)
      Me.Hide()
      Me.myParent.DialogResultCallback(IIf(o Is Me.bOK, DialogResult.OK, DialogResult.Cancel))
   End Sub '_Click
   
   Protected Overrides Sub OnClosing(e As CancelEventArgs)
      e.Cancel = True
      Me.Hide()
      Me.myParent.DialogResultCallback(DialogResult.Cancel)
   End Sub 'OnClosing
End Class 'ModelessDialog

Top of Page ページのトップへ

8. 通信と Web サービス

8.1. TCP ソケットを経由してデータをデスクトップ サーバーへ送信する方法を教えてください。
この FAQ のトピック「10.5. Pocket PC シグネチャ キャプチャ アプリケーションの作成」を参照してください。

8.2. ローカル ホスト上で Web サービスにアクセスできないのはなぜですか。
ローカル ホストはアプリケーションを実行しているデバイスを意味するため、デバイス自体で Web サービスを作成する場合のように、ローカル ホストを使用してデバイス上の Web サービスを作成しないでください。その代わり、コンピュータ名または IP アドレスを使用する必要があります。

8.3. Microsoft .NET Compact Framework を使用して Web サービスを処理する方法を教えてください。
次の記事では、.NET Compact Framework を使用したスマート デバイス アプリケーションから Web サービスを同期または非同期に呼び出す方法を示します。

https://msdn.microsoft.com/library/en-us/dnnetcomp/html/netcfwebservices.asp (英語)

8.4. プロキシを使用して HTTP GET 要求を送信する方法を教えてください。
特定のプロキシを使用して、または使用しないで、HTTP GET 要求を送信する方法を説明します。
StreamReader を使用して、HTML 応答を文字配列バッファに読み込みます。次に、次のリンク先のスクリーン ショットに示すように、ListBox 内に応答を表示します。
https://www.gotdotnet.com/japan/quickstart/CompactFramework/doc/httpgetwithproxy.aspx

8.5. Web サービスを使用する方法を教えてください。
このクイックスタートでは、簡単な計算の結果を提供する Web サービスの使用方法について説明します。この Web サービスは、完全な .NET Framework のクイックスタートの「Write a Simple Web service」で説明されます。次のクイックスタートでは、この Web サービスのクライアント アプリケーションが提供されます。
https://www.gotdotnet.com/japan/quickstart/CompactFramework/doc/xmlwebservice.aspx

8.6. Microsoft MapPoint 3.0 を使用して地図を取得する方法を教えてください。
次のクイックスタートでは、MapPoint Web Service をプログラムして、次のリンク先のスクリーン ショットに示すような特定の場所の地図を Pocket PC で取得する方法について説明します。
https://www.gotdotnet.com/japan/quickstart/CompactFramework/doc/mappointfindmap.aspx

8.7. MapPoint 3.0 を使用して地図と経路図を取得する方法を教えてください。
次のクイックスタートでは、MapPoint Web Service を使用して、次のリンク先のスクリーン ショットに示すような特定の 2 地点間の地図および経路図を取得する方法について説明します。
https://www.gotdotnet.com/japan/quickstart/CompactFramework/doc/mappointdirections.aspx

Top of Page ページのトップへ

9. SQL CE とデータ

9.1. .NET Compact Framework、SQL Server CE、およびレプリケーションを使用してアプリケーションを開発する場合の考慮事項には、どのようなものがありますか。

このトピックの詳細については、次の記事で説明されています。
https://msdn.microsoft.com/library/en-us/dnnetcomp/html/netcfwebservices.asp (英語)

9.2. .NET Compact Framework を使用したマージ レプリケーションの使用方法を教えてください。
次の記事では、.NET Compact Framework ベースのアプリケーションでマージ レプリケーションをプログラムによって呼び出す方法を説明します。
https://msdn.microsoft.com/library/en-us/dnnetcomp/html/netcfmergereplication.asp (英語)

SQL Server CE は、デバイス上でデータを管理するには優れたツールですが、デスクトップ SQL Server にレプリケートする方法がない場合、データをデバイス上に残す必要があります。マージ レプリケーションを使用すると、データをデバイスでローカルに管理し、デバイスを SQL Server のインスタンスに接続するときに、そのデータをマージできます。.NET Compact Framework は、マージ レプリケーションをプログラムで実行できるように SqlCeReplication オブジェクトを提供しています。
https://www.gotdotnet.com/japan/quickstart/CompactFramework/doc/sqlcemergereplication.aspx

9.3. XML を使用した ADO.NET データ連結の使用方法を教えてください。
次の手順に従います。

  1. 提供されている XML ファイルから XML スキーマ ファイル (.xsd) を作成します。
  2. XML データとそのスキーマを読み込み、バインドを実行します。
  3. XML を再度ファイルに保存します。

https://www.gotdotnet.com/japan/quickstart/CompactFramework/doc/adonetdatabinding.aspx

9.4. SQL Server CE データベースの作成方法を教えてください。
.NET Compact Framework を使用して、Windows CE .NET デバイス上で SQL Server CE データベースの作成や管理を行うことができます。次のクイックスタートでは、以下の方法について説明します。

  • SQL CE データベースを作成する。
  • SQL CE データベースに接続する。
  • SQL CE データベースにテーブルを作成する。
  • SQL CE データベースに行を挿入する。

https://www.gotdotnet.com/japan/quickstart/CompactFramework/doc/sqlcedbcreate.aspx

9.5. SQL Server CE のパラメータ化されたクエリの送信方法を教えてください。
.NET Compact Framework を使用して、ユーザー入力により、値を SQL Server CE データベースに挿入できます。次のリンク先のサンプルでは、以下の方法について説明します。

  • ユーザーがクエリ値を設定できるように UI を設計する。
  • SQL CE データベースに接続する。
  • ユーザー値を含む行を SQL CE データベースに挿入する。

https://www.gotdotnet.com/japan/quickstart/CompactFramework/doc/sqlceparameterizedquery.aspx
Top of Page ページのトップへ

10. 追加情報

10.1. Pocket TaskVision アプリケーション
次のドキュメントでは、Pocket TaskVision サンプル アプリケーションに固有だった開発タスクの概要を示します。Pocket PC デバイスは、デスクトップ システムよりもストレージおよびメモリの容量が大幅に少なく、プロセッサの性能も低くなります。次のドキュメントでは、ストレージとパフォーマンスに関する考慮事項を示します。
https://msdn.microsoft.com/library/en-us/dnnetcomp/html/wnf_pkttaskvision.asp (英語)

10.2. .NET Compact Framework ベースのプロセス マネージャの作成
次の記事では、構造体をバイト配列としてマーシャリングする方法を習得します。
https://msdn.microsoft.com/library/en-us/dnnetcomp/html/ProcessManager.asp (英語)

10.3. Microsoft .NET Compact Framework を使用したモバイル ゲームの開発
.NET Compact Framework ベースのゲームを作成する方法を習得します。小型デバイスを対象としたゲームを作成するための主要な必要条件について習得し、.NET Compact Framework でこれらのゲームを簡単に処理できるかどうかを確認します。ゲームの限界を押し広げるために使用できる、高度なパフォーマンス チューニングの手法についても説明されます。
https://msdn.microsoft.com/library/en-us/dnnetcomp/html/netcfgaming.asp (英語)

10.4. .NET Compact Framework ベースの DateTimePicker コントロールの作成
Pocket PC プロジェクトでマネージ DateTimePicker クラスを使用する方法を習得します。.NET Compact Framework では、ほとんどのコントロールのマネージ クラスが提供されますが、DateTimePicker クラスだけはサポートされません。ネイティブ コントロールに P/Invoke を実行するラッパー クラスは Web 上に用意されていますが、このサンプルでは、Pocket PC プロジェクトで使用できる純粋なマネージ DateTimePicker クラスを提供します。このクラスとサンプル アプリケーションは、C# および Visual Basic .NET で提供されています。
https://msdn.microsoft.com/library/en-us/dnnetcomp/html/netcfdatetimepicker.asp (英語)

10.5. Pocket PC シグネチャ キャプチャ アプリケーションの作成
次の記事では、Pocket PC Signature サンプル アプリケーションについて説明します。このサンプルには、デスクトップ上で稼動しているサーバーに TCP ソケットを経由して署名データを送信する Pocket PC 上で実行されるクライアントが含まれます。データは、暗号化サービスを使用して暗号化および復号化されます。
https://msdn.microsoft.com/library/en-us/dnnetcomp/html/PPCSignatureApp.asp (英語)

10.6. .NET Compact Framework ベースのアプリケーションの開発に関する情報を提供しているマイクロソフト以外の会社の web サイトはありますか。
MSDN Mobile & Embedded Developer Center の「Related Sites」のセクションを参照してください。
https://msdn.microsoft.com/mobility/Community/related/default.aspx (英語)

Top of Page ページのトップへ

11. 接続

11.1. ActiveSync を使用して Windows CE デバイスに配置できないのはなぜですか。

症状 : Windows CE デバイスが ActiveSync を使用して接続されている場合、配置とデバッグ (F5 および Ctrl + F5) は、"配置エラーが発生しました。続行しますか?" という一般的なエラー メッセージが表示され、失敗します。

原因 : ActiveSync 3.5 と 3.6 では、デバイス命令セットに関する正確な情報が提供されないため、ConMan (デバイス接続のための Visual Studio .NET 2003 コンポーネント) は、ActiveSync によって返された情報を使用して Windows CE デバイスを正しい .NET Compact Framework ターゲット (MIPSII、ARMV4 など) に割り当てることができません。

対処方法 : 個別に提供されている Windows CE Configuration Add-In をインストールして実行します。ARMV4 デバイスの場合は、代替策として配置の開始時に Pocket PC デバイスを選択します。

11.2. ActiveSync を使用して CEPC またはその他の x86 ベースの Windows CE デバイスをデバッグできないのはなぜですか。
症状 : Windows CE Device Configuration Add-In の実行後、ユーザーは CEPC (または任意の x86 ベースの Windows CE デバイス) に接続された ActiveSync に対してデバッグを行わないで配置 (Ctrl + F5) できますが、デバッグ (F5) を行うことはできません。非 x86 ベースの Windows CE デバイスには、この問題はありません。

原因 : Windows CE エミュレータ (x86 ベースでもある) のデバッグには TCP ポートが使用されますが、このポートは x86 ベースのデバイスのデバッグのために ActiveSync によって使用されるポートと競合します。エミュレータのデバッグをサポートするには、CEPC とその他の x86 デバイスのデバッグを既定で無効にする必要があります。

対処方法 : 次の対処方法は、x86 デバイスのデバッグを可能にしますが、Windows CE エミュレータを使用したデバッグは無効にします。この対処方法を行うには、SDK ユーティリティ ディレクトリ "<VSROOT>\CompactFrameworkSDK\WinCE Utilities\WinCE Proxy Ports Reg" にある WinCEx86Device.reg と ProxyPorts.reg というファイルが必要です。

これらのファイルが存在しない場合は、次のリンクからダウンロードできます。
https://www.microsoft.com/downloads/details.aspx?displaylang=ja&FamilyID;=7ec99ca6-2095-4086-b0cc-7c6c39b28762#filelist

  • WinCEx86Device.reg をレジストリにインポートします。この時点で、x86 デバイスをデバッグできるようになりますが、Windows CE エミュレータを使用したデバッグは失敗するようになります。
  • エミュレータでデバッグできるようにするには、レジストリ キー "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows CE Services\ProxyPorts" を削除してから ProxyPorts.reg をインポートします。

11.3. デバイス上に Toolhelp.dll がない場合にデバッグが失敗するのはなぜですか。
症状 : F5 キーを押すと、アプリケーション実行可能ファイルと .NET Compact Framework CAB ファイルを含むすべてのファイルがデバイスにコピーされ、アプリケーションが正常に起動されたことが IDE によって報告されますが、デバイス上では何も起動されません。デバイスの \windows フォルダを確認すると、toolhelp.dll が存在しません。

原因 : デバイス イメージの中には、デバッグに必要な toolhelp.dll を含んでいないものがあります。

対処方法 : Windows CE SDK から toolhelp.dll をデバイスの \windows フォルダにコピーします。このファイルは、各デバイスに対応するターゲット ディレクトリに見つかります。

たとえば、ARM デバイスには"<VSROOT>\CompactFrameworkSDK\WinCE Utilities\ToolHelp\WinCE4\armv4" が対応します。

このファイルが存在しない場合は、次のリンクからダウンロードできます。
https://www.microsoft.com/downloads/details.aspx?displaylang=ja&FamilyID;=7ec99ca6-2095-4086-b0cc-7c6c39b28762#filelist

11.4. ネットワーク プロトコル数が 50 を超えるとデバイスに配置できなくなるのはなぜですか。
症状 : Ctrl + F5 キーまたは F5 キーを押すと "配置エラー" を示すメッセージ ボックスが表示されます。EnumProtocols.exe を実行すると、50 個を超えるプロトコルが表示されます(EnumProtocols.exe は WinCE ユーティリティ ディレクトリの"<VSROOT>\CompactFrameworkSDK\WinCE Utilities\EnumProtocols" に存在します)。このファイルが存在しない場合は、次のリンクからダウンロードできます。
https://www.microsoft.com/downloads/details.aspx?displaylang=ja&FamilyID;=7ec99ca6-2095-4086-b0cc-7c6c39b28762#filelist

原因 : 現在のコンピュータに 50 を超えるネットワーク プロトコルがインストールされている場合は、.NET Compact Framework メソッドの System.Net.Dns.GetHostName によって例外がスローされることが既に確認されています。このメソッドは ConMan によって呼び出され、この例外は ConMan トランスポート初期化の失敗を引き起こします。

対処方法 : 実際には必要のないネットワーク プロトコルをアンインストールします。これを行う 1 つの方法としては、デバイス マネージャ ([マイ コンピュータ] を右クリックし、[プロパティ] - [ハードウェア] を選択して [デバイス マネージャ] ボタンをクリックします) に移動し、[ネットワーク アダプタ] の下で使用されていないエントリを削除する方法があります。これ以外の方法としては、プロトコルをインストールしたアプリケーションをアンインストールするという方法があります。このようなアプリケーションは、EnumProtocles.exe の出力から確認できます。

11.5. ActiveSync をアンインストールした後に ActiveSync を使用してデバイスに配置できないのはなぜですか。
症状 : ActiveSync をアンインストールした後で Ctrl + F5 キーまたは F5 キーを押すと、"配置エラー" を示すメッセージ ボックスが表示されます。ActiveSync のアンインストールは、通常、ユーザーが ActiveSync を (バージョン 3.5 から 3.6 などに) アップグレードする場合に実行されます。

原因 : ConMan は、ActiveSync を使用した配置とデバッグを行う場合に、"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows CE Services\ProxyPorts" の下の一部のレジストリ値に依存します。これらのレジストリ値は、ActiveSync がアンインストールされると削除されます。

対処方法 : Visual Studio .NET 2003 を再インストールするか、修復します。
これより簡単な修正方法として、WinCE ユーティリティ フォルダである"<VSROOT>\CompactFrameworkSDK\WinCE Utilities\WinCE Proxy Ports Reg" に存在する ProxyPorts.reg をインポートすることが挙げられます。このファイルが存在しない場合は、次のリンクからダウンロードできます。
https://www.microsoft.com/downloads/details.aspx?displaylang=ja&FamilyID;=7ec99ca6-2095-4086-b0cc-7c6c39b28762#filelist

修復を有効にするために、デバイスをクレードルから外してから再度クレードルに入れたり、ソフトを再起動したりするよう、要求される可能性があります。
ユーザーは ActiveSync をアンインストールしないことをお勧めします。ActiveSync をアップグレードするには、新しいバージョンを直接インストールします。この新しいバージョンは、古いバージョンを適切にオーバーライドします。

11.6. コンピュータ名またはユーザー名をローカライズするとデバイスへの配置が失敗する可能性があります。これはなぜですか。
症状 : コンピュータ名またはログオン ユーザー名に現在のコード ページ上にない任意の文字、または ASCII 値 0x20 未満の任意の文字が含まれる場合は、エミュレータへの配置は正常に行われますが、デバイスへの配置が失敗します。

原因 : ConMan セキュリティ認証では、内部的に、上記に説明したカテゴリに含まれる文字を処理できない ASCII 形式でコンピュータ名とユーザー名が使用されます。

対処方法 : 上記で説明した文字はコンピュータ名またはユーザー名に使用しないでください。これらのカテゴリに含まれる文字をユーザーが判別できない場合は、英語のアルファベット文字と数字だけを使用するようにするのが安全です。

11.7. ログオン ユーザーが Administrators グループに含まれていない場合にデバイスへの配置が失敗するのはなぜですか。
症状 : 現在のログオン ユーザーが Administrators グループに含まれていない場合は、そのユーザーが Visual Studio Developers グループおよび Debugger Users グループに含まれていても、デバイスへの配置が常に失敗します。一方、エミュレータへの配置またはデバッグは、正常に実行されます。

原因 : デバイス配置の実行中に、ConMan コードは、内部的に管理者権限を必要とするモードでファイルを開きます。

対処方法 : 現在のユーザーを Administrators グループに追加するか、配置先をエミュレータだけに制限します。

11.8. Pocket PC デバイスまたはエミュレータへの配置が共有違反エラーによって失敗するのはなぜですか。
症状 : アプリケーションを Pocket PC 2002/2003 デバイスまたはエミュレータに配置すると、"出力ファイル 'SmartDeviceApplication1.exe' に書き込めませんでした - 共有違反です。" などの出力メッセージが表示されて、配置が失敗します。これは、通常、同じアプリケーションが以前に同じデバイスまたはエミュレータに配置されたことがある場合に発生します。

原因 : 既定では、Pocket PC 2002 または 2003 (2000 は除外) のアプリケーションの [X] ボタンは、プロセスを終了しません。このボタンは、アプリケーション ウィンドウを "最小化" するだけです。ユーザーがアプリケーションの配置を再度試行すると、"最小化された" インスタンスが共有違反を引き起こし、配置が失敗します。
これ以外に、ユーザーがデバッグ セッションを途中で強制的に終了したことが原因である可能性があります。

対処方法 : アプリケーションを再度配置する場合は、そのアプリケーションがデバイスまたはエミュレータ上で本当に閉じているかどうかを確認します。実行中のプロセスを確認するには、Pocket PC で [スタート] - [設定] - [メモリ] - [実行中のプログラム] を選択します。アプリケーションを本当に閉じるボタンを設定する場合は、そのようなボタンを明示的に作成するか、[X] ボタンがアプリケーションを閉じる処理に対する [OK] ボタンとして機能するように Windows フォームのプロパティ Minimize Box を False に設定します。この症状の原因がデバッグ セッションを手動で終了したことである場合は、デバイスまたはエミュレータでソフトを再起動する必要がある場合があります。

11.9. Windows Server 2003 コンピュータ上でエミュレータを初めて使用したときにセキュリティの警告メッセージが発生するのはなぜですか。
症状 : Windows Server 2003 コンピュータに Visual Studio .NET 2003 をインストールした後に、初めてエミュレータを使用するときは、[Security Alert - Driver Installation] というタイトルが付いたメッセージ ボックスが表示されます。メッセージは、"The driver software you are installing for: Virtual PC Application Services has been signed with Authenticode(TM) technology. The publisher's identity has been identified, and the driver has not been modified since it was published." というテキストで始まります。テキストの最後の方には、"However, this driver cannot be tested by Microsoft Windows Hardware Quality Labs to verify its compatibility with this version of Windows. … Do you trust this publisher and want to install the driver?" と表示されます。

原因 : Visual Studio .NET 2003 は Windows Server 2003 のドライバ確認システムの確認を引き渡さない Virtual PC Application Services Emulator ドライバをインストールします。

対処方法 : 警告メッセージが表示されたら [はい] ボタンをクリックします。この操作を行わない場合は、エミュレータは機能しません。

11.10. エミュレータの起動中に見つからないファイルに関するエラー メッセージが表示されるのはなぜですか。
症状 : エミュレータの起動中に、"Windows CE 用エミュレータのインストールされたファイルが 1 つ以上見つかりません。Windows CE 用エミュレータを再インストールしてやり直してください。" というテキストを表示する [Windows CE 用エミュレータ] というタイトルのメッセージ ボックスが表示されます。 このメッセージ ボックスが表示された後に、エミュレータへの接続または配置が失敗します。

原因 : 一般的には、エミュレータ ドライバがインストールされていない、または破損していることが原因です。

対処方法 : [デバイス マネージャ] ([マイ コンピュータ] を右クリックし、[プロパティ] - [ハードウェア] を選択して、[デバイス マネージャ] ボタンをクリックします) に移動し、[システム デバイス] グループの下に "Virtual PC Application Services" がインストールされているかどうかを確認します。ドライバがインストールされていない場合は、"<VSROOT>\CompactFrameworkSDK\ConnectionManager\Bin\DriverInstall\Smart Devices Emulator.msi" を実行してインストールします。

メモ : msi ファイルの実行後に、"Virtual PC Application Services" が表示されていることを確認します。表示されていない場合は、PC を再起動し、インストールを再試行します。

11.11. エミュレータの配置の初回試行時に失敗することがあるのはなぜですか。
症状 : エミュレータの起動が遅く、最終的には接続エラー メッセージが表示されて配置が失敗します。この起動では、主にエミュレータのイメージの起動と .NET Compact Framework ファイルのダウンロードが実行されます。このエラーは、性能の低いコンピュータで、エミュレータが初めて使用されたときに、または以前のエミュレータのシャットダウンで [エミュレータの状態を保存します。] ではなく [エミュレータをオフにします。] が使用された後に、頻繁に発生します。

原因 : エミュレータでのいくつかのパフォーマンスの問題が原因で、エミュレータの起動に時間がかかりすぎ、ConMan タイムアウト期限内で起動が完了できない可能性があります。

対処方法 : 可能な場合は、エミュレータの終了時に、次回のエミュレータの起動が速くなるように [エミュレータをオフにします。] ではなく [エミュレータの状態を保存します。] を選択します。または、配置の前に、メニュー バーのエミュレータ名の隣にある [デバイスへの接続] ボタンをクリックして、エミュレータを事前に起動しておきます。事前に起動した後でも、最初の配置は失敗することに注意してください (この点に関するドキュメントで詳細を参照してください)。また、エミュレータのイメージをマウスでポイントすると、エミュレータの起動の速度が向上する可能性があります。

11.12. [デバイスへの接続] ボタンを使用してエミュレータを起動した後に、初めて試行した配置が失敗するのはなぜですか。
症状 : [デバイスへの接続] ボタンを使用してエミュレータを起動すると、初めて試行した配置が必ず失敗します。

対処方法 : 現時点では、このボタンを使用してエミュレータを起動した後に最初の配置が失敗する、という問題に対する対処方法はありませんが、これに続いて配置を試行すると正常に行われます。

11.13. コンピュータがネットワークに接続されていない場合にエミュレータのデバッグが失敗するのはなぜですか。
症状 : コンピュータにアクティブなネットワーク接続がない場合、デバッグなしの配置 (Ctrl + F5) は正常に機能しますが、エミュレータ (F5) を使用したデバッグは機能しません。

原因 : エミュレータ デバッグは、TCP トランスポートに依存します。

対処方法 : コンピュータに Microsoft Loopback Adapter をインストールします。

Microsoft Windows XP で Microsoft Loopback Adapter をインストールするには

  1. [コントロール パネル] を開き、[ハードウェアの追加] をクリックし、[次へ] をクリックします。
  2. [はい、ハードウェアを接続しています] を選択し、[次へ] をクリックします。
  3. [インストールされているハードウェア] の一覧から、[新しいハードウェア デバイスの追加] を選択し、[次へ] をクリックします。
  4. [一覧から選択したハードウェアをインストールする (詳細)] を選択し、[次へ] をクリックします。
  5. [共通ハードウェアの種類] の一覧から、[ネットワーク アダプタ] を選択し、[次へ] をクリックします。
  6. [製造元] の一覧から、[Microsoft] を選択します。
  7. [ネットワーク アダプタ] の一覧から [Microsoft Loopback Adapter] を選択し、[次へ] をクリックします。
  8. [次へ] をクリックし、[完了] をクリックします。

Microsoft Windows 2000 で Microsoft Loopback Adapter をインストールするには

  1. [コントロール パネル] を開き、[ハードウェアの追加と削除] をクリックし、[次へ] をクリックします。
  2. [デバイスの追加/トラブルシューティング] を選択し、[次へ] をクリックします。
  3. [デバイス] の一覧から、[新しいデバイスの追加] を選択し、[次へ] をクリックします。
  4. [いいえ、一覧からハードウェアを選択します] を選択し、[次へ] をクリックします。
  5. [ハードウェアの種類] の一覧から、[ネットワーク アダプタ] を選択し、[次へ] をクリックします。
  6. [製造元] の一覧から、[Microsoft] を選択します。
  7. [ネットワーク アダプタ] の一覧から [Microsoft Loopback Adapter] を選択し、[次へ] をクリックします。
  8. [次へ] をクリックし、[完了] をクリックします。

11.14. エミュレータが COM ポートを使用すると、エミュレータが起動しない (画面が黒で表示される) のはなぜですか。
症状 : エミュレータのイメージが起動されている間、画面が黒で表示されたままになります。この症状は、エミュレータが最低 1 つの COM ポートを使用するように構成されている場合に発生します。

原因 : 既定では、エミュレータは COM ポートに割り当てられていませんが、ユーザーが構成を変更して COM ポートをエミュレータに割り当てている可能性があります。エミュレータに割り当てられた COM ポートが ActiveSync またはその他の任意の実行中のアプリケーションによって使用される場合は、このエミュレータのイメージの読み込みは失敗します。

対処方法 : エミュレータに割り当てられている COM ポートをすべて削除するか、これらの COM ポートを ActiveSync やまたはその他の任意の実行中のアプリケーションによって使用されていない COM ポートに変更します。Visual Studio .NET 2003 で COM ポートの構成を削除または変更するには、[ツール] - [オプション] - [Devices] に移動し、[Devices] ウィンドウでエミュレータを選択し、[構成] ボタンをクリックします。

11.15. Visual Studio .NET 2003 Emulator が eMbedded Visual Tools Emulator と同時に動作しないのはなぜですか。
症状 : eMbedded Visual Tools (Platform Builder) Emulator を実行しているときに、Visual Studio .NET 2003 Emulator の配置が失敗します。また、この逆も同様です。Visual Studio .NET 2003 Emulator を終了した後にも、eMbedded Visual Tools Emulator が機能しないことがあります。

原因 : Visual Studio .NET 2003 Emulator と eMbedded Visual Tools Emulator は、相互に互換性のない Emulator.exe の 2 つの異なるインスタンスを内部的に使用します。これらのインスタンスは同じ実行可能ファイル名を共用しており、exe は単一のインスタンス アプリケーションであるため、eMbedded Visual Tools の Emulator.exe が実行中の間は、Visual Studio .NET 2003 の Emulator.exe を起動できません。この逆も同様です。これ以外の問題として、Visual Studio .NET 2003 Emulator のユーザー インターフェイスを終了すると、ホスト Visual Studio IDE インスタンスが終了されるまで emulator.exe が終了されないという現象が挙げられます。この場合、視覚的に確認できる形で実行中のエミュレータが存在しない場合も、eMbedded Visual Tools Emulator を起動できません。

対処方法 : 2 つのエミュレータを同時に使用しないようにします。エミュレータを起動できない場合は、タスク マネージャを確認し、実行中の emulator.exe プロセスをすべて終了します。

11.16. TCP 接続があっても ActiveSync 接続がないデバイスに配置できないのはなぜですか。

症状 : デバイスに Visual Studio コンピュータに対する ActiveSync 接続がない場合は、有効な TCP 接続があっても、配置が機能しません。

原因 : ConMan は、Visual Studio コンピュータとデバイス間のいくつかの初期設定を ActiveSync 接続に依存して実行します。ActiveSync 接続を使用できない場合は、この設定を手動で実行する必要があります。

対処方法 : 次の手順に従って、個別に提供されている Keyman ツールを使用して、デバイスの初期設定を実行します。

  1. Keyman.exe の正しいフレーバー (例 : ARMV4、SH4 など) を選択し、デバイスに配置します。Keyman を起動し、[FILE] - [CONNECT] を選択します。この時点で Keyman は、VS コンピュータが Keyman に TCP/IP 経由で接続するのを待ちます。VS コンピュータを接続してから切断した後で、デバイスの Keyman は自動的に終了されます。
  2. VS コンピュータで、<VSROOT>\ CompactFrameworkSDK\ConnectionManager\bin から KeymanDesktop.exe のディレクトリに CryptoAPIWrapper.dll をコピーします。KeymanDesktop.exe を起動します。
  3. [Save] をクリックして、KeymanDesktop.exe が実行されている現在のディレクトリの設定を保存します。保存された既定の設定は、この exe が次回起動されるときに読み込まれます。
  4. デバイスの [IP アドレス] を入力します。
  5. [Device Port] の推奨値を使用します。
  6. ConManClient.exe などの ConmanClient ビットが存在している "ターゲット" ディレクトリのパスを入力します。一般的な値は \ CompactFrameworkSDK\ConnectionManager\Target です。
  7. [接続] ボタンをクリックして接続します。
  8. 接続した後で [prep device] をクリックします。成功した場合は、正常に実行されたことを示すダイアログが表示されます。
  9. [切断] ボタンを使用して、接続を切断します。接続を切断すると、デバイス側のビットが自動的に終了されます。
  10. デバイス上で ConManClient.exe を起動します。最初に、ターゲット デバイスのフレーバーを選択する必要があります。また、Visual Studio の "ターゲット" ディレクトリの場所も選択する必要があります。

Top of Page ページのトップへ