clrの基礎 - プログラミング .net framework 第3版 読書会

35
~第1部 CLRの基礎 プログラミング .NET Framework 第3版

Upload: yoshihisa-ozaki

Post on 22-Jun-2015

664 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: CLRの基礎 - プログラミング .NET Framework 第3版 読書会

~第1部 CLRの基礎 プログラミング .NET Framework 第3版

Page 2: CLRの基礎 - プログラミング .NET Framework 第3版 読書会

尾崎 義尚 Ozaki Yoshihisa

• Twitter:@yoshioms

• http://d.hatena.ne.jp/yoshioms/

• 詳細プロファイル:http://bit.ly/yoshioms

• 3月末で会社を退社。現在、無職

• 家族構成:

– 僕:無職

– 妻:専業主婦

– 猫A

– 猫B(C)

Page 3: CLRの基礎 - プログラミング .NET Framework 第3版 読書会

プログラミング .NET Framework 第3版

CLR via C# Third Edition

Page 4: CLRの基礎 - プログラミング .NET Framework 第3版 読書会

プログラミング.NET Framework 第3版

• 936ページ(第2版は、736ページ)

– 20%以上も増量!

Page 5: CLRの基礎 - プログラミング .NET Framework 第3版 読書会

プログラミング.NET Framework 第3版

• 体重1.4kg

Page 6: CLRの基礎 - プログラミング .NET Framework 第3版 読書会

プログラミング.NET Framework 第3版

• 体重1.4kg

Page 7: CLRの基礎 - プログラミング .NET Framework 第3版 読書会

序文

19ページ

Page 8: CLRの基礎 - プログラミング .NET Framework 第3版 読書会

参加者のタイプを想定

FCL

CLR

Serialize Dynamic

Threading

GC

タイプシステム

業務

コーディング

開発プロセス

アーキテクチャ

フレームワーク

ハードウェア

序文

Page 9: CLRの基礎 - プログラミング .NET Framework 第3版 読書会

筆者紹介

• 著者: Kristin Trace(Jeffreyの妻)

• Aidan(6歳)、Grant(2歳)の母

Page 10: CLRの基礎 - プログラミング .NET Framework 第3版 読書会

Jeffrey Richter

Wintellect Co-Founder 出身校: ドレクセル大学 Computer Science 居住地: Kirkland, Washington 出身地: フィラデルフィア

Page 11: CLRの基礎 - プログラミング .NET Framework 第3版 読書会

序文候補者ランキング

1 Bill Gates

2 Steve Ballmer

3 Catherine Zeta-Jones

14 Kristin Trace

・・・

アメリカ合衆国の実業家

アメリカ合衆国の実業家

イギリスの女優

主婦

Page 12: CLRの基礎 - プログラミング .NET Framework 第3版 読書会

Catherine Zeta-Jones

• 誕生日:1969年9月25日 (41歳)

• 国籍:イギリス

• 職業:女優

• 配偶者:Michael Douglas

• 主な作品:

– マスク・オブ・ゾロ

– トラフィック

– シカゴ 接点

Page 13: CLRの基礎 - プログラミング .NET Framework 第3版 読書会
Page 14: CLRの基礎 - プログラミング .NET Framework 第3版 読書会

第1部 CLRの基礎

Page 15: CLRの基礎 - プログラミング .NET Framework 第3版 読書会

今回やろうとしていること

コンパイル 読み込み 起動

Page 16: CLRの基礎 - プログラミング .NET Framework 第3版 読書会

今回やろうとしていること

コンパイル 読み込み 起動

Page 17: CLRの基礎 - プログラミング .NET Framework 第3版 読書会

コンパイル

CSC

VBC

コンパイラ ソースファイル アセンブリ

中間言語 (IL: Intermediate Language)

Page 18: CLRの基礎 - プログラミング .NET Framework 第3版 読書会

アセンブリの構造

• 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

Page 19: CLRの基礎 - プログラミング .NET Framework 第3版 読書会

ファイルヘッダの確認

dumpbin /HEADERS a.exe

Page 20: CLRの基礎 - プログラミング .NET Framework 第3版 読書会

