38
CLR Assembly and .N ET Deployment Featur es -- 電電電電 90 電電電電電電電電電 報報報 try 報報報報報報報報

CLR 、 Assembly and .NET Deployment Features

Embed Size (px)

DESCRIPTION

CLR 、 Assembly and .NET Deployment Features. -- 電算中心 90 年度第二學期讀書會 報告人 try 政治大學電算中心. 參考資料. [1]Thuan Thai,Hoang Q.Lam, “ .NET Framework Essentials ” ,O ’ reilly,June 2001 [2]Serge Lidin, ” Inside Micorosoft .NET IL Assembler ” ,Microsoft Press,2002 - PowerPoint PPT Presentation

Citation preview

Page 1: CLR 、 Assembly and .NET Deployment Features

CLR、 Assembly and .NET Deployment Features

--電算中心 90年度第二學期讀書會

報告人 try

政治大學電算中心

Page 2: CLR 、 Assembly and .NET Deployment Features

參考資料 [1]Thuan Thai,Hoang Q.Lam,“.NET Framework Essential

s” ,O’reilly,June 2001 [2]Serge Lidin,”Inside Micorosoft .NET IL Assembler”,Micr

osoft Press,2002 [3]”Microsoft .NET Framework FAQ”,Microsoft Corporatio

n,July 2001 [4]Gray Cornell,Jonathan Morrison,”Programming VB.NE

T: A Guide for Experienced Programmers”,Apress 2002 [5]Jesse Liberty,”Programming C#”,O’reilly, 2001 [6]Ben Albahari,Peter Drayton,Brad Merrill,”C#Essentials”,

O’reilly,2001

Page 3: CLR 、 Assembly and .NET Deployment Features

Presentation Agenda 本章學習目的及內容簡介 .NET 與 .NET Framework CLR 解析 .NET 可執行檔 .NET Deployment 特色 Assembly 觀念 VEE 結構探討 .NET 與 COM/Native Dll 的互通性

Page 4: CLR 、 Assembly and .NET Deployment Features

.NET與 .NET Framework .NET

.NET is Microsoft strategy for delivering software as a service.

.NET Framework An environment for building,deploying and running Web

Services and applications. 三個組成部份 :CLR 、 Framework classes 及 ASP.NET

Page 5: CLR 、 Assembly and .NET Deployment Features

CLR的定位 .NET 應用程式的執行時期環境 (Run-time) 提供 .NET 應用程式和底層作業系統的中間層

Page 6: CLR 、 Assembly and .NET Deployment Features

CLR和 JVM 很多書都拿 CLR 來和 JVM 類比,其實就直觀來看,兩者有很多差別。

Java 程式就實體上看來都是一個一個的 .class 檔。 .NET 程式都是標準 PE 格式的 exe 檔 ( 這裏面存的不是 Native Code!!) 。

我們要執行某一個 Java 程式時,要打 java (class名稱 )

.NET 程式和一般執行方式一樣,直接執行該 exe檔即可。

Page 7: CLR 、 Assembly and .NET Deployment Features

CLR和 JVM(2) Java 的 deploy 方式是以 class 檔為最小單位。 .NET 中 deploy 是以 assembly 為最小單位。 Java 的 class 檔中含 bytecode ,並沒有 metadata 。

( 所以 classpath 要在命令列中註明 ) .NET 的可執行檔中含 MSIL 及 metadata 。 Microsoft 的作品為了體貼使用者,隱藏了許多細節,對 Developer 來說,反而較不直觀。也是觀念不清的來源。

Page 8: CLR 、 Assembly and .NET Deployment Features

CLR的功能 Activate Objects 對 Objects 執行安全性檢查 (verifier) layout objects in memory(ClassLoader) JIT Compilation(JIT Compiler) Excution support and management

GC Debug security exception handling

Page 9: CLR 、 Assembly and .NET Deployment Features

Windows上的可執行檔 (PE/COFF)

Windows 上的可執行檔都必須遵循 PE/COFF 格式。 (Portable Excutable/Microsoft Common Object File Format) 。

標準的 PE 可執行檔分成二大部份 headers native image sections(.data,.rdata,.rsrc,.text)

Page 10: CLR 、 Assembly and .NET Deployment Features

Win32 PE

Page 11: CLR 、 Assembly and .NET Deployment Features

.NET的可執行檔 (.NET PE) 為了可擴充性, Microsoft 允許除了這些區段之外,在 PE 中自定新的 section 。

