.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 運行時 這應該是一個非常滿意的嘗試吧,結束!

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