MONO 如何打包 .NET程序獨立運行(winform篇)


.NET程序獨立運行是指運行.NET的電腦上,不需要安裝.NET框架。

.NET程序集“獨立運行”並非真正的獨立,它是運行在mono運行時基礎之上的。由於這個運行時可以獨立存在,所以,我們不需要在目標機上安裝.NET框架。

 

 

如上圖:

 

一,嵌入或未嵌入.NET程序集的用C/C++語言寫的主程序,這個主程序負責對mono運行時進行操作。同時還可配合.NET完成其它的任務(比如提供函數供.NET使用);

 

二,mono.NET運行時,這是一個動態庫文件(mono同時提供了靜態庫),是.NET程序集運行的關鍵條件。

 

三,MONO運行時的配置文件或文件夾(並不一定需要)。

 

四,外部的程序集沒有嵌入到C程序中的其它的相關.NET程序集。

“獨立運行”的過程是:

C語言通過mono提供的運行時api,調用mono運行時有關函數,通過mono運行時加載並運行.NET程序。

 

即:

C語言程序(your.exe) --à mono.NET運行時(libmonosgen-2.0.dll) --à .NET程序集

 

libmonosgen-2.0.dll,即是.NET程序集的運行條件,也是.NET程序集與C程序之間數據交流、函數互調的橋梁。

好了,有了以上的理論知識,下面我們就開始實踐一下吧
 
1.使用Xbuid命令編譯
 
2.把編譯后的net 運行文件  寫入到一個  char[] 變量中,並記下這個程序集的名稱,大小
mkpack H:\Csharp\Mono\Test\TestBuild\TestBuild\WindowsFormsApplication1\bin\Debug\WindowsFormsApplication1.exe
會生成3個文件
data.c 是.NET程序集的二進制內容
data_.c 是為了文件用戶調用的針對data.c的函數和變量
data.h  是data_.c的頭文件,是用戶c源碼必須的。
 
3. 將編譯data.c編譯為目標文件data.o
gcc -c -o data.o data.c
 
4. 將編譯data_.c編譯為目標文件data_.o
gcc -c -o data_.o data_.c -IC:/mono-3.2.3/include/mono-2.0
 
5. 將data.o和data_.o 合成為一個單一的靜態庫:data.a
ar rcs data.a data_.o data.o
 
6. 編譯test.c和連接data.a,生成 test.exe
gcc -o output\test.exe test.c data.a %GCC_OPT% -lmonosgen-2.0
 
最后的成果如下
 
winform 最基本的 lib 有以下幾個,添加到 lib\mono\gac 目錄下。
 
運行試試,沒有問題
 
那么最關心的事情來了。
這個文件打包了mono的.net 運行時,size有多大呢?
 
壓縮一下
 
相比傳統的打包.net 運行時 這應該是一個非常滿意的嘗試吧,結束!
 
output.rar

編譯后的程序:

 

 

如果大家覺得有需要,下篇文章我會寫如何的配置 打包環境。


免責聲明!

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



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