安裝 .NET 時,會將 OS 的 loader 換掉,換成認得 .NET PE 的 loader 。

.NET 正是利用擴充 section 的方式, .NET 的 windows loader 認得 .NET PE ,並將這些 sections 交由 CLR 處理。

這就是為何 .NET 應用程式也可以以 .exe 方式存在並直接執行的原因。

Page 12: CLR 、 Assembly and .NET Deployment Features

.NET PE

Page 13: CLR 、 Assembly and .NET Deployment Features

觀察 .NET的可執行檔 利用 dumpbin.exe 可以 dump 出 PE 檔案。 範例

win32:win32all.txt .net:helloall.txt

我們可以發現 .NET 的 section 都是在 section#1 。

Page 14: CLR 、 Assembly and .NET Deployment Features

.NET Deployment 特色 Side by side excution

Any versions of the same shared assembly to execute at the same time,on the same system,even in the same process 。( 在同一個 Process 或系統中,不同版本的同名 Dll 檔案可以同時被存在並被執行 ) 。

Page 15: CLR 、 Assembly and .NET Deployment Features

範例 :Assembly generation utility(al.exe)

al.exe /flags:0x0000 完全 Side By Side al.exe /flags:0x0010 ,同 ap 內不可多版本並存 al.exe /flags:0x0020 ,同 Process 內不可多版本並存

al.exe /flags:0x0030 ,同電腦內不可多版本並存

Page 16: CLR 、 Assembly and .NET Deployment Features

.NET Deployment 特色 (2) Xcopy deployment

Assembly 具有自我描述功能,所以免註冊。 為何具有自我描述功能 ? 以 assembly 中的 metadata 來取代 registry 功能。

什麼是 assembly? 什麼是 metadata?

Page 17: CLR 、 Assembly and .NET Deployment Features

Managed Compiler

指將 .NET 語言 compile 成「 abstract intermediate form 」的工具。如 VB.NET 的 vbc.exe, VC#.NET的 csc.exe 等。

abstract intermediate form 包括二部份 Metadata( 描述程式之結構及相關資訊 ) Managed code(MSIL)

Page 18: CLR 、 Assembly and .NET Deployment Features

Managed Code Managed 指由 CLR 來管理及執行的程式碼。 Managed Code 有三個部份由 CLR 來管理

Type control: 檢查型別、轉換型別。 Exception Handling GC( 記憶體回收 )

Page 19: CLR 、 Assembly and .NET Deployment Features

Assembly 觀念 什麼是 Assembly 什麼是 module Assembly 執行過程 Manifest Assembly Identities Shared Assembly

Page 20: CLR 、 Assembly and .NET Deployment Features

Assembly及Module Assembly

.NET 中 Deploy 及 Versioning 的最小單位。 指一個功能完整的 .NET 應用程式。 (managed)

Module 泛指一個可 .NET 執行檔 (.exe) 、 .NET library(.dll) 或其它資源。 ( 必須為 managed code)

藉由 metadata 描述和其它 modules 的關係。 一個 Assembly 可以只包含一個或多個 Modules 。

Assembly 程式進入點所在稱為 Prime Module 。

Page 21: CLR 、 Assembly and .NET Deployment Features

Assembly及Module

Page 22: CLR 、 Assembly and .NET Deployment Features

Manifest Manifest 就是 Assembly 的 metadata 。 Manifest 內含資訊

assembly 相依程式碼的位置 組成 assembly 的各檔案檔名 Assembly 相依程式碼的 metadata assembly 的版本資訊 型別資訊

Page 23: CLR 、 Assembly and .NET Deployment Features

Assembly Identities 在 COM 時代,使用 GUID 來做為 Component 的唯一識別碼。但一長串的數字實在不容易記。

.NET 的 private assembly 引進 namespace 的觀念來做唯一識別 ( 類似 Java 的 Package) 。但仍不能區分同一支程式的不同版本。

因此,若一個 assembly 要由其它的 .NET 程式共享時,必須由 Strong Name 來做識別。

什麼是 Strong Name

Page 24: CLR 、 Assembly and .NET Deployment Features

Strong Name

.NET 中的唯一識別採用 PKC(public key cryptography)

Strong name 的認証過程 Application creator 利用 assembly 中的「 manifest 」做出一個 hash code ,我們稱之「 original hash 」。

利用 private key 將「 original hash 」 加密成「 encrypted hash 」。

「 Encrypted hash 」及 Application creator 的「 public key 」隨著 assembly 的 manifest 發行。

Page 25: CLR 、 Assembly and .NET Deployment Features

