国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

.NET程序在windows操作系統(tǒng)上獨(dú)立運(yùn)行的技術(shù)要點(diǎn)

2019-11-10 18:34:16
字體:
供稿:網(wǎng)友
.NET程序在windows操作系統(tǒng)上獨(dú)立運(yùn)行的技術(shù)要點(diǎn)作者:宇內(nèi)流云

    最讓.NET程序員苦惱的是,辛辛苦苦寫出來的.NET程序,需要客戶機(jī)上安裝了.NET才能運(yùn)行。僅為一個(gè)小小的應(yīng)用程序去下載上百兆的.NET安裝包,還得把它老老實(shí)實(shí)安裝到客戶機(jī)上,并占掉數(shù)百兆磁盤空間,這無疑是一件得不償失的事情。.NET程序的這個(gè)弱點(diǎn),也是影響.NET應(yīng)用程序普及和價(jià)值的一個(gè)重要因素。    所謂“獨(dú)立運(yùn)行”,是指.NET應(yīng)用程序脫離完整的.NET運(yùn)行環(huán)境,像c語言編譯的程序那樣,在操作系統(tǒng)上直接運(yùn)行。簡(jiǎn)單地說就是:客戶電腦無需安裝任何版本的.NET框架,你的.NET程序照樣可以在他的電腦或服務(wù)器上運(yùn)行。    .NET程序獨(dú)立運(yùn)行的基礎(chǔ)是mono運(yùn)行時(shí)以及它的程序集。mono是什么呢,mono是一款開源、免費(fèi)、可定制的跨平臺(tái).NET運(yùn)行環(huán)境,同時(shí),它還包含了一系列具有重要意義的實(shí)用工具,當(dāng)前最新的版本號(hào)是3.0.10,本文所采用的mono,即是這個(gè)版本號(hào)的windows版。

    那么,到底怎么才能讓你的.NET程序無障礙地在沒有安裝.NET平臺(tái)的客戶機(jī)“獨(dú)立運(yùn)行”呢,下面直奔主題。

一,建立跨平臺(tái)的.NET環(huán)境與編譯環(huán)境:    1、下載并安裝mono的windows版,建議將它安裝到c:/mono文件夾中。    2、安裝cygwin。       A、建議將它安裝到c:/cygwin文件夾中。       B、安裝時(shí),請(qǐng)將mingw-gcc、mingw-zlib、pkg-config、libiconv這幾個(gè)組件選上,這是將.NET程序轉(zhuǎn)化為本地程序的必要的編譯環(huán)境。

二,啟動(dòng)cgywin并設(shè)置環(huán)境變量:    1、點(diǎn)擊開始菜單或桌面上的cygwin圖標(biāo),啟動(dòng)且進(jìn)入cygwin環(huán)境。    2、輸入下面的命令,設(shè)置或修改必要的環(huán)境變量:       export PKG_CONFIG_PATH=/cygdrive/c/mono/lib/pkgconfig       export PATH=$PATH:/cygdrive/c/mono/bin

三,將你的.NET程序轉(zhuǎn)化為“獨(dú)立程序”

請(qǐng)注意,這是本文的關(guān)鍵所在,很多地方的操作都有別于其它網(wǎng)文和mono官網(wǎng)所介紹的操作技術(shù)。

1,復(fù)制文件。把需編譯的.NET EXE文件和對(duì)應(yīng)的DLL文件復(fù)制到你在cygwin的工作文件夾中,如果你的windows用戶名是xyz,那么這個(gè)文件夾就是 c:/cygwin/home/xyz/,(這一步不是必須的,如果你不怕麻煩而愿意多打字的話)。

2,轉(zhuǎn)換與打包。通過下面的命令,將.net程序和類庫打包并得到一個(gè)c程序源碼(假設(shè)你需要轉(zhuǎn)換的.NET文件是a.exe)。    mkbundle -c -o b.c -oo b.o a.exe -z    或者:    mkbundle -c -o b.c -oo b.o a.exe aa.dll c://mono//lib//mono//4.5//mscorlib.dll -z    或者:    mkbundle -c -o b.c -oo b.o --dept a.exe -z

3,修改得到的c文件:    這是本文的精華所在。    為什么要修改這個(gè)c文件,很簡(jiǎn)單:    A,不希望與exe文件相關(guān)的類庫全部打包到一個(gè)文件中,否則,太浪費(fèi),而且影響啟動(dòng)速度。    B,這個(gè)c文件是目標(biāo)程序的關(guān)鍵文件,我希望在中間加上自己的東西,讓我的程序如虎添翼。    C,我程序要在中文、日文這樣的含有非英文字母的文件夾中運(yùn)行。

