Visual Studio 2005 時代の
64 ビットアプリケーション開発
∼ Itanium® 上での .NET Framework 2.0 の展開
Visual Studio 2005
Visual Studio 2005
時代の
時代の
64
64
ビットアプリケーション開発
ビットアプリケーション開発
∼
∼
Itanium
Itanium
®
®
上での
上での
.NET Framework
.NET Framework
2
2
.0
.0
の展開
の展開
マイクロソフト株式会社
マイクロソフト株式会社
エンタープライズ
エンタープライズ
プラットホーム本部
プラットホーム本部
エバンジェリスト
エバンジェリスト
佐藤
佐藤
直樹
直樹
Agenda
Agenda
Windows 64
Windows 64
-
-
bit
bit
概要
概要
マネージコード開発
マネージコード開発
(
(
導入
導入
)
)
マネージコード開発
マネージコード開発
(
(
詳細
詳細
)
)
コーディング上の留意点
コーディング上の留意点
まとめ
まとめ
Windows 64
Windows 64
Windows 64
-
-
bit
bit
概要
概要
∼アプリケーションの観点から
∼アプリケーションの観点から
64
64
ビットアプリケーション
ビットアプリケーション
64
64
ビットシステムファイルを直接利用
ビットシステムファイルを直接利用
32
32
ビットアプリケーション
ビットアプリケーション
Windows on Windows 64 (WOW64)
Windows on Windows 64 (WOW64)
を経由して
を経由して
64
64
ビットシステムファイルを利用
ビットシステムファイルを利用
64
64-
-bit
bit
カーネル
カーネル
Kernel mode
User mode
user64
user64
gdi64
gdi64
32
32
-
-
bit
bit
App
App
Thunking layer
Thunking layer
64
64
-
-
bit
bit
App
App
user32
user32
…
gdi32
gdi32
…
Windows 64
Windows 64
-
-
bit
bit
概要
概要
∼
∼
64/
64/
32
32
ビット相互運用における留意点
ビット相互運用における留意点
同一プロセス内に
同一プロセス内に
は
は
32
32
ビット
ビット
コードと
コードと
64
64
ビット
ビット
コード
コード
は同居できない
は同居できない
ライブラリ
ライブラリ
ロード時にエラー
ロード時にエラー
COM
COM
インプロセス
インプロセスサーバ
サーバ
(DLL
(DLL
サーバ
サーバ
)
)
IME, IE
IME, IE
プラグイン
プラグイン
,
,
シェル拡張
シェル拡張
, ActiveX
, ActiveX
コントロール
コントロール
WOW64
WOW64
32
32-
-bit
bit
App
App
32
32-
-bit
bit dll
dll
64
64-
-bit
bit dll
dll
64
64-
-bit
bit App
App
32
32-
-bit
bit dll
dll
64
64-
-bit
bit dll
dll
Windows 64
Windows 64
-
-
bit
bit
概要
概要
∼
∼
64/
64/
32
32
ビット相互運用における留意点
ビット相互運用における留意点
アウトプロセス
アウトプロセス
COM/RPC (EXE
COM/RPC (EXE
サーバ
サーバ
)
)
を
を
64
64
ビッ
ビッ
ト
ト
と
と
32
32
ビット
ビット
プロセス間においてサポート
プロセス間においてサポート
共有メモリ、イベント等のオブジェクトを共有
共有メモリ、イベント等のオブジェクトを共有
ミューテックス、セマフォ、ファイルハンドル
ミューテックス、セマフォ、ファイルハンドル、
、ウィンドウハ
ウィンドウハ
ンドル
ンドル等
等
WOW64
WOW64
32
32-
-bit
bit App
App
64
64-
-bit
bit App
App
64-
64
-bit
bit
App
App
COM/RPC
COM/RPC
共有
共有
メモリ
マネージコード開発
Visual Studio 2005
Visual Studio 2005
各言語の強化
各言語の強化
IDE
IDE
の革新
の革新
開発ライフサイクルのサポート
開発ライフサイクルのサポート
プラットホームとの統合
プラットホームとの統合
Windows CE
Windows CE
、スマートフォンからデスクトップ、サーバ、
、スマートフォンからデスクトップ、サーバ、
64
64
ビットサーバまで
ビットサーバまで
Connected Systems
.
.
NET Framework 2.0
NET Framework 2.0
2.0
ソースコード
コンパイル
IA64
x64
x86(32-bit)
管理コード、タイプセーフ、高パフォーマンス
管理コード、タイプセーフ、高パフォーマンス
シングルバイナリ
シングルバイナリ
32
32ビット環境
ビット環境
(x86, WOW64)
(x86, WOW64)
64
64ビット環境
ビット環境
( IA64
( IA64 および
および
x64 )
x64 )
コンパイルオプションで特定プラットホーム向けに作成
コンパイルオプションで特定プラットホーム向けに作成
JIT
JIT
コンパイルによりネイティブコードにコンパイルされ実行
コンパイルによりネイティブコードにコンパイルされ実行
Visual Studio 2005
64
64
ビット環境での
ビット環境での
.NET
.NET
.NET Framework 1.1
.NET Framework 1.1
WOW64 (32
WOW64 (32
ビット
ビット
)
)
上でのサポート
上でのサポート
IPF
IPF
では対話型クライアントをお勧め
では対話型クライアントをお勧め
.NET Framework 2.0
.NET Framework 2.0
2
2
つの
つの
64
64
ビット
ビット
CPU
CPU
アーキテクチャ
アーキテクチャ
I
I
A
A
64
64
:
:
インテル
インテル
®
®
Itanium
Itanium
®
®
プロセッサーファミリー
プロセッサーファミリー
x64
x64
:
:
インテル
インテル
®
®
EM64T , AMD AMD64
EM64T , AMD AMD64
WOW64 (32
WOW64 (32
ビット
ビット
)
)
、
、
32
32
ビット
ビット
CPU
CPU
もサポート
もサポート
WOW64 : 64
WOW64 : 64ビット向け再頒布可能パッケージに含む
ビット向け再頒布可能パッケージに含む
32
32ビット
ビット
: x86
: x86向け再頒布可能パッケージ
向け再頒布可能パッケージ
必須システム
必須システム
(64
(64
ビットプラットホーム
ビットプラットホーム
)
)
Windows
Windows
Server 2003 SP1
Server 2003 SP1
for Itanium
for Itanium
-
-
based Systems
based Systems
Windows XP Professional x64 Edition
Windows XP Professional x64 Edition
Windows Server 2003 x64 Editions
ターゲットプラットホーム
ターゲットプラットホーム
開発言語別のサポート状況
開発言語別のサポート状況
32
32
-
-
bit
bit
ネイティブ
ネイティブ
Visual J#
Visual J#
Visual Basic
Visual Basic
32
32
-
-
bit
bit
マネージ
マネージ
Visual C#
Visual C#
Visual C++
Visual C++
64
64
-
-
bit
bit
64
64
-
-
bit
bit
: サポートする /
: サポートしない
2.0(
2.0(
x64/IPF
x64/IPF
)
)
をインストール
をインストール
.NET Framework 2.0
.NET Framework 2.0
WOW
WOW
64
64
上で
上で
.NET Framework 2.0
.NET Framework 2.0
を動作
を動作
.NET Framework 2.0(64
.NET Framework 2.0(64
ビット
ビット
)
)
には
には
32/64
32/64
ビッ
ビッ
トの両方のランタイムが含まれる
トの両方のランタイムが含まれる
Framework
Framework64
v1.1.4322
v2.0.50727
v2.0.50727
Microsoft.NET
2.0(
2.0(
x64/I
x64/I
A64)
A64)
をインストー
をインストー
ル
ル
1.1
1.1
をインストールした場合
をインストールした場合
32
32
ビット向け
ビット向け
Framework
Framework
を管理
を管理
64
64
ビット向け
ビット向け
Framework
Framework
を管理
を管理
Visual Studio 2005
Visual Studio 2005
IA64
IA64
をターゲットとするクロス開発
をターゲットとするクロス開発
32
32
ビット
ビット
OS
OS
上での開発
上での開発
リモートデバッガによるデバッグ
リモートデバッガによるデバッグ
WOW64
WOW64
Windows Server 2003 (IA64)
32
32
-
-
bit
bit
プロセス
プロセス
64
64
-
-
bit
bit
プロセス
プロセス
32
32
-
-
bit
bit
プロセス
プロセス
VS 2005
VS 2005
Windows 32-bit
リモートデバッガ
リモートデバッガ
(
(
32
32
ビット版
ビット版
)
)
リモートデバッガ
リモートデバッガ
(64
(64
ビット版
ビット版
)
)
デバッグ対象を選び
デバッグ対象を選び
[
[
アタッチ
アタッチ
]
]
Visual Studio 2005
Visual Studio 2005
x64
x64
をターゲットとする
をターゲットとする
クロス開発および
クロス開発および
WOW64
WOW64
上
上
32
32
ビット
ビット
OS
OS
、
、
WOW64(x64)
WOW64(x64)
上での開発をサポート
上での開発をサポート
ローカル、リモートでのデバッグ
ローカル、リモートでのデバッグ
WOW64
WOW64
上の
上の
32
32
ビットプロセス
ビットプロセス
64
64
ビットプロ
ビットプロ
セス
セス
WOW64
WOW64
Windows Server 2003/XP (x64)
32
32
-
-
bit
bit
プロセス
プロセス
VS 2005
VS 2005
64
64
-
-
bit
bit
プロセス
プロセス
32
32
-
-
bit
bit
プロセス
プロセス
VS 2005
VS 2005
Windows 32-bit
リモートデバッガ
リモートデバッガ
(
(
32
32
ビット版
ビット版
)
)
リモートデバッガ
リモートデバッガ
(64
(64
ビット版
ビット版
)
)
デバッグ対象を選び
デバッグ対象を選び
[
[
アタッチ
アタッチ
]
]
アプリケーション移行戦略
アプリケーション移行戦略
∼
∼
64
64
ビット化の道筋
ビット化の道筋
64
64
ビットへの移行のモデル
ビットへの移行のモデル
32
32
-
-
bit
bit
OS
OS
上で現状維持
上で現状維持
(
(
32
32
-
-
bit
bit
)
)
WOW64
WOW64
上でホスト
上でホスト
(32
(32
-
-
bit)
bit)
一部
一部
64
64
-
-
bit
bit
化
化
(
(
32
32
-
-
bit
bit
/
/
64
64
-
-
bit
bit
混在
混在
)
)
64
64
-
-
bit
bit
移植
移植
(64
(64
-
-
bit)
bit)
再構築
再構築
(64
(64
-
-
bit)
bit)
業務の見直し、新業務への対応、新技術への対応
業務の見直し、新業務への対応、新技術への対応
SOA, .NET Framework
.NET Framework 1.1
.NET Framework 1.1
∼
∼
64
64
ビット環境への移行の検討
ビット環境への移行の検討
1.1
1.1
ベースのアプリケーションを
ベースのアプリケーションを
64
64
ビット環境
ビット環境
で動作させる
で動作させる
4
4
つの選択肢
つの選択肢
④
④
を推奨。
を推奨。
(
(
場合によっては
場合によっては
①
①
も
も
)
)
WOW64
WOW64
上で起動
上で起動
FX 1.1
FX 1.1
(32
(32
ビット
ビット
)
)
③ CLR ヘッダーの変更 corflags.exe
FX
FX
1.1
1.1
FX 2.0
FX 2.0
① そのまま
② FX 1.1 をインストールしない または
アプリケーション構成ファイルで 2.0 を指定
64
64
ビット
ビット
で起動
で起動
FX 2.0
FX 2.0
WOW64
WOW64
上で起動
上で起動
FX 2.0
FX 2.0
(32
(32
ビット
ビット
)
)
④ .NET Framework 2.0 でリコンパイル
マネージコード開発
実行は
実行は
32
32
ビット
ビット
or 64
or 64
ビット
ビット
?
?
言語と実行プラットフォームとコンパイルオプショ
言語と実行プラットフォームとコンパイルオプショ
ンの関係
ンの関係
C#, Visual Basic :
C#, Visual Basic :
/platform
/platform
オプション
オプション
C++ :
C++ :
ソリューションプラットフォームと
ソリューションプラットフォームと
/
/
clr
clr
オプション
オプション
の組み合せ
の組み合せ
○
○
(x86)
(x86)
anycpu
anycpu
x86
x86
anycpu
anycpu
x86
x86
/
/
clr:safe
clr:safe
/
/
clr
clr
(Win32)
(Win32)
/
/
clr:pure
clr:pure
(Win32)
(Win32)
32
32
ビット
ビット
32
32
ビット
ビット
OS
OS
WOW64
WOW64
Visual J#
Visual J#
Visual
Visual
Basic
Basic
Visual C#
Visual C#
Visual C++
Visual C++
×
×
×
×
○
○
(x86)
(x86)
anycpu
anycpu
Itanium
Itanium
anycpu
anycpu
x64
x64
x86
x86
anycpu
anycpu
x64
x64
/
/
clr:safe
clr:safe
/
/
clr
clr
(x64)
(x64)
/
/
clr:pure
clr:pure
(x64)
(x64)
64
64
ビット
ビット(x64)
(x64)
64
64
ビット
ビット
OS
OS
anycpu
anycpu
Itanium
Itanium
x86
x86
/
/
clr:safe
clr:safe
/
/
clr
clr
(IPF)
(IPF)
/
/
clr:pure
clr:pure
(IPF)
(IPF)
/
/
clr
clr
(Win32)
(Win32)
/
/
clr:pure
clr:pure
(Win32)
(Win32)
64
64
ビット
ビット(IA64)
(IA64)
アプリケーションローディング
アプリケーションローディング
∼コンパイルオプションによる留意点
∼コンパイルオプションによる留意点
同一プロセス内に
同一プロセス内に
32
32
ビットコードと
ビット
コードと
64
64
ビットコード
ビット
コード、ターゲット
、ターゲット
マシンの違うコード
マシンの違うコードは同居できない
は同居できない
アーキテクチャ
アーキテクチャ
ミスマッチ
ミスマッチ
ネイティブコードと同様の制約
ネイティブコードと同様の制約
/
/
platform:anycpu
platform:anycpu
, /
, /
clr:safe
clr:safe
はロード
はロード
WOW64
WOW64
32
32-
-bit
bit
App
App
32
32-
-bit
bit x86
x86 dll
dll
64
64-
-bit
bit IA64
IA64 dll
dll
64-bit IA64 App
32
32-
-bit
bit x86
x86 dll
dll
64
64-
-bit
bit IA64
IA64 dll
dll
64
共有アセンブリの格納先
共有アセンブリの格納先
グローバルアセンブリキャッシュ
グローバルアセンブリキャッシュ
(
(
GAC
GAC
)
)
は
はアーキテクチャを認識
アーキテクチャを認識
適切なアーキテクチャにインストールされる
適切なアーキテクチャにインストールされる
i.e. x64
i.e. x64
は
は
IPF
IPF
にインストール
にインストール
されない
されない
アセンブリの検索順序
アセンブリの検索順序
:
:
特定プロセッサー
特定プロセッサー
(x86, x64, IA64)
(x86, x64, IA64)
MSIL
MSIL
Legacy (1.1)
Legacy (1.1)
gacutil
gacutil
/
/
lr
lr
共有アセンブリ
共有アセンブリ
assembly
GAC
GAC_32
GAC_64
GAC_MSIL
2.0
2.0
のアセンブリ用
のアセンブリ用
1.1
1.1
のアセンブリ用
のアセンブリ用
x86
x86 dll
dll
anycpu
anycpu
dll
dll
x64
x64/IA64
/IA64
dll
dll
WOW64
WOW64
①
①
x86
x86
②
②
MSIL
MSIL
③
③
1.1
1.1
64
64
ビット
ビット
(IA64)
(IA64)
①
①
IA64
IA64
②
②
MSIL
MSIL
③
③
1.1
1.1
64
64
ビット
ビット
64
64
ビット上での
ビット上での
IIS 6.0
IIS 6.0
64
64
ビット
ビット
もしくは
もしくは
32
32
ビット
ビット
のいずれかで動作
のいずれかで動作
メタベース
メタベース
プロパティの値に従って
プロパティの値に従って
32
32ビットもしくは
ビットもしくは
64ビットワーカープロ
64
ビットワーカープロ
セスを開始
セスを開始
ASP.NET
ASP.NET も同様に
も同様に
64ビットもしくは
64
ビットもしくは
32ビットのいずれかでの動作
32
ビットのいずれかでの動作
仮想フォルダ
仮想フォルダ
32
32
ビット
ビット
(WOW64)
(WOW64)
仮想フォルダ
仮想フォルダ
64
64
ビット上での
ビット上での
IIS 6.0
IIS 6.0
32
32
ビットワーカープロセスへの切り替え
ビットワーカープロセスへの切り替え
32
32ビット
ビット
ASP.NET
ASP.NET
1.1 のインストール
1.1
のインストール
32
32ビット
ビット
ASP.NET
ASP.NET
2.0 のインストール
2.0
のインストール
c
c
script
script
%
%
SystemDrive%
SystemDrive%
¥
¥
inetpub
inetpub
¥
¥
AdminScripts
AdminScripts
¥
¥
adsutil.vbs
adsutil.vbs
set w3svc/AppPools/Enable32bitAppOnWin64 1
set w3svc/AppPools/Enable32bitAppOnWin64 1
%SystemDrive%
%SystemDrive%
¥
¥
Microsoft.net
Microsoft.net
¥
¥
Framework
Framework
¥
¥
v1.1.4322
v1.1.4322
¥
¥
aspnet_regiis
aspnet_regiis
–
–
i
i
%SystemDrive%
%SystemDrive%
¥
¥
Microsoft.net
Microsoft.net
¥
¥
Framework
Framework
¥
¥
v2.0.50727
v2.0.50727
¥
¥
aspnet_regiis
aspnet_regiis
–
–
i
i
–
–
wow64
wow64
-
-
enable
enable
仮想フォルダ
32
32
ビット
ビット
(WOW64)
(WOW64)
2.0
2.0
にマッピング
にマッピング
1.1
1.1
にマッピング
にマッピング
64
64
ビット上での
ビット上での
IIS 6.0
IIS 6.0
64
64
ビットワーカープロセスへの切り替え
ビットワーカープロセスへの切り替え
64
64ビット
ビット
ASP.NET
ASP.NET
2.0 のインストール
2.0
のインストール
c
c
script
script
%
%
SystemDrive%
SystemDrive%
¥
¥
inetpub
inetpub
¥
¥
AdminScripts
AdminScripts
¥
¥
adsutil.vbs
adsutil.vbs
set w3svc/AppPools/Enable32bitAppOnWin64 0
set w3svc/AppPools/Enable32bitAppOnWin64 0
%SystemDrive%
%SystemDrive%
¥
¥
Microsoft.net
Microsoft.net
¥
¥
Framework64
Framework64
¥
¥
v2.0.50727
v2.0.50727
¥
¥
aspnet_regiis
aspnet_regiis
–
–
i
i
-
-
enable
enable
仮想フォルダ
64
64
ビット
ビット
2.0
コーディング上の留意点
コーディング上の留意点
コーディング上の留意点
コーディング上の留意点
シリアル化
シリアル化
XML
XML シリアル化は動作する
シリアル化は動作する
Web
Web
サービス
サービス
バイナリーシリアル化は注意が必要
バイナリーシリアル化は注意が必要
ポインタサイズ
ポインタサイズ
System.IntPtr
System.IntPtr
は
は
64
64
ビット
ビット
CLR
CLR
環境ではサイズが違う
環境ではサイズが違う
マネージコード間の
マネージコード間の
アライメント
アライメント
は
は
CLR
CLR
によって処理されるので意識す
によって処理されるので意識す
ることはない
ることはない
浮動小数点演算
浮動小数点演算
(float/double)
(float/double)
32
32ビット、
ビット、
64ビットで演算値が同一とは限らない
64
ビットで演算値が同一とは限らない
64
64ビット化により境界部分での演算可能となる
ビット化により境界部分での演算可能となる
例
例
: Sin(1e37)
: Sin(1e37)
ポインタサイズ
ポインタサイズ
-
-
System.IntPtr
System.IntPtr
32
32ビット
ビット
: 4バイト
: 4
バイト
/ 64ビット
/ 64
ビット
:8バイト
:8
バイト
環境変数
環境変数
Module
ネイティブとの相互運用
ネイティブとの相互運用
アライメント
アライメント
シグネチャ
シグネチャ
DllImport
DllImport
, Declare, #include
, Declare, #include
System.IntPtr
System.IntPtr
全てのプラットホームで
全てのプラットホームで
API
API
が用意されていること
が用意されていること
マーシャリング
マーシャリング
StructLayoutAttribute
StructLayoutAttribute
Marshal.SizeOf
Marshal.SizeOf
COM
COM
DLL
DLL
サーバ
サーバ
:
:
アーキテクチャの制約を受ける
アーキテクチャの制約を受ける
EXE
EXE
サーバ、
サーバ、
COM
COM
+
+
サーバアプリケーション
サーバアプリケーション
(
(
サロゲート
サロゲート
プロセス
コード例
コード例
∼
∼
SequentialLayout
SequentialLayout
属性
属性
[
[
StructLayout(LayoutKind.Sequential
StructLayout(LayoutKind.Sequential
, Pack=1)]
, Pack=1)]
public class Unicode1 {
public class Unicode1 {
public byte
public byte
by_minneg
by_minneg
= unchecked((byte)
= unchecked((byte)
-
-
1);
1);
[
[
MarshalAs(UnmanagedType.ByValArray
MarshalAs(UnmanagedType.ByValArray
,
,
SizeConst
SizeConst
=52)]
=52)]
public
public
int
int
[] padding = new int[13];
[] padding = new int[13];
};
};
#
#
pragma
pragma
pack(1)
pack(1)
typedef
typedef
struct
struct
{
{
BYTE
BYTE
by_minneg
by_minneg
; // = (
; // = (
byte
byte
)
)
-
-
1;
1;
int
int
padding[13];
padding[13];
} ASM_StructU1;
} ASM_StructU1;
マネージコード
マネージコード
(
(
クラス
クラス
)
)
アンマネージコード
アンマネージコード
(
(
構造体
構造体
)
)
コード例
コード例
∼
∼
ExplicitLayout
ExplicitLayout
属性
属性
[
[
StructLayout(LayoutKind.Explicit
StructLayout(LayoutKind.Explicit
)]
)]
internal
internal
struct
struct
FooValue
FooValue
{
{
[FieldOffset(0)] public
[FieldOffset(0)] public
int
int
dwType
dwType
;
;
[FieldOffset(4)] public
[FieldOffset(4)] public
IntPtr
IntPtr
pType
pType
;
;
[FieldOffset(8)] public
[FieldOffset(8)] public
int
int
typeValue
typeValue
;
;
}
}
マネージコード
マネージコード
(
(
構造体
構造体
)
)
要注意
要注意
:
:
IntPtr
IntPtr
は
は
プラットホームに依存
プラットホームに依存
(
(4
4
バイト
バイト
or 8
or 8
バイト
バイト
)
)
フィールドオフセットでは他のフィ
フィールドオフセットでは他のフィ
ールドサイズを考慮
ールドサイズを考慮
まとめ
まとめ
まとめ
まとめ
インテル
インテル
®
®
Itanium
Itanium
®
®
プロセッサーファミリー
プロセッサーファミリー
をサポートしている
をサポートしている
Windows Server 2003
Windows Server 2003
そして
そして
.NET Framework 2.0
.NET Framework 2.0
Visual Studio 2005
Visual Studio 2005
により
により
64
64
ビット環境に
ビット環境に
向けた
向けた
.NET Framework
.NET Framework
アプリケーション
アプリケーション
の開発が可能
の開発が可能
プラットホーム限定するコンパイルオプション
プラットホーム限定するコンパイルオプション
により環境依存なコードとの相互連携
により環境依存なコードとの相互連携
技術情報リソース
技術情報リソース
Windows 64 bit アプリケーション開発:
http://www.microsoft.com/japan/msdn/windows/64bit/
64-bit Windows (Development Guides):
http://msdn.microsoft.com/library/en-us/dnanchor/html/64bitwindows.asp
Microsoft .NET Framework SDK:
http://msdn.microsoft.com/library/en-us/dnanchor/html/netfxanchor.asp
Microsoft Platform SDK:
© 2006 Microsoft Corporation. All rights reserved.