10 行でズバリ !! 64 ビット対応 .NET アプリケーションの開発 (C#)
マイクロソフト株式会社 デベロッパー&プラットフォーム統括本部
エバンジェリスト 佐藤 直樹
最終更新日 2005 年 12 月 15 日
|
|
|
|
このコンテンツのポイント
- 64 ビットをターゲットにした開発環境についての理解
- 実行プラットフォーム情報の取得方法の理解
今回紹介するコード
<Form1.cs>private void button1_Click(object sender, EventArgs e)
{
// プラットフォームのポインタサイズを取得する
this.listBox1.Items.Add("IntPtr.Size=" + System.IntPtr.Size.ToString());
// 現在実行中のアセンブリを構成するモジュールコレクションを取得する
Module [] moduleArray = Assembly.GetExecutingAssembly().GetModules();
// モジュールを列挙する
foreach (Module md in moduleArray)
{
// モジュールのアセンブリ名を取得する
Assembly myAssembly = md.Assembly;
this.listBox1.Items.Add("Asm=" + myAssembly.FullName);
// モジュール(EXE/DLL) がもつ属性を取得する
PortableExecutableKinds pekind = new PortableExecutableKinds();
ImageFileMachine ifm = new ImageFileMachine();
md.GetPEKind(out pekind, out ifm);
// リストボックスに追加する
this.listBox1.Items.Add("pekind =" + pekind.ToString());
this.listBox1.Items.Add("ImageFileMachine=" + ifm.ToString());
}
} 今回のシステム要件
- Visual Studio 2005 Release Cadidate
- Windows XP Professional x64 Edition
|
|
|
|
|
目次
はじめに
作成するアプリケーションの概要
アプリケーションの作成
動作と解説
おわりに
はじめに
Windows XP Professional x64 Edition と Windows Server 2003 x64 Editions の登場、そして .NET Framework 2.0 登場により、64 ビット開発が注目を集めています。.NET Framework 2.0 では、32 ビット版の Windows だけではなくx64およびIPFの2つの64 ビット版の Windows にも対応しています。ここでは、.NET Framework 2.0 を用いたx64 をターゲットとする64 ビットアプリケーションの開発について解説します。
作成するアプリケーションの概要
今回作成するアプリケーションは、プラットフォームの持つポインタサイズと実行中の EXE ファイルの情報を取得し、リストボックス上に表示する Windows アプリケーションです。
アプリケーション開発環境について
64 ビットを対象としたアプリケーション開発には、実機上での実行確認もあるため 64 ビットのPCが必要になります。32 ビットアプリケーションの開発の場合、1台でコード作成とデバッグ実行を行いますが、64 ビット開発では以下のように2つのシナリオがあります。
| No | シナリオ | コード作成 PC (x86) | デバッグ実行 PC (x64) |
| 1 | クロス開発 | Windows 32 ビット版 + Visual Studio 2005 | Windows 64 ビット版 + リモートデバッガ |
| 2 | x64上での開発 | Windows x64 版+ Visual Studio 2005 | コード開発と同一 PC |
ひとつは、「クロス開発」と呼ばれる方法です。32 ビット機器と64 ビット機器をそれぞれ用意し、コード作成は32 ビット上で、実行とデバッグは64 ビット上で行う方法です。もうひとつは、64 ビットプラットフォームであるx64に、Visual Studio 2005 をインストールして、1台でコード作成とデバッグ実行を行う方法です。
今回は、作成したアプリケーションを32 ビット環境上でも実行確認するため、「クロス開発」のシナリオで開発します。
アプリケーションの作成
Visual Studio 2005 を起動して、新規プロジェクトを作成します。ここでは、Visual C# を選択し、"Windows アプリケーション" テンプレートを選択します。[プロジェクト名] テキストボックスにプロジェクト名称を入力したら [OK] ボタンをクリックします。(図1)
.gif)
図 1. Windows フォームアプリケーションのプロジェクトを新規に作成する
これで64 ビット向けの Windows アプリケーションの開発準備が完了しました。
次に、フォームにコントロールを追加して、画面デザインを行います。デザイン画面において、リストボックスコントロールとボタンコントロールをそれぞれ1つずつ配置します。(図2) 取得した情報を表示するリストボックスと、情報を取得しリストボックスへ表示するイベントを記述するボタンになります。コントロールに対して以下のようにプロパティを設定します。
| コントロール ID | プロパティ名 | 設定値 |
| button1 | Text | “取得” |
.gif)
図 2. 画面上にコントロールを配置したところ
プロパティ設定後、以下の赤字で書かれているコードを記述します。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Reflection;
namespace GetPeData
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}これは、using 文を使用しての System.Reflection 名前空間の宣言となります。この宣言により Reflection 名前空間のクラス名が暗黙的に解決されます。
次に、"取得" ボタンをダブル クリックし、情報取得の実装を行います。以下の赤字で書かれているコードを記述します。
private void button1_Click(object sender, EventArgs e)
{
// リストボックスをクリアする
this.listBox1.Items.Clear();
// プラットフォームのポインタサイズを取得する
this.listBox1.Items.Add("IntPtr.Size=" + System.IntPtr.Size.ToString());
// 現在実行中のアセンブリを構成するモジュールコレクションを取得する
Module[] moduleArray = Assembly.GetExecutingAssembly().GetModules();
// モジュールを列挙する
foreach (Module md in moduleArray)
{
// モジュールのアセンブリ名を取得する
Assembly myAssembly = md.Assembly;
this.listBox1.Items.Add("Asm=" + myAssembly.FullName);
// モジュール(EXE/DLL) がもつ属性を取得する
PortableExecutableKinds pekind = new PortableExecutableKinds();
ImageFileMachine ifm = new ImageFileMachine();
md.GetPEKind(out pekind, out ifm);
// リストボックスに追加する
this.listBox1.Items.Add("pekind =" + pekind.ToString());
this.listBox1.Items.Add("ImageFileMachine=" + ifm.ToString());
}
} これは、プラットフォーム情報やEXEファイルの情報取得のためのコードです。System.IntPtr 構造体はポインタやハンドルを表すときに使用されるプラットフォーム固有の型です。この Size プロパティにより、プラットフォームのポインタ サイズを取得します。32 ビット プラットフォームでは 4、64 ビット プラットフォームでは 8 を返します。また、GetPEKind メソッドにより、ImageFileMachine 列挙体やPortableExecutableKinds 列挙体を取得し、EXE ファイルがどのような属性を持っているか判定します。 最後に、構成マネージャを用いて、対象とするプラットフォームを切り替え、対象CPUごとのアセンブリを作成します。[デバッグ] メニューから [構成マネージャ開始] を選択し、”アクティブ ソリューション プラットホーム” リストボックスの <新規作成…> を選択します。”新しいソリューション プラットフォーム” ダイアログで、 “x64” を選択し [OK] をクリック、“x86” を選択し [OK] をクリックしすることで、”x64” と “x86” のプラットフォームを追加します。(図3) .gif)
図 3. ソリューションプラットフォームの追加 規定値の “Any CPU”、追加した “x64” と “x86” あわせて3つのソリューションプラットフォームが構成として用意されました。 ツールバー内にある構成を変更するコンボボックスで、構成を変更するたびにビルドします。構成ごとにフォルダが作成され、その中にビルド出力されます。(図4) .gif)
図 4. ビルド出力が保存されるフォルダ 動作と解説 コードの記述が完了したら、実行してみましょう。アプリケーションを実行させるには [F5] キーを押すか、[デバッグ] メニューから [開始] をクリックします。"取得" ボタンをクリックすることで、リストボックスにポインタのサイズとこのアセンブリ自身の情報が表示されます。構成を切り替えながら、アプリケーションを実行します。 .gif)
図 5. Windows (32 ビット版) で “Any CPU” の構成を実行した結果 .gif)
図 6. Windows (32 ビット版) で ”x86” の構成を実行した結果 .gif)
図 7. Windows (32 ビット版)で “x64” の構成を実行 このエラーは正常な動作です。”x64” の構成でビルドした場合、その EXE ファイルには64 ビットおよび x64 環境でのみ動作するしるしが付くためです。 次に、この3つのアセンブリを Windows XP Professional x64 Edition 上にコピーし、実行します。 .gif)
図 8. Windows (64 ビット版) で “Any CPU” の構成を実行した結果 .gif)
図 9. Windows (64 ビット版)で “x64” の構成を実行 .gif)
図 10. Windows (64 ビット版) で ”x86” の構成を実行した結果 “x86” の構成で 64 ビットOS で実行した場合、タスクマネージャのプロセス一覧に表示されるイメージ名に “*32” が付与されているのがわかります。これは、このプロセスが32 ビットで動作していることを表します。 64 ビット Windows 上では、32 ビット Windows アプリケーションが動作します。これは、64 ビットOS上で32 ビットのエミュレーションを行っているためです。このエミュレーションは Windows on Windows 64 もしくはその頭文字をとって WOW64 と呼びます。”x86” の構成でビルドしたアセンブリは、この WOW64 上で動作します。 これらの動作をまとめると、以下の表になります。 | OS | 32 ビットOS | 64 ビットOS | | 構成 | 32 ビット | 64 ビット | 32 ビット(WOW64) | | “Any CPU” | 動作 | 動作 | - | | “x86” | 動作 | - | 動作 | | “x64” | エラーメッセージが出力される | 動作 | - |
おわりに今回は、対話型のシンプルなWindows フォームアプリケーションを作成しました。もちろん、ADO.NET のデータベースアプリケーションや ASP.NET 2.0 の Web アプリケーションそしてWeb サービスも、 64 ビットアプリケーションとして動作が可能となります。また、今回は x64 をターゲットにしましたが、もちろんIPF をターゲットとしてのアプリケーション展開も可能です。 ぜひ .NET Framework 2.0 を活用した64 ビット対応のアプリケーション作成にチャレンジしてください。 |
ページのトップへ