3.1,需要添加和修改的內(nèi)容:    A,用VS或記事本打開b.c,把下面的代碼復(fù)制到main函數(shù)之前,作一個(gè)準(zhǔn)備。

    #include <dir.h>    #include "/usr/include/iconv.h"    int gbk_utf8(char *inbuf,int inlen,char *outbuf,int outlen){        iconv_t cd;        char **pin = &inbuf;        char **pout = &outbuf;        cd = iconv_open("utf-8","gbk");        if (cd == 0) return -1;        memset(outbuf, 0, outlen);        if (iconv(cd, pin, &inlen, pout, &outlen) == -1) return -1;        iconv_close(cd);        return 0;    }

   B、在main函數(shù)中,找到下面這兩行并注釋或刪除掉:   if (config_dir != NULL && getenv ("MONO_CFG_DIR") == NULL)      mono_set_dirs (getenv ("MONO_PATH"), config_dir);      C、接著,就在這行下邊,即“mono_mkbundle_init”一行之前,輸入下邊的代碼:

    const char* lib = "//lib";    const char* etc = "//etc";

    char p[strlen(argv[0])];    ws

    l = strlen(p) + strlen(lib);    char s_lib[l];    wsprintf(s_lib, "%s%s", p, lib);

    l = strlen(s_lib);    char* s_lib_utf8 = (char*)malloc(l*2);    memset(s_lib_utf8, 0, l*2);    gbk_utf8(s_lib, l, s_lib_utf8, l*2);

    l = strlen(p) + strlen(etc);    char s_etc[l];    wsprintf(s_etc, "%s%s", p, etc);

    l = strlen(s_etc);    char* s_etc_utf8 = (char*)malloc(l*2);    memset(s_etc_utf8, 0, l*2);    gbk_utf8(s_etc, l, s_etc_utf8, l*2);

    mono_set_dirs(s_lib_utf8, s_etc_utf8);

    接著在mono_mkbundle_init一行之后加入一行:    chdir("c://");

    最后,找到下面三行    #ifdef _WIN32    #include <windows.h>    #endif    并在“#endif”后加入一行:    #undef _WIN32

    改完了,存盤退出。    (有人會(huì)說“輸入這么多,為什么不寫個(gè)函數(shù)以方便我將來復(fù)用?”,我說,這不是我的事。)

3.2,編譯:    用下面這個(gè)命令生成你的目標(biāo)文件“b.exe”。    gcc -mno-cygwin -o b.exe -Wall b.c `pkg-config --cflags --libs mono-2|dos2unix` b.o -lz -liconv

四,程序、類庫、配置文件的組織:    這一步,是為你的程序安一個(gè)家,讓它真的能跑起來。

    1,在某個(gè)盤,比如D盤,建個(gè)文件夾,比如是“myapp”    把剛才編譯得到的目標(biāo)文件b.exe復(fù)制到D:/myapp文件夾中。    同時(shí)把c:/mono/bin/文件夾中的mono-2.0.dll、zlib1.dll、iconv.dll復(fù)制到d:/myapp中。

    2,組織類庫    在“d:/myapp”文件夾中,建lib和etc兩個(gè)子目錄。    在lib文件夾中,建名叫“mono”的文件夾。    在d:/myapp/lib/mono文件夾中,根據(jù)你.NET程序集版本號(hào)建一個(gè)文件夾,名字就是版本號(hào),比如“4.5”,當(dāng)然,你也可以把2.0、4.0也建好。    如果你沒有將mscorlib.dll打包到.EXE中,請(qǐng)將c:/mono/lib/mono/4.5/mscorlib.dll,復(fù)制到 d:/myapp/lib/mono/4.5這個(gè)文件夾中。    在d:/myall/lib/mono文件夾中,建一個(gè)名為gac的文件夾,這個(gè)文件夾是用來放你的程序需要的mono版.NET類庫的。    放些什么?放你的exe、dll文件中引用到的那些程序集的庫文件(如果你已經(jīng)把這些文件打包到了.exe中,那么你就不需要放任何文件)。    比如,你引用了System名字空間,那么,將c:/mono/lib/mono/gac文件夾下的System文件夾復(fù)制到D:/myapp/lib/mono/gac中就行了。

    3,組織配置文件    把c:/mono/etc文件夾中的“mono”文件夾復(fù)制到d:/myapp/etc文件夾中。    用寫字版打開config文件,找到并刪除下列三行:    <dllmap dll="gdiplus" target="/tmp/install/lib/libgdiplus.so" />    <dllmap dll="gdiplus.dll" target="/tmp/install/lib/libgdiplus.so" />    <dllmap dll="gtkhtml-3.0" target="libgtkhtml-3.8-15.dll"/>

    通過上面的幾個(gè)步驟,你的程序已經(jīng)變成了可以獨(dú)立運(yùn)行的程序了,你把d:/myapp這個(gè)文件夾壓縮打包,然后解壓到?jīng)]有安裝.net的電腦上,試試。

    可能有讀者會(huì)說,對(duì)本文某些地方不太理解或者有異議,那么,我歡迎討論。你可以在這些地方與我取得聯(lián)系:群號(hào)為103810355的QQ群里或者網(wǎng)址為www.linuxdot.net的網(wǎng)站上。

轉(zhuǎn)自:https://www.linuxdot.net/bbsfile-3354


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 柳州市| 布尔津县| 河东区| 卓资县| 宕昌县| 赤城县| 安岳县| 招远市| 卢氏县| 五河县| 新野县| 海阳市| 平罗县| 大新县| 包头市| 炉霍县| 华亭县| 永春县| 工布江达县| 海兴县| 莲花县| 青川县| 西贡区| 五家渠市| 双鸭山市| 新野县| 黔东| 大连市| 海伦市| 深泽县| 安泽县| 余庆县| 日照市| 大兴区| 西林县| 台东市| 崇礼县| 洛南县| 弥渡县| 萨迦县| 嘉鱼县|