|
一只可愛的猴子:
一次偶然的機(jī)會碰到這只猴子,并在工作中也用到它了。現(xiàn)將自己的使用經(jīng)驗(yàn)分享與此(以O(shè)penSUSE為例介紹)。
對于不熟悉Mono的朋友來說,Mono就是.NET在Linux和其它操作系統(tǒng)上的實(shí)現(xiàn)(Unix、Mac、iphone、Windows...)。Mono的官方網(wǎng)站是:http://www.mono-project.com
嚴(yán)格來講,Mono是一個(gè)開源的、跨平臺的C#語言和其CLR的實(shí)現(xiàn),并與微軟的.NET二進(jìn)制兼容。很繞口吧,這是Mono官方網(wǎng)站寫的:Anopen source, cross-platform, implementation of C# and the CLR that isbinary compatible with Microsoft.NET。
Mono最新的版本是Mono2.6, MonoDevelop最新的版本是MonoDevelop2.2
說到Mono,不能不提MiguelDeIcaza,這位大牛是Mono項(xiàng)目的發(fā)起者,此人也是GNome的創(chuàng)始人之一,并創(chuàng)建了Ximian公司,此公司連同Mono后被Novell公司收購,并擔(dān)任Novell公司開發(fā)者平臺副總裁,這是這位大牛的博客http://tirania.org/blog/。Novell公司是Mono的贊助者和主推者,并在其桌面版LinuxOpenSUSE將Mono作為默認(rèn)配置,更要命的是,Novell也將Mono作為其服務(wù)器版LinuxEnterprise的默認(rèn)配置,由此可見Novell的雄心勃勃。
只談Mono似乎是不夠的,和.NET一樣,Mono也有與VisualStudio一樣強(qiáng)大的集成開發(fā)環(huán)境IDE
MonoDevelop。MonoDevelop大大的提升了開發(fā)效率,這也是選擇Mono的主要原因。
根據(jù)我的想法,現(xiàn)在總結(jié)一下Mono的使用場合:
1.與其它語言相比更熟悉.NET或熱愛.NET,且需要在Linux做開發(fā)(我就是屬于這種情況^_^)
2.節(jié)省開發(fā)成本,因?yàn)楣釼isualStudio就比Windows賣的還貴,而且價(jià)格還要受License限制,當(dāng)然,盜版猖獗的中國大陸,開發(fā)似乎是零成本,可以說沒幾個(gè)公司用的是正版的VisualStudio開發(fā)。這也是Mono在中國不被看重的原因,大家都只是因?yàn)樾缕娑鴮ono閑聊一番。
3.移植Windows上的.NET程序到Linux上
也許有人擔(dān)心Mono的穩(wěn)定性,其實(shí)國外已有很多Mono開發(fā)的應(yīng)用,具體可以參考http://www.mono-project.com/Companies_Using_Mono,這里不僅有小的桌面工具,也有服務(wù)器級的應(yīng)用。
也有人擔(dān)心Mono的版權(quán)問題,由于C#已經(jīng)是國際標(biāo)準(zhǔn),問題主要集中在ADO.NET和WinForm上。目前微軟是與Novell在Mono上進(jìn)行著合作,但不能保證將來微軟的威脅。當(dāng)然,Novell也有自己的措施來處理。比如,采用GTK#編寫GUI程序。但微軟也提出了一項(xiàng)“CommunityPromise”的專利許可,并與2009年7月6日正式apply(不知道怎么翻譯),其針對ECMAC# 和 ECMA CLIstandards。具體參考http://www.mono-project.com/news/archive/2009/Jul-06-1.html和http://www.microsoft.com/interop/cp/default.mspx
當(dāng)然,Mono也包含ASP.NET,因?yàn)閃indows帶有Web服務(wù)器IIS,Mono也自帶一個(gè)叫XSP輕量級的Web服務(wù)器,XSP也是用100%純C#實(shí)現(xiàn)的。我認(rèn)為XSP主要用在實(shí)驗(yàn)室或小型網(wǎng)站,其最大的優(yōu)點(diǎn)是能在MonoDevelop中進(jìn)行調(diào)試。若做商用的網(wǎng)站或Web服務(wù),可以考慮Apache+mod_mono方式,mod_mono是為Mono的ASP.NET開發(fā)的用于Apache上的模塊,其功能類似IIS中的wp_ASPNET。
Mono幫助文檔:由于Mono中文資料比較少
對于Mono開發(fā)過程中遇到問題,可以查看Mono的在線文檔http://mono-project.com/Start,或者去MonoForum發(fā)帖http://go-mono.com/forums/(先google一番,因?yàn)樽约河龅降膯栴}別人已經(jīng)遇到過)
若在Linux中使用Mono,可以采用在本地(Windows)安裝Linux虛擬機(jī)或者使用XManager遠(yuǎn)程到Linux服務(wù)器2中方式。
1-在本地安裝Linux虛擬機(jī):
安裝VmWareWorkStation
下載地址:http://www.vmware.com/cn/
也可以下載含有Mono的虛擬機(jī)鏡像文件http://www.go-mono.com/mono-downloads/download.html,這樣就可以直接安裝免費(fèi)的VMPlayer就可以了,不用再創(chuàng)建并安裝虛擬機(jī)了。
安裝虛擬機(jī)前,需要進(jìn)入Bios,設(shè)置VIRTULIZATION為ENABLED
2-如果Linux服務(wù)器在遠(yuǎn)程的話,需在本地安裝Xmanager并在遠(yuǎn)程Linux上配置XManager,在Linux上配置Xmanager如下所示:
1)修改運(yùn)行級別為5,可先運(yùn)行runlevel命令,如果輸出N5就不用改了,若不是,修改/etc/inittab,改變r(jià)unlevel為5,例如
[root@sys]#cat /etc/inittab
id:5:initdefault:
2)編輯/etc/X11/xdm/Xaccess,去掉這一行的注釋:
# *#any host can get a login window
改為
*#any host can get a login window
3)編輯/etc/X11/xdm/xdm-config,注釋掉這一行:在displayManager.requestPort:0前面加上一個(gè)!號,結(jié)果如下
DisplayManager.requestPort:0
!DisplayManager.requestPort:0
4)編輯/etc/opt/gnome/gdm/gdm.conf,在[xdmcp]部分,修改Enable為true,
[xdmcp]
Enable=0(或false)
改為
[xdmcp]
Enable=1(或true)
取消這一行的注釋:
#Port=177
改為
Port=177
5)編輯/etc/sysconfig/displaymanager,有兩個(gè)相關(guān)變量:DISPLAYMANAGER_REMOTE_ACCESS和DISPLAYMANAGER_ROOT_LOGIN_REMOTE,根據(jù)自己的需要進(jìn)行修改。
6)最后,如果我們的Linux機(jī)器配置有防火墻,為防止防火墻將通過177端口(即xdmcp服務(wù))的數(shù)據(jù)過慮,我們必須加上如下的規(guī)則:
iptables -A INPUT -p udp -s 0/0 -d 0/0 --dport 177 -j ACCEPT
7)rcxdm restart
本地xmanager的設(shè)置:
1,運(yùn)行xbrowser。
2,new一個(gè)新的session
3,選擇XDMCP
4,Method中根據(jù)自己與主機(jī)所處網(wǎng)絡(luò)類型設(shè)置,比如是否是局域網(wǎng)等等
如果自己與主機(jī)不在同一網(wǎng)段,Method設(shè)置為XDMQuery
host中寫入linux服務(wù)器的ip地址port默認(rèn)177
5,next->next->finish
如果連接不上,請輸入命令NETstat –ln | grep177,查看177端口是否處于監(jiān)聽狀態(tài)。
安裝Mono
由于OpenSUSE或SUSEEnterprise默認(rèn)安裝了某一版本的Mono,如果想要用最新版本Mono的話,不需卸載以前的版本,直接安裝新版本的Mono即可。
安裝Mono可以采用以下2種方式:
1-用YAST在線升級,這種方式適合電腦連接到InterNET上。
打開YAST->軟件管理,選擇所有和Mono有關(guān)的安裝包,進(jìn)行安裝。
若采用其它安裝源,則打開YAST->安裝源,添加新的安裝源。
2-下載rpm包到本地然后升級
首先到http://ftp.novell.com/pub/mono/download-stable/SLE_11/下載所需要的版本和文件的rpm包到本地目錄mono_full中。
安裝mono_full中的文件,步驟如下:
打開YAST
打開“安裝源”
點(diǎn)擊“添加”,選擇“包目錄”,瀏覽到mono_full目錄的地址(包括mono_full),若彈出窗口,點(diǎn)擊“繼續(xù)”
不要選擇“與Zenworks同步更改”,即把“叉”去掉
點(diǎn)擊“完成”
打開“軟件管理”
在左上角的“過濾器”中選擇“安裝源”
在下面的窗口中選擇剛才創(chuàng)建的安裝源
選擇菜單“軟件包”->“此列表中的全部內(nèi)容”->“安裝”
選擇右下角的“接受”
在彈出的窗口中在各項(xiàng)均選擇“僅在此忽略此需求”
點(diǎn)擊“確定”,在彈出的窗口中點(diǎn)擊“繼續(xù)”
安裝完成后,可以打開MonoDevelop看看成果。^_^
Mono的組成文件
下面介紹一下Mono各個(gè)模塊在Linux中的路徑,包括GAC文件夾:
Mono運(yùn)行時(shí)環(huán)境runtime
/usr/lib/mono/1.0
/usr/lib/mono/2.0
/usr/lib/libmono.so
/usr/lib/libmono.so.0.0.0
/usr/lib/libmono.so.0
/usr/bin/mono
/usr/bin/mono32
/usr/bin/mono-find-provides
/usr/bin/mono-find-requires
Mono編譯環(huán)境
/usr/bin/mcs
/usr/bin/gmcs
/usr/lib/mono/1.0/mcs.exe
/usr/lib/mono/1.0/mcs.exe.config
/usr/lib/mono/2.0/gmcs.exe
/usr/lib/mono/2.0/gmcs.exe.config
/usr/share/doc/packages/sensors/chips/bmcsensors
/usr/share/man/man1/mcs.1.gz
/usr/share/vim/vim64/print/dec-mcs.ps
Mono配置文件
/etc/mono/1.0/machine.config
/etc/mono/2.0/machine.config
MonoGAC文件
/usr/lib/mono/gac/
MonoDevelop安裝路徑
/usr/lib/monodevelop/
安裝apache2和mod_mono
與安裝Mono一樣,將apache2和apache2-mod_mono安裝上。
打開MonoDevelop,新建一個(gè)ASP.NET程序,并報(bào)存在/home/mazhi/cmd目錄下
配置apache2
打開apache2的config文件:/etc/apache2/httpd.conf,在里面加上以下行:
Include /etc/apache2/mod_mono.conf
并添加以下行:
Alias/website /home/mazhi/cmd
MonoApplicationsConfigFilewebsite /home/mazhi/cmd/website.webapp
MonoServerPathwebsite "/usr/local/bin/mod-mono-server2"
Allowfrom all
Orderallow,deny
SetHandler mono
MonoSetServerAlias website
具體配置請參考http://www.mono-project.com/Mod_mono
啟動Apache服務(wù)
sudo/sbin/service apache2 restart
注意:在apache部署ASP.NET程序時(shí),ASP.NET程序的所有層次的文件夾和文件的other權(quán)限都必須配置Execute權(quán)限,例如將/home/mazhi/cmd所有層次的文件夾和文件的other權(quán)限都配置Execute權(quán)限
另外,如果在程序中使用log4NET的時(shí)候,將包含log文件的所有層次的文件夾的other權(quán)限配置write權(quán)限
訪問Oracle數(shù)據(jù)庫的問題
如果ASP.NET程序訪問Oracle數(shù)據(jù)庫,存在以下2種可能的情況,1是ASP.NET與Oracle安裝在同一臺機(jī)器上,2是ASP.NET與Oracle安裝在不同的機(jī)器上。如果是第2種情況,則需要安裝instantclient的Oracle數(shù)據(jù)庫訪問組件。在Oracle的官方網(wǎng)站下載basic-11.1.0.70-linux-x86_64.zip或oracle-instantclient11.1-basic-11.1.0.7.0-1.x86_64.rpm進(jìn)行安裝。例如安裝在/opt/oracle/目錄中。
添加Oracle數(shù)據(jù)連接庫文件
安裝后,/opt/oracle/oradb/home/lib存放Basic和sqlplus的各種庫文件,在/etc/ld.so.conf文件中添加路徑/opt/oracle/oradb/home/lib,還有就是在此目錄下為libclntsh.so.11.1庫文件建個(gè)軟連接
ln-s libclntsh.so.11.1 libclntsh.so
讓代碼連接動態(tài)庫的時(shí)候能找到庫文件。再執(zhí)行l(wèi)dconfig命令
配置Oracle數(shù)據(jù)庫環(huán)境變量
系統(tǒng)級配置在/etc/profile文件中
用戶級配置在/root/.bash_profile或/home/someuser/.bash_profile文件中
根據(jù)需要,在以上2個(gè)文件中的1個(gè)文件中添加以下行:
ORACLE_BASE=/opt/oracle/oradb;export ORACLE_BASE
ORACLE_HOME=$ORACLE_BASE/home;exportORACLE_HOME
ORACLE_SID=imapdb;exportORACLE_SID
NLS_LANG=American_america.zhs16gbk;exportNLS_LANG
PATH=$ORACLE_HOME/bin:$PATH;exportPATH
TMP=/opt/oracle/tmp
TMPDIR=/opt/oracle/tmp
exportTMP TMPDIR
umask022
解決連接Oracle數(shù)據(jù)庫出現(xiàn)Couldnot allocate the Oracle environment錯(cuò)誤
MonoASPX鏈接Oracle數(shù)據(jù)庫出錯(cuò)“Couldnot allocate the Oracle environment“
修改mod-mono-server的腳本文件,用gedit打開/usr/bin/mod-mono-server2文件,添加以下行:
ORACLE_BASE=/opt/oracle
ORACLE_HOME=$ORACLE_BASE/9.2
NLS_LANG=POLISH_POLAND.EE8MSWIN1250
LD_LIBRARY_PATH=$ORACLE_HOME/lib:$LD_LIBRARY_PATH
LIBPATH=$ORACLE_HOME/lib
LD_LIBRARY_PATH_32=$ORACLE_HOME/lib32
PATH=$PATH:$ORACLE_HOME/bin
LD_ASSUME_KERNEL=2.4.19
LANG=pl_PL.iso88592
exportORACLE_BASE ORACLE_HOME ORACLE_SID LD_LIBRARY_PATH LD_LIBRARY_PATH_32PATH LD_ASSUME_KERNEL NLS_LANG LIBPATH
LANG
beforeline
exec/usr/local/bin/mono $MONO_OPTIONS"/usr/local/lib/mono/2.0/mod-mono-server2.exe" "$@"
這樣就可以連接到Oracle數(shù)據(jù)庫了。
(全文完)
NET技術(shù):在Mono中創(chuàng)建ASP.NET程序,轉(zhuǎn)載需保留來源!
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請第一時(shí)間聯(lián)系我們修改或刪除,多謝。