【.Net Framework 體積大?】不安裝.net framework 也能運行!?原理簡介補充附帶工具-2


 

打包腳本+工具+運行時 全部分享哈。。。。。(無公司爭議,請放心)

精簡包:http://pan.baidu.com/s/1i5JpqdB

 工具:http://pan.baidu.com/s/1c1PUQK4

打包腳本:http://pan.baidu.com/s/1o84lYw6

注意,精簡版的SDK適合開發客戶端程序,服務器版本請安裝完整版本 謝謝!

如有疑問,請留言

 

接上一篇

【.Net Framework 體積大?】不安裝.net framework 也能運行!?開篇敘述-1

 

下一篇

【.Net Framework 體積大?】不安裝.net framework 也能運行!?原理補充-3

 

  昨天寫了一個引子,還是有讀者對這套“小把戲”感興趣。那么不辜負大家的希望,爭取博主不做太監........

  注意:筆者不想談Link的方式,雖然很爽,但是不靠譜。畢竟解析翻譯到原生的應用,微軟到現在也就敢在Xaml系的應用做嘗試,不知道是微軟的策略,還是自身都信心不大......

  至於Mono項目,筆者就不說它了,BUG真的多的一個接一個的,甚至2.0都過去了,3.0還沒有修復。雖然它可以支持Link ,mkbundle 工具,但是bug太多,不小心就是一個雷......

 

  開篇先談下原生的應用和虛機應用。

  Native的程序,大多基於特定的平台硬件系統的,這里的系統 我們就說三大主流系統中的Win/Mac/Linux。硬件部分嘛,主要是CPU的類型...原生應用跟隨操作系統的兼容性,可以類似插入內存條一樣,直接跟系統集成,運行速度快,處理數據速度效率高。開發語言:C/C++  匯編?(呵呵,這都上個世紀的東東)  。基於C/C++ 衍生出來 主流的 QT VC .....VC 里有衍生出個MFC。。。。。。。

  虛機應用,這類應用大多是基於虛機運行時,也就是將運行時 Run time SDK 安裝到適配的操作系統后,SDK將硬件 操作系統的不同 進行了自適應。應用開發者,只需要關注程序的運行效果。就好像坑坑哇哇的石頭牆,摸了一層水泥,然后上面可以搭載各種形狀的石頭,而不是特定形狀的石頭(去適應石頭縫大小形狀)。特點是:平台適應強 開發速度快 迭代周期縮短...。開發語言:Python Java .net Framework node.js .......

  虛機應用,又各自有各自的特定。有的是基於腳本執行,有的是強類型的編譯執行。不過大同小異。都離不開運行時!!!

  其他語言的運行時,我們不談,有興趣,自己研究。我們專門談一下.net 的運行時 .net Framework. 

  特點:微軟開發,大品牌。體積大,不能說大,簡直是巨大!前面說了,從2.0 的幾十兆 到3.5的幾百兆 到4.0又回到幾十兆(但是安裝速度真慢的要命,因為要先自解壓)。前面說了,十分佩服微軟的 cab 壓縮,愣是把一個幾百兆的.net 4.0  壓縮到了幾十兆!!!4.5 4.6也都是4系列的。主版本號不變,改變次版本號,說明只是基於4的補丁,但是要親命的是 4.5 拋棄了XP!!!!XP 啊,提到XP 就好像前端開發者對着IE6那個時代!!! 雖然痛苦恐怖,但是,XP在國內的使用群體依然大的離譜。

 

雖然 Win7普及的效果不錯,但是那畢竟是XP 啊  XP 啊 ............淚奔。

所以,筆者認為 .net 4到目前為止 是兼容最全面的Win 系列的系統。對於開發者來說 4版本無疑是一個划時代的東東,各種應用框架都有,而且性能比3.5好,而且體積小了好多。但是僅僅是相對小了。筆者認為,它依然巨大。相比較 Python Ruby Node.js Lua的運行時,都小巧,安裝速度快,運行速度也可以。憑啥.net 這個鬼 體積那么大!??

