1. 程式人生 > >使用MONO在MAC OS上開發——同步日誌(二)

使用MONO在MAC OS上開發——同步日誌(二)

上一篇使用MONO在MAC OS上開發——同步日誌(一)講述了在MAC OS讀取配置檔案以及寫日誌,那麼只算是完成了基本的配置,下面的才是重點。

由於時間關係,就簡單描述下,並不具體分析原始碼。最後奉上原始碼。

一:安裝

第一步,安裝MONO框架。你可以在MONO官網去下載。注意“MonoFramework-MRE-2.10.5_0.macos10.xamarin.x86.dmg”在低版本MAC OS上執行有問題。建議安裝“MonoFramework-MRE-2.10.4_0.macos10.xamarin.x86.dmg”檔案。

第二步,執行程式。將可執行程式“MonitoringApp”複製到電腦桌面,雙擊執行。

注:在MONO提供的開發工具(MonoDevelop)中,編譯後會生成“MonitoringApp”指令碼。用記事本開啟,就會發現如下程式碼:

#!/bin/sh

exec mono "/Users/PRODUCTION/Desktop/App/lib/MonitoringApp/MonitoringApp.exe" "[email protected]"

通過這段AppleScript,就明白了利用MONO在Mac OS上執行.NET程式的原理了,還包裝了一層殼,一層你蛻不掉的殼——通過在終端上執行的AppleScript來啟動MONO虛擬機器,然後執行MonitoringApp.exe。這段AppleScript是通過終端執行的,帶來了以下麻煩:

1)寫死的路徑。比如我將MonitoringApp檔案移動位置,就不能運行了,因為這段指令碼中,路徑是死的。當然你可以去學習AppleScript,然後去搜MonitoringApp.exe檔案,然後執行。但是對於只有3天時間的我,顯然是不可能的。

2)無法脫離終端執行。但是AppleScript啟動的程式無法脫離終端執行。打個比方,你將終端關了,OK,你的程式也關了。這問題當時我一直沒解決,現在想解決,卻沒蘋果電腦測試了。

二:環境配置

第一步,配置配置檔案。配置檔名字必須是“Configuration.txt”。本目錄提供了一個參考檔案。具體引數說明如下:
    MonitoringDirectoryType:目錄型別,僅支援兩個值(Immediate、Cycle)。Immediate表示即時監控(預設值),Cycle表示週期監控。   
    Path:監控目錄路徑。必須是存在的路徑。
    TargetPath:目標目錄路徑。可以是遠端目錄路徑。不能使用SMB路徑,而應該是用如“/Volumes/mes_data/n81a”的型別。
    IncludeSubdirectories:是否涵蓋子目錄。
    Filter:過濾字串。如“*”表示監控所有檔案,“*.txt”表示監控所有的文字檔案。
    BackupPath:備份路徑。
    BackupExpired:備份過期時間。單位是天。必須為整數。預設值30天。
    CycleMinutes:週期迴圈時間。單位是分。 必須為整數。預設值60分鐘。
    注意事項:
        1)8個配置缺一不可。必須全部配置,並寫值。
        2)支援多個目錄。但是要求所有的值都以多個的形式表示,如“['Immediate','Cycle']”表示兩個目錄,相應的其他配置項也必須寫兩個值。
        3)所有的符號必須為英文符號。值必須用單引號括起來。
        4)有些值只對某種型別起作用,比如CycleMinutes只對MonitoringDirectoryType為Cycle的型別目錄起作用,因此當目錄型別為Immediate時,值屬於無效狀態。
        5)配置名以冒號結束。配置值涵蓋在中括號中。
        6)每個配置項配置完成前,請不要換行。每個配置項之間請換行。程式是按行讀取配置項的。
        7)配置名和配置值不區分大小寫。

    配置完配置檔案後,請將檔案複製到系統使用者的根目錄下。如“/Users/nzocnzoc”。

注:其實上面的都是屁話,具體的你還是自己看程式碼吧。值得注意的是,最好你所有的文字都用英文,否則複製過去可能都是亂碼,即使設定了語言為中文也不行。

第二步,配置開機啟動。請先將程式拖入對應使用者的登陸項裡。具體設定在:【系統偏好設定(System Preferences)】->【使用者賬戶(Accounts)】->【登陸項(Login Items)】。然後再連線遠端伺服器。具體配置在【前往】->【連線伺服器】中配置,請使用記住密碼(切記)。配置完畢,然後將目標目錄拖入至目標使用者的登陸項中,如此,就能在開機啟動時自動連線遠端目錄。
    注意:由於網線連線或者WIFI連線相對緩慢,在登陸項中,請將遠端目錄的位置儘量移後,以便有充足的時間來緩衝。沒辦法,這是個比較蛋疼的辦法,但是總歸是實現了開機啟動而且連上了遠端目錄。
第三步:重啟電腦,測試是否成功。一定要測試是否檔案能夠上傳到遠端目錄。

三:問題診斷。

如果檔案沒有成功上傳,程式又沒有提供異常提示,請先參考“/Users/當前使用者”路徑下的Data目錄中的錯誤日誌。

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

其實這個專案程式碼倒是很簡單,1天不到就可以寫完,但是移植到Mac OS上問題就來了。很多時候,我們都說MONO可以跨平臺,事實上也是可以的,但是問題卻很多。

  1. 程式碼必須全部用英文,包括註釋,否則移植可能會出亂碼。
  2. 需要在Mac OS上使用MonoDevelop(MONO的開發工具)編譯生成。
  3. Mac的檔案系統與Window系統很不一樣,使用.NET程式碼獲取路徑時,比如程式啟動路徑等均無法獲取。
  4. MONO for Mac OS不支援控制檯應用程式,畫Window應用程式介面最好用Gtk#畫,否則可能介面顯示可能會有問題。如需隱藏介面,最好將寬度和高度設定為0,設定屬性和方法均無效,不知道下個版本會不會修復。
  5. 注意MONO框架版本問題。有可能最新版本不支援某些程式碼或者不支援某些低版本蘋果系統。

筆者在這裡權當是拋磚引玉,如果有朋友也使用過MONO for Mac OS,希望能分享下經驗。