プラットフォーム指定による動作(/platform)

/platform x86 Windows x64 Windows IA64 Windows

なし anycpu

32ビット 64ビット 64ビット

x86 32ビット WoW64 WoW64

x64 動作しない 64ビット 動作しない

Itanium 動作しない 動作しない 64ビット

通常は指定なし(anycpu)でよい

Page 21: CLRの基礎 - プログラミング .NET Framework 第3版 読書会

X64プラットフォーム指定

C:¥Windows¥Microsoft.NET¥Framework64¥v4.0.30319¥csc /platform:x64 a.cs

Windows 7 x86 x64 app

Page 22: CLRの基礎 - プログラミング .NET Framework 第3版 読書会

プラットフォーム別Stack x86 OS

Windows 7 x86 anycpu app

Page 23: CLRの基礎 - プログラミング .NET Framework 第3版 読書会

プラットフォーム別Stack x64 OS

Windows 7 x64 anycpu app

Windows 7 x64 x86 app

Windows 7 x64 x64 app

Page 24: CLRの基礎 - プログラミング .NET Framework 第3版 読書会

アセンブリの内部構造

• アセンブリの内部構造

.DLL .EXE

マニフェスト

コード (IL)

メタデータ

リソース

マニフェスト

コード (IL)

メタデータ

リソース

Page 25: CLRの基礎 - プログラミング .NET Framework 第3版 読書会

アセンブリの中身 – マニフェスト

// 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

アセンブリ メタデータ

型メタデータ

Page 26: CLRの基礎 - プログラミング .NET Framework 第3版 読書会

最適化スイッチ(/optimize /debug) P15

/optimize /debug IL最適化 JIT最適化

- - × ○ IL読書用

- (+ | full | pdbonly) × × Debugビルド

+ どれでも ○ ○ Releaseビルド

Edit & Continue用

Nop / 分岐命令

.pdbファイルの生成 デバッグ可能属性の付与→JITへの通知

/optimize-

/debug+

Page 27: CLRの基礎 - プログラミング .NET Framework 第3版 読書会

今回やろうとしていること

コンパイル 読み込み 起動

Page 28: CLRの基礎 - プログラミング .NET Framework 第3版 読書会

アセンブリの依存関係

dumpbin /DEPENDENTS a.exe

mscoree.dll にのみ依存している。

x86 C:¥Windows¥System32

X64, IA64 64ビット版:C:¥Windows¥System32 32ビット版:C:¥Windows¥SysWoW64

Page 29: CLRの基礎 - プログラミング .NET Framework 第3版 読書会

アセンブリのロード

• 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

Page 30: CLRの基礎 - プログラミング .NET Framework 第3版 読書会

Shim

Shim = mscoree.dll

Assembly

CLR

Page 31: CLRの基礎 - プログラミング .NET Framework 第3版 読書会

• バージョンが上がるごとに再起動が必要だった

なぜShimが2重化したのか

C:¥

Windows

System32

Microsoft.NET

Framework

V5.x

これを更新するには、再起動が必要

ここなら大丈夫☺

Page 32: CLRの基礎 - プログラミング .NET Framework 第3版 読書会

今回やろうとしていること

コンパイル 読み込み 起動

Page 33: CLRの基礎 - プログラミング .NET Framework 第3版 読書会

起動

• CLR初期化

– AppDomainの作成

• EXEアセンブリのロード

• エントリー・ポイント・メソッド呼び出し

Page 34: CLRの基礎 - プログラミング .NET Framework 第3版 読書会

mscorlib

メソッドの呼び出し

a40.exe

Main() { var str = Console.ReadLine(): Console.WriteLine(str); }

Console

ReadLine JIT NTV

WriteLine JIT

メソッドテーブル

※メソッドテーブルはイメージです。実際のものとは多少異なる可能性があります。

JITCompiler JIT

IL

Native NTV

• 初回は、JITCompilerの呼び出し

• 2回目以降はキャッシュされたネイティブ呼び出し

Page 35: CLRの基礎 - プログラミング .NET Framework 第3版 読書会

今回やろうとしていること

コンパイル 読み込み 起動