Strong Name(2) 執行者以 Application creator 的「 public key 」對「 Encrypted hash 」做解密,得到「 original hash 」 。

執行者以 assembly 中「 manifest 」做出一個「 original hash 」

執行者比對這二個「 original hash 」一不一致。

Page 26: CLR 、 Assembly and .NET Deployment Features

Shared Assembly GAC(Global Assembly Cache)

放置重要的系統共享檔案 有可能帶來和傳統 registry 一樣的問題。

建議只在二種情況之下將 assembly設為 shared assembly 這個 assembly 一定要被好幾個 Application 所共用。 這個 assembly需要高安全性。 ( 只有 administrator 可以動 GAC 中的檔案 )

Page 27: CLR 、 Assembly and .NET Deployment Features

VEE結構

Page 28: CLR 、 Assembly and .NET Deployment Features

Class Loader OS loader 認出 .NET PE後,將控制權交給 CLR 。此時 ClassLoader 會起來,找到並載入含進入點Main() 的 Class 。

其它的 Classes 在第一次被參考到時也會被載入。 ClassLoader 如何找到 Classes: 目前目錄之 .config 、

GAC 及 metadata(manifest) 。

Page 29: CLR 、 Assembly and .NET Deployment Features

Method stub Class Loader 將 classes放入記憶體中後,會在每個 class 的 method加上一個 stub ,這個 stub 有二個作用 : 用來辨別這個 method 是否已被 JIT Compilation 。 標明這個是 managed/unmanaged code

Page 30: CLR 、 Assembly and .NET Deployment Features

JIT Compiler .NET PE 中所包含的不是 native code ,而是 meta

data 及 IL 。 直到 method第一次被執行前才會由 JIT 將 IL 轉成 managed native code 。 ( 如何得知第一次被執行 ? 利用 method stub)

Compile 完後將 method 的 native code 之位址存回method stub 中。

Page 31: CLR 、 Assembly and .NET Deployment Features

JIT Compiler(2) 這些編譯後的 native code 何時被消除

直到這個 process shutdown ,並由 GC 程序將 process所 reference到的 memory 都回收。

Pre-JITing 使用 ngen.exe: 安裝時期先行編譯。

Page 32: CLR 、 Assembly and .NET Deployment Features

Verifier Verifier 是 JIT Compiler 的一部份。 Class Loader 將 Class load 進來之後, verifier 會進行檢查。 metadata 是不是 well-formed IL Code 是否 Type Safe

Page 33: CLR 、 Assembly and .NET Deployment Features

Execution Support & Management GC Security management Code management(控制程式碼的執行 ) Exception management debug/profiling( 提供 debug/profile 的 API) marshaling management thread management

Page 34: CLR 、 Assembly and .NET Deployment Features

觀念整理 :Assembly執行過程

Page 35: CLR 、 Assembly and .NET Deployment Features

.NET與 COM/Native Dll的互通性 呼叫 .NET元件

Regasm.exe: 將 .NET Assembly 註冊到系統的 registry中。

tlbexp:產生該 Assembly 的 type library 然後 VB/VC 就可以用呼叫一般 COM元件的方式來使用這個 .NET元件了。

呼叫 COM元件 tlbimp.exe: 為 com 元件產生一個 .NET PE 的 stub 。

( 會產生一個 dll 檔 ) 對這個 .NET stub 的呼叫都會被轉成對 COM 的呼叫。

Page 36: CLR 、 Assembly and .NET Deployment Features

Summary .NET 和 Java 執行方式並不相同, CLR 及 JVM安裝在平台上的方式也不相同。安裝 CLR後對整個作業系統影響較大。 (ie.把 OS 的 loader給換掉了 ) 。

.NET 的程式利用 metadata 取代傳統的 registry 方式來描述自己。從而減少了 dll hell 的發生機會。

所有 .NET 的程式經過 managed compiler後都會變成 IL ,因此可達到跨語言的功能。但是變成XX.NET 的語言都要符合 CTS才行。

CLS 的標準只有部份被 ECMA 接受。

Page 37: CLR 、 Assembly and .NET Deployment Features

Summary(2) 所有 .NET 程式語言都使用相同一組 library ,所以只要學習一種 .NET 語言,其它語言都相當容易上手。

在 windows平台上無論是易用性及效能 .NET 都有出色的表現。移植到其它 OS 上表現能否一樣出色則尚待觀察。

Page 38: CLR 、 Assembly and .NET Deployment Features

Q & A