欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
使用Mono Runtime Bundle制作安裝包讓C#桌面應用程序脫離net fram...

使用Mono Runtime Bundle制作安裝包讓C#桌面應用程序脫離net framework

作者:BAsil | 出處:博客園 | 2011/11/29 16:36:28 | 閱讀73

之前有一個(gè)C#版本和ios版本(支持下載學(xué)生名單,點(diǎn)名等更多功能,該版本未上app store)的教輔助手幫助學(xué)校老師提交成績(jì)到教務(wù)系統(浙大正方web版),一直打算用mfc寫(xiě)一個(gè)vc++版本的可以方便的在未安裝net framework的電腦上使用,前幾天看到一篇文章再談為什么要使用MONO  ,既然Unity3D游戲(mono內核)可以單獨打包脫離net framework,那我的教輔助手一定可以??墒窃诰W(wǎng)上找了一下,中文資料很少,沒(méi)有討論具體技術(shù)細節的文章( 讓C#程序獨立運行(脫離 .NET Framework運行,綠色運行) 是我在移植完成后寫(xiě)教程的時(shí)候看到的文章,我的思路和他不太一樣,我使用了mkbundle)。

教輔助手雖然功能比較簡(jiǎn)單,但是比hello world還是有技術(shù)含量的。我在測試打包的時(shí)候使用hello world沒(méi)有問(wèn)題,能夠脫離net framework正常顯示,但如果更復雜的功能和代碼以及引入第三方類(lèi)庫的話(huà),到底有沒(méi)有問(wèn)題,我心里沒(méi)底。 實(shí)際在我移植的過(guò)程中確實(shí)碰到很多問(wèn)題,這個(gè)是簡(jiǎn)單的測試hello world移植所解決不了的。因此我在解決問(wèn)題后,寫(xiě)下此文記錄一下。

先說(shuō)一下教輔助手的功能(由于工作原因無(wú)法放出該程序代碼),簡(jiǎn)單點(diǎn)說(shuō)就是要導入excel成績(jì)表并直接提交到教務(wù)系統的頁(yè)面中,為清楚列表如下

1 導入excel成績(jì)表

2 提交至web教務(wù)系統

3 可視界面操作

使用的相應技術(shù)

1 使用System.Data.Oledb訪(fǎng)問(wèn)excel并將取得內容放入System.Data.DataSet

2 使用System.Net.HttpWebRequest模擬教務(wù)系統登錄(該系統使用cookieless方式,所以需要先訪(fǎng)問(wèn)一次得到url中生成的sessionid),然后填入課程相關(guān)信息,模擬post提交,使用System.Text.RegularExpressions的正則表達式得到所有學(xué)生列表,并根據DataSet內容產(chǎn)生新的Post信息,再次利用post方式提交到教務(wù)系統中。

3 使用Winform窗口形式

相關(guān)軟件

window7 professional  64bit

Cygwin

net 2.0/3.5/4.0 framework

mono 2.10.6

gtk 2.12

MonoDevelop 2.8.2

下面說(shuō)一下我的具體過(guò)程

1 首先使用Mono Migration Analyzer(MoMA) 檢查已有代碼是否可以移植到mono上。我的代碼檢查通過(guò),但在后繼過(guò)程發(fā)現訪(fǎng)問(wèn)excel功能報錯,原因后面會(huì )說(shuō) 。個(gè)人感覺(jué)MoMA不是很靠譜。

2 使用mono編譯教輔助手源碼。 這里我使用了MonoDeveloper工具,當然也可以使用類(lèi)似csc.exe的mcs.exe命令行編譯方式。不過(guò)由于MonoDevelop沒(méi)有winform的設計器,而且winform是Win32技術(shù),兼容性在Linux下不是很好, mono建議使用GTK#這種第三方的Form技術(shù)來(lái)做UI,我這里為了使用MonoDeveloper把winform的代碼用gtk重寫(xiě)了,用了一個(gè)小時(shí)吧,代碼分層比較好,比較容易剝離。當然如果你習慣csc.exe的命令行方式,而且你的移植后的程序只在window下面運行,那你可以使用mcs.exe并且不需要gtk重寫(xiě)(未嘗試此種方式,感覺(jué)應該可行,如果哪位朋友有過(guò)相關(guān)經(jīng)驗,請告知)。