其實是有原因的。如圖:

 C:\WINDOWS\Microsoft.NET

 

 

 這個基本就是.net 的運行時集中營了(雖然在System目錄也打入了其他的dll,后面說)

看到這里,我們就需要回憶下,.net 的自身的架構

2.0

 

3.5

 

4.0

 

上圖來自:http://www.cnblogs.com/xiaopin/archive/2011/01/07/1929467.html

是不是類似搭積木的方式,一塊塊的耦合上去的?確實,一個完整的.net framework安裝包,需要把整個積木架構搭建起來。但是大多數情況下,我們只需要積木的台子,也就是到 第一個圖中的程序集那一層就完事,有GAC  有運行時 ,就足夠我們把程序集通過系統引導到 CLR 運行時解析 IL 中間語言到當前平台的原生代碼,並執行原生代碼。相當於,我們只需要雇佣一個翻譯,會翻譯其他語言即可,沒必要長得高大威猛帥。。。。

  那么我們能把上面的枝枝葉葉修建掉么?筆者測試是可以的。

  我們只需要把GAC 的相關程序集,還有運行時即可。然后就是特定的引導目錄+注冊表。

  筆者沒有找到.net 程序引導的順序,不過從筆者實驗的結果來看。微軟打包的程序的時候,給程序集打上了特殊的標識。然后由系統注冊表注冊的特定應用去解析程序集。類似指定默認程序一樣的效果(不知道表述是否正確,歡迎大家指正)。

  好,既然是指定的注冊表來注冊引導程序,那么哪個才是The One? 不賣關子,直接給答案!

  注冊表:SOFTWARE\Microsoft\.NETFramework\

  這個注冊表項,有一個安裝路徑的項,指定到.net的運行時目錄。筆者的機器是64位機器,x86的機器就沒有64.

 

 

 然后,注冊完路徑后,還有它下面的一個注冊表鍵值對:policy

注意其中的鍵值對:

 

這個支持策略,類似設計模式中的策略模式。根據特定的場景,使用特定的策略支撐。我們注冊4.0后,自然也就支持.net 4.0。

  好,注冊表關鍵就這2個,接下來還有關鍵的一個步驟,在系統目錄 

一個是箭頭指向的dll  還有一個

 

100那個是4.0的 120那個是筆者安裝了 VC 分布包的 VC++2013的。我們需要的是上面的那個哈。。。

 

好,把這兩個程序集 在特定的機器上,也打入進去后,好,我們的精簡版本的.net framework就完成了!!

然后,還可以在運行時程序集 目錄下,裁剪不需要的程序集 比如什么 exe的小工具啊 WCF 啊 WPF啊什么的。最終就可以粗來一個體積小巧,性能不錯,支持.net 4.0的運行時了。

也就是上面的3步走,有興趣自己嘗試,有疑問,請評論留言。筆者不會發布完整的小安裝包。版權的問題很蛋痛 呵呵,Congratulations..............

  啰嗦一下,為什么添加注冊表就能訪問策略進行引導,跟.net的歷史有關系吧,因為XP系統上面,就已經集成了1.X的.net framework.后續系統Vista win7 server03 08 等等也一樣。所以,注冊個版本號,也就可以識別粗來了。。。。。

   注冊表獻上:

 

 

Root: HKLM; Subkey: "SOFTWARE\Microsoft\.NETFramework";Permissions:admins-full; ValueType: string; ValueName: "InstallRoot"; ValueData: "{win}\Microsoft.NET\Framework\";Check:WebServerRuntimeNotInstall


Root: HKLM; Subkey: "SOFTWARE\Microsoft\.NETFramework\policy\v4.0";Permissions:admins-full;Check:WebServerRuntimeNotInstall


Root: HKLM; Subkey: "SOFTWARE\Microsoft\.NETFramework\policy\v4.0"; Permissions:admins-full; ValueType: string; ValueName: "30319"; ValueData: "30319-30319";Check:WebServerRuntimeHasNotV4SubKey

不要問我,上面是什么鬼,inno setup 又是什么鬼。盡情享用吧.........

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM