Upload
yoshihisa-ozaki
View
661
Download
0
Embed Size (px)
Citation preview
~第1部 CLRの基礎 プログラミング .NET Framework 第3版
尾崎 義尚 Ozaki Yoshihisa
• Twitter:@yoshioms
• http://d.hatena.ne.jp/yoshioms/
• 詳細プロファイル:http://bit.ly/yoshioms
• 3月末で会社を退社。現在、無職
• 家族構成:
– 僕:無職
– 妻:専業主婦
– 猫A
– 猫B(C)
プログラミング .NET Framework 第3版
CLR via C# Third Edition
プログラミング.NET Framework 第3版
• 936ページ(第2版は、736ページ)
– 20%以上も増量!
プログラミング.NET Framework 第3版
• 体重1.4kg
プログラミング.NET Framework 第3版
• 体重1.4kg
序文
19ページ
参加者のタイプを想定
FCL
CLR
Serialize Dynamic
Threading
GC
タイプシステム
業務
コーディング
開発プロセス
アーキテクチャ
フレームワーク
ハードウェア
序文
筆者紹介
• 著者: Kristin Trace(Jeffreyの妻)
• Aidan(6歳)、Grant(2歳)の母
Jeffrey Richter
Wintellect Co-Founder 出身校: ドレクセル大学 Computer Science 居住地: Kirkland, Washington 出身地: フィラデルフィア
序文候補者ランキング
1 Bill Gates
2 Steve Ballmer
3 Catherine Zeta-Jones
14 Kristin Trace
・・・
アメリカ合衆国の実業家
アメリカ合衆国の実業家
イギリスの女優
主婦
Catherine Zeta-Jones
• 誕生日:1969年9月25日 (41歳)
• 国籍:イギリス
• 職業:女優
• 配偶者:Michael Douglas
• 主な作品:
– マスク・オブ・ゾロ
– トラフィック
– シカゴ 接点
第1部 CLRの基礎
今回やろうとしていること
コンパイル 読み込み 起動
今回やろうとしていること
コンパイル 読み込み 起動
コンパイル
CSC
VBC
コンパイラ ソースファイル アセンブリ
中間言語 (IL: Intermediate Language)
アセンブリの構造
• Windows PE(Portable Executable)
– PEとは、要はCOFF(Common Object File Format)
• Unixなどでも使われているオブジェクト ファイル フォーマット
NumberOfSections
TimeDateStamp
PointerToSymbolTable
NumberOfSymbols
SizeOfOptionalHeader
Characteristics
実行ファイル
MS-DOS Stub PE Signature COFF File Header Option Header
“This program cannot be run in DOS mode”
MS-DOS 2.0 互換ヘッダ
未使用
OEM 情報
MS-DOS 2.0 スタブ &
リロケーション テーブル
未使用
PEヘッダ セクションヘッダ インポート ページ Import Information Export Information Base relocations
Resource Information
・・・
Machine
MajorLinkerVersion
MinorLinkerVersion
SizeOfCode
SizeOfInitializedData
SizeOfUninitializedData
AddressOfEntryPoint
Magic
BaseOfCode
“PE”¥0¥0
ファイルヘッダの確認
dumpbin /HEADERS a.exe
プラットフォーム指定による動作(/platform)
/platform x86 Windows x64 Windows IA64 Windows
なし anycpu
32ビット 64ビット 64ビット
x86 32ビット WoW64 WoW64
x64 動作しない 64ビット 動作しない
Itanium 動作しない 動作しない 64ビット
通常は指定なし(anycpu)でよい
X64プラットフォーム指定
C:¥Windows¥Microsoft.NET¥Framework64¥v4.0.30319¥csc /platform:x64 a.cs
Windows 7 x86 x64 app
プラットフォーム別Stack x86 OS
Windows 7 x86 anycpu app
プラットフォーム別Stack x64 OS
Windows 7 x64 anycpu app
Windows 7 x64 x86 app
Windows 7 x64 x64 app
アセンブリの内部構造
• アセンブリの内部構造
.DLL .EXE
マニフェスト
コード (IL)
メタデータ
リソース
マニフェスト
コード (IL)
メタデータ
リソース
アセンブリの中身 – マニフェスト
// Metadata version: v4.0.30319 .assembly extern mscorlib { .publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) // .z¥V.4.. .ver 4:0:0:0 } .assembly a { .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilationRelaxationsAttribute::.ctor(int32) = ( 01 00 08 00 00 00 00 00 ) .custom instance void [mscorlib]System.Runtime.CompilerServices.RuntimeCompatibilityAttribute::.ctor() = ( 01 00 01 00 54 02 16 57 72 61 70 4E 6F 6E 45 78 // ....T..WrapNonEx 63 65 70 74 69 6F 6E 54 68 72 6F 77 73 01 ) // ceptionThrows. .hash algorithm 0x00008004 .ver 0:0:0:0 } .module a.exe // MVID: {65EF1A30-A0C7-42B6-8BC9-EA8332F6DEFC} .imagebase 0x00400000 .file alignment 0x00000200 .stackreserve 0x00100000 .subsystem 0x0003 // WINDOWS_CUI .corflags 0x00000001 // ILONLY // Image base: 0x018E0000
アセンブリ メタデータ
型メタデータ
最適化スイッチ(/optimize /debug) P15
/optimize /debug IL最適化 JIT最適化
- - × ○ IL読書用
- (+ | full | pdbonly) × × Debugビルド
+ どれでも ○ ○ Releaseビルド
Edit & Continue用
Nop / 分岐命令
.pdbファイルの生成 デバッグ可能属性の付与→JITへの通知
/optimize-
/debug+
今回やろうとしていること
コンパイル 読み込み 起動
アセンブリの依存関係
dumpbin /DEPENDENTS a.exe
mscoree.dll にのみ依存している。
x86 C:¥Windows¥System32
X64, IA64 64ビット版:C:¥Windows¥System32 32ビット版:C:¥Windows¥SysWoW64
アセンブリのロード
• Fx4.0からは、mscoreei.dllが追加されている
a20.exe %systemroot%¥
mscoree.dll %windir%¥Framework¥v2.x¥
mscorwks.dll
a40.exe %systemroot%¥
mscoree.dll %windir%¥Framework¥v4.x¥
mscoreei.dll
.NET Framework 2.0
.NET Framework 4.0
Shim
Shim
%windir%¥Framework¥v4.x¥
clr.dll
Shim
Shim = mscoree.dll
Assembly
CLR
• バージョンが上がるごとに再起動が必要だった
なぜShimが2重化したのか
C:¥
Windows
System32
Microsoft.NET
Framework
V5.x
これを更新するには、再起動が必要
ここなら大丈夫☺
今回やろうとしていること
コンパイル 読み込み 起動
起動
• CLR初期化
– AppDomainの作成
• EXEアセンブリのロード
• エントリー・ポイント・メソッド呼び出し
mscorlib
メソッドの呼び出し
a40.exe
Main() { var str = Console.ReadLine(): Console.WriteLine(str); }
Console
ReadLine JIT NTV
WriteLine JIT
メソッドテーブル
※メソッドテーブルはイメージです。実際のものとは多少異なる可能性があります。
JITCompiler JIT
IL
Native NTV
• 初回は、JITCompilerの呼び出し
• 2回目以降はキャッシュされたネイティブ呼び出し
今回やろうとしていること
コンパイル 読み込み 起動