使用MonoDevelop要求安裝mono和gtk,這里要特別注意的是MonoDevelop可以選擇使用net framework還是mono進(jìn)行編譯,開(kāi)始我沒(méi)有注意我在MonoDevelop下使用net framework編譯運行成功,打包后在mono下運行總是出問(wèn)題,而且出錯信息始終為空,浪費了大量時(shí)間。

3 在MonoDevelop下選擇mono,編譯成功后運行失敗,報libgda錯誤,這里解釋下問(wèn)題出現的原因mono下的ole db應該是封裝了libgda,而且mono oledb 支持Sql Server,Oralcle,MySql,SqlLite,不支持Excel;至于為什么不支持Excel,很簡(jiǎn)單Excel實(shí)際上是通過(guò)COM訪(fǎng)問(wèn)的(這個(gè)是微軟的,*nix下不支持)。解決的辦法就是不用ole db,于是換用CodePlex上的ExcelDataReader,支持mono,ok。

4 MonoDevelop運行時(shí)正常而打包后運行時(shí)System.Net.HttpWebRequest出錯。在運行的時(shí)候發(fā)現HttpWebRequest無(wú)法正常工作,甚至簡(jiǎn)單的HttpWebRequest.Create(開(kāi)始懷疑過(guò)是cookie container以及url路徑問(wèn)題,均排除,痛苦過(guò)程不表)。解決的辦法是將machine.config文件一并打包。

參見(jiàn)Issue with embedding machine.config 實(shí)際上我們可以從machine.config發(fā)現相關(guān)HttpWebRequest的配置信息,該文件路徑:mono安裝目錄\etc\mono\mono版本號\machine.config。

5 mkbundle打包。 實(shí)際上4和5可以一并說(shuō),4中描述的問(wèn)題導致我頻繁的測試mkbundle,嘗試加載不同的dll。一度懷疑是打包時(shí)dll未正確包含所致,將所需的所有類(lèi)庫lib(system.web.dll、system.net.dll、gac目錄等)一并拷貝到運行目錄下,仍報錯且無(wú)任何錯誤提示,抓狂。這里犯了低級錯誤檢討一下,mono官網(wǎng)提到mkbundle是一種static linker方式,會(huì )將所用到的dll連同應用程序一并embed到一個(gè)exe文件中,實(shí)際上mkbundle后不再需要類(lèi)庫的dll。

mono的mkbundle使用Unix-like toolchain,所以要在window下使用mkbundle需要安裝cygwin(同樣痛苦的過(guò)程),選擇gcc-mingw, mingw-zlib, pkg-config,zlib(注意不要選gcc全部安裝,網(wǎng)上說(shuō)有問(wèn)題我試過(guò)也是如此,完全卸掉gcc只選擇gcc-mingw), 然后配置cygwin的~/.bashrc文件中配置

export PATH=$PATH:/cygdrive/c/Mono-2.6.1/bin
export PKG_CONFIG_PATH=/cygdrive/c/Mono-2.10.6/lib/pkgconfig

這里參考Can not compile simple C# application with mkbundle 非常詳細

結合我的實(shí)際使用說(shuō)明一下:

無(wú)法單獨使用mkbundle –o  –-deps 的方式使用mono runtime, 因為mkbundle有一個(gè)bug,詳見(jiàn) New: Mkbundle Fails Due To Missing Reference To G_utf16_to_utf8 (2.8.0, Windows XP) 如果直接使用會(huì )報

