二、源代碼=>程式集及程式集概念介紹中介紹了源代碼通過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應用程式。