天天看點

三、加載公共語言運作時

二、源代碼=>程式集及程式集概念介紹中介紹了源代碼通過C#編譯器生成程式集(或者可執行應用程式exe)的整個過程,本文主要介紹公共語言運作時與程式集的關系.

1、通過C#編譯器編譯之後生成的每個程式集既可以是可執行程式(exe),也可以使dll(其中含有一組由可執行應用程式使用的類型),最終都由CLR來管理執行這些程式集中的代碼.這就意味者如果目标機器要想執行程式集,就必須安裝.Net Framework.大多數windows在發售時就已經安裝了.Net Framework.

2、win10下校驗.Net Framework環境

(1)、判斷是否安裝

C:\Windows\SysWOW64在目前路徑下判斷是否有下圖中的dll檔案

三、加載公共語言運作時

如果有,說明Net Framework已安裝

(2)、win10檢測所有安裝的.Net Framework版本,以及相關的程序Id

打開cmd,定位到clrver.exe檔案的路徑,執行clrver -all指令

win10下操作如下:

三、加載公共語言運作時

可以去任務管理器中校驗結果.

3、windows32位版本和64位版本對編譯器生成的托管子產品的影響以及對CLR運作時的影響

(1)、問題 

衆所周知,windows包含32位和64位兩個版本,是以相同的程式集代碼在這兩個環境下的會有差異.分析如下:

    相同點:如果程式集檔案中隻包含類型安全的代碼,那麼代碼在32位環境下和64位環境的windows中都能正常工作.源代碼不需要任何改動.(隻要安裝了.Net Framework,且代碼的類型安全,那麼編譯器生成EXE/DLL能同時在32位和64位下的windows中運作)

 不同點:如果你的項目中包含了類型不安全的代碼,比如面向特定CPU架構的非托管代碼進行互相操作,這個時候正常的做法可能無法滿足這個要求.

(2)、解決方案   -使用/platform指令行開關

為了幫助那些在程式集代碼中需要操作不安全代碼的開發人員,C#編譯器提供了一個/platform指令行開關選項.這個開關選項允許指定最終生成的程式集隻能在運作32位版本的windows下x86機器、隻能在運作64位windows的64位的x64機器上運作、或者隻能在運作32位的Windows RT的ARM機器上使用.如果不指定平台的話,預設就是anycpu,表明最終生成的程式集能在任何版本的windows上運作.

(3)、Visual Stdio中設定目标平台的方式

右鍵項目-屬性-生成

三、加載公共語言運作時

 (4)、項目指定目标平台後,編譯器的工作方式

項目指定目标平台後,C#編譯器生成的程式集會按照目标平台的配置生成相應的PE頭、要麼是PE32頭,要麼是PE32+頭,除此之外,還會在頭中指定要求什麼CPU架構(如果是anycpu,則代表任意cpu)

(5)、win10下使用MS提供的SDK指令行實用程式DumpBin.exe和CorFlags.exe來檢查編譯器所生辰的托管子產品的嵌入資訊

CorFlags.exe

打開cmd

三、加載公共語言運作時

 DumpBin.exe

三、加載公共語言運作時

(6)、項目指定目标平台後,windows執行通過編譯器生成的可執行檔案的方式

windows檢查檔案頭,判斷需要32位位址空間還是64位位址空間,PE32檔案在32位或64位位址空間均可運作,PE32+檔案則需要64位空間位址,windows還會查頭中嵌入的CPU資訊,確定目前計算機的CPU符合要求

三、加載公共語言運作時

注:windows的64位版本可以通過Wow64(Windows on Windows64)技術運作32位Windows應用程式。