temp.c: In function `main':
temp.c:170: warning: implicit declaration of function `g_utf16_to_utf8'
temp.c:170: warning: assignment makes pointer from integer without a cast
temp.c:185: warning: assignment makes pointer from integer without a cast
/tmp/ccgvpEs0.o: In function `main':
/cygdrive/d/paco/jpegp4d-deploy/temp.c:170: undefined reference to
`_g_utf16_to_
utf8'
/cygdrive/d/paco/jpegp4d-deploy/temp.c:185: undefined reference to
`_g_utf16_to_
utf8'
collect2: ld returned 1 exit status
[Fail]

因此采用mkbundle -c和gcc -mno-cygwin的結合的方式

以下引自Can not compile simple C# application with mkbundle ,感謝Lavir the Whiolet

    • 執行: "mkbundle -c -o host.c -oo bundle.o --deps YourAssembly.exe <additional arguments>". 可選-z進(jìn)行壓縮. 完成后得到host.c和bundle.o文件.
    • 在host.c文件中移除_WIN32。增加#undef _WIN32如下:

      #ifdef _WIN32
      #include <windows.h>
      #endif

      得到:

      #ifdef _WIN32
      #include <windows.h>
      #endif
      #undef _WIN32
    • 執行: "gcc -mno-cygwin -o ResultantBundle.exe -Wall host.c`pkg-config --cflags --libs mono-2|dos2unix` bundle.o <additional arguments>". 如果你mkbundle 加了-z參數, 你必須在這步增加 –lz

我的補充

     (1) 執行mkbundle是需要embed machine.config的話(huà) 增加—machine.config C:\Mono-2.10.6\etc\mono\4.0\machine.config,參考mono project bundles

     (2) 如果引入第三方dll的話(huà)(比如我使用了第三方ExcelDataReader的excel.dll), 應該加到mkbundle 的<additional arguments>位置,參考Embedding a JavaScript interpreter with Mono

以我的mkbundle為例

     mkbundle –c –o host.c –oo bundle.o –deps myProgram.exe Excel.dll  --machine-config C:\Mono-2.10.6\etc\mono\4.0\machine.config

6 發(fā)布 

   生成的exe文件已經(jīng)embed mono runtime了,我的應用程序原來(lái)32k,使用-z壓縮生成后是5MB,有點(diǎn)大不過(guò)可以接受。但要脫離net framework在window上執行,還需要調用幾個(gè)文件,羅列如下(針對mono4.0,我一個(gè)個(gè)找的,是不是可以做個(gè)工具自動(dòng)查找依賴(lài)?)

freetype6.dll
glibsharpglue-2.dll
gtksharpglue-2.dll
intl.dll
libatk-1.0-0.dll
libcairo-2.dll
libexpat-1.dll
libfontconfig-1.dll
libgdk_pixbuf-2.0-0.dll
libgdk-win32-2.0-0.dll
libgio-2.0-0.dll
libglib-2.0-0.dll
libgmodule-2.0-0.dll
libgobject-2.0-0.dll
libgthread-2.0-0.dll
libgtk-win32-2.0-0.dll
libpango-1.0-0.dll
libpangocairo-1.0-0.dll
libpangoft2-1.0-0.dll
libpangowin32-1.0-0.dll
libpng14-14.dll
mono-2.0.dll
MonoPosixHelper.dll
zlib1.dll

總共16.9MB

7 后記

個(gè)人感覺(jué),雖然過(guò)程曲折了點(diǎn),但使用mono runtime讓軟件脫離net framework是完全可行的,而且應該是可以用到生產(chǎn)環(huán)境的,也希望mono越來(lái)越好。

-
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
ASP.NET 5是如何通過(guò)XRE實(shí)現跨平臺的
dll加入到GAC后,如何方便的調試
讓C#程序獨立運行(脫離 .NET Framework運行,綠色運行)
Eclipse平臺架構技術(shù)分析及基于RCP的應用研究
簡(jiǎn)析.NET Core 以及與.NET Framework的關(guān)系
.net core
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久