綠色版的Linux.NET——“Jws.Mono”(續)


前一篇文章中,我們簡略的介紹了jws.mono的安裝使用,以及我們如何自己動手做一個jws.mono出來。

在文章發表之后的幾天里,我一直覺得有點不妥之處,直到后來猛然的意識到:我們自己動手做的jws.mono雖然可以見到info頁面,但實際上卻是無法掛載任何的.NET站點的。因此這也有必要寫下這篇的續篇來對前面的疏漏進行填補。

馬上進入本節主題,在本節中我們主要講述:

  (1)、分析jws.mono的組成及相關組件的作用

  (2)、此mono非彼mono:bin目錄詳解


1、jws.mono組成及介紹

總的來說,jws.mono包含了兩個部分,jexus以及提供它運行環境的mono。下面是“jws.mono.tar.gz”解壓之后的組成(注:本篇文章針對的是前一篇中下載獲得的jws.mono,其他的可能結構不一樣):

直接開始分析吧,如上圖所示,jws.mono的根目錄包含了四個目錄,它們的作用分別是:

  bin:包含Mono編譯器的可執行文件目錄

  

  etc:包含.NET默認配置文件的目錄(machine.config等)

  jexus:顧名思義,放jexus的目錄

  lib:里面包含了.NET的程序集、我們編譯mono和libgdiplus所得到的so庫文件

目錄以及結構大概就是這樣,各位讀者分別點擊進入相關的目錄之后定會眼前一種熟悉的感覺。

 

2、bin目錄詳解

點擊進入到bin目錄:

各位讀者如果對比自己手上編譯得出的mono/bin目錄,這里的bin目錄就顯得輕量多了,是的,此處的bin目錄是經過裁剪,僅僅包含了提供.NET運行所需的核心組件,並沒有其他更多的東西。出了mono-sgen,其余均有腳本組成,而dmcs、gmcs以及mcs分別供給FramWork版本為4.0、2.0(3.5)以及4.5的程序的程序調用。

使用VIM打開其中一個腳本文件:

 這里面僅包含了一條命令,命令的作用是調用同級目錄下的mono,並指定它的framework版本。

回到文件目錄中,我們再仔細觀察一下文件“mono”的大小(有興趣的讀者可以看看自己編譯的Linux.NET中可執行文件“mono”的大小,相差甚大),大小只有1KB,顯然這個叫“mono”的文件絕不會是編譯器“mono”,只是一個同名的文件而已。
我在前文中曾說過,出了mono-sgen以外,其余的均是腳本文件,因此我們仍然可以繼續用Vim打開它:

 到了這里,我們已經一目了然了,這個“mono”文件的作用其實就是先設置並載入與Linux.NET運行相關的資源文件(程序集文件、machine.config等),然后把處理交給了“mono-sgen”處理(提示:mono-sgen里面包含了mono的JIT以及Sgen垃圾回收等組件,好東西)。

這一個文件很重要,我們所有的.NET程序的運行都要經過這一個文件,因此如果這個文件里面的參數(目錄之類的)有任何的差錯,都會導致我們的.NET程序無法編譯運行。

再留意“--runtime”這里,在此處,無論你使用的是那個版本的framework庫,其實在jws.mono運行時都是使用framework 4.0(事實上目前流行的CLR主要有2.0和4.0兩個版本,而在mono中CLR 4.0是可以兼容CLR 2.0的庫,MS.NET則不行)。


回到起點,開篇的時候,我提到的那個問題,各位讀者現在知道是什么原因造成的了嗎?


免責聲明!

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



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