用 Microsoft Visual C# Express 寫 MacOSX 的視窗程式

(c)toki kanno, 2006. All rights reserved.
版權所有,歡迎連結,但轉載至他處請來信詢問
作者Mail: toki_kanno(@)yahoo(.)com(.)tw (括號自行去除)



雖然 Apple 最近賣電腦的業績是節節高漲,不過國內寫Mac程式的人卻沒有感覺明顯的增加, 其中程式開發平台上的各種轉換應該就是一個問題。 所以,今天這篇文章要教大家的就是,如何使用萬惡偉大的微軟的程式開發工具, 來寫 MacOSX上的程式 ,而且重。點。是!!!這篇文章是要教你如何用微軟的開發工具寫MacOSX下的視窗程式

首先,再次強調,本人沒瘋XD

本文的關鍵字只有幾個 C#Mono Frameworkwx.NET,如果這些字你一看就明白的話......靠北,你還在這幹嘛,快回去寫程式吧你:P

這次的任務需要以下的東西:

  • Microsoft VC# Express



  • 微軟為了推廣自家的Visual Studio所推出的簡易版本的 C# 編譯環境。不過重點是,這東西是完全免費的。在以下網址可以免費取得。

    http://msdn.microsoft.com/vstudio/express/visualcsharp/download/

  • Mono framework MacOSX binary package

  • Open source 版本的 C# 開發環境,由於微軟的 .NET Framework 採用的是一種類似 Java VM 的觀念, 只要在所在平台有可以運行的Common Language Infrastructure (CLI) virtual machine, 則所有符合CLR(Common Language Runtime)標準寫出來的 code,都可以在不用重新編譯的情形下直接被執行。

    也就是說,使用微軟 VC# 寫出來的程式,只要在MacOSX有對應的VM(和Library),就可以被執行!

    Mono Framework 的官方網頁如下
    http://www.mono-project.com/Main_Page

    寫這篇文章時最新版本的 Mono runtime binary for MacOSX:
    Mono 1.1.17 For MacOSX (PPC)
    Mono 1.1.17 For MacOSX (Intel)

  • wx.NET binary package for win32 & MacOSX

  • 跨平台視窗 GUI 程式庫 wxWidgets 的 DotNet Framework 重新包裝版(好長的名字,不過說真的,這名字我亂翻的(逃)), 由於 Mono 下的 System.Windows.Form 部分還不是很好用,改用這個跨平台GUI程式庫代替。我們一共要抓兩個版本,Win32版和MacOSX版。

    官網:
    http://wxnet.sourceforge.net/

    寫這篇文章時最新版本的 wx.NET Binary:
    wx.NET 0.72 binary for Win32
    wx.NET 0.72 binary for MacOSX

開始寫程式啦

  1. 開一個新的 VC# Project


  2. 類別為 Empty Project,我們先隨便取個名字叫wx.Test

  3. 幫Project增加 reference


  4. 加入一些我們等下要用到的 reference (這動作和 C++ 裡指定 Library 位置差不多)


    從 .NET 分頁加入 System 和 System.Drawing 兩項 reference


    使用 Browse 的方式加入 wx.NET.dll


    都完成後 Solution Explorer 看起來應該長這樣

  5. 正式開始寫程式


  6. 首先先由 Project->Add New Item 選單加入一個新的檔案 MainForm.cs,類型是「code file」


    把這些 code key 上去吧 XD
    不要懷疑……就只有這麼多行而以


    按下偉大的「F5」,應該用不到2秒就會跑出一個DOS視窗,以及螢幕的左上角會出現一個100x100大小的普通Window視窗。
    如果你執行時出現找不到 wx-c.dll 的訊息,你可以在wx.NET的Bin目錄下會找到它,請把它copy到 Windows\System32 下面


    會出現Dos視窗實在超礙眼的,讓我們微調一下, 由Project->wx.Test Properties ... 可以開啟一個新的分頁,將其中 Output Type 改成「Windows Application」。 這樣就再也不會有DOS視窗來亂啦

  7. 讓我們把程式搬到MacOSX上

  8. 其實.....接下來才是麻煩的地方(你說什麼!!!XD) 因為我們會用到一些命令列的東西。
    首先先讓我們做一件最重要的事,那就是……把Mono先裝起來:

    基本上這件工作一點也不難,抓了dmg回來之後,把dmg掛起來,裡面的安裝檔點兩下,Continue/Next一直按就好了。

    接下來請建立一個如下的目錄結構 wx.Test.app\Contents\MacOS\
    (白話文就是 wx.Test.app 是個目錄,它下面有個目錄叫 Contents,
    Contents這個目錄下面有個目錄叫MacOS……好累囧)
    以上換成 Terminal 指令就是(請注意大小寫)

    mkdir wx.Test.app
    cd wx.Test.app
    mkdir Contents
    cd Contents
    mkdir MacOS

    在建完目錄之後,請把剛剛在Windows下complier完成的wx.Test.exe copy 到 MacOS 的目錄下(請 copy 在 bin\Release 下面的那個)
    同時也請把 wx.NET-0.7.2-MacOSX-Build.dmg 裡面的 wx.NET.dll 和 wx.NET.dll.config copy 到 MacOS 目錄下

    最後請在 MacOS 的目錄下建立一個純文字檔案,其檔名為 wx.Test,並且請將該純文字檔案的權限改成可執行。 以下是最後如果在該目錄下使用 ls 指令時應該有的檔案和其權限設定
    wx.Test.app/Contents/MacOS toki$ ls -la
    total 1424
    drwxr-xr-x   6 toki  toki     204 Sep 10 18:48 ./
    drwxr-xr-x   5 toki  toki     170 Sep 10 18:51 ../
    -r-xr--r--   1 toki  toki  701440 Sep  9 10:19 wx.NET.dll*
    -rwxr--r--   1 toki  toki     277 Sep  9 10:19 wx.NET.dll.config*
    -rwxr--r--   1 toki  toki     387 Sep 10 18:46 wx.Test*
    -rwxr--r--   1 toki  toki   16384 Sep 10 18:11 wx.Test.exe*
    

    最後,在wx.Test中寫入以下的內容:
    #!/usr/bin/perl
    $appmain = "wx.Test.exe";
    
    use File::Basename;
    $scriptdir = dirname($0);
    
    chomp($nowdir = `pwd`);
    $realapppath = "$nowdir/$scriptdir/";
    $realappname = "$realapppath$appmain";
    
    $ENV{DYLD_LIBRARY_PATH} = "/Volumes/wx.NET-0.7.2-MacOSX-Build/Bin/:$ENV{DYLD_LIBRARY_PATH}";
    
    chdir ($realapppath);
    exec ("mono $realappname");
    

    其中 $ENV{DYLD_LIBRARY_PATH} = "/Volumes/wx.NET-0.7.2-MacOSX-Build/Bin/:$ENV{DYLD_LIBRARY_PATH}";
    中的路徑為你放置 wx-c.dylib 的路徑(一般會建議把它copy到/usr/lib下面),上面這個路徑是預設你有把 wx.NET-0.7.2-MacOSX-Build.dmg mount 起來的情形。

  9. 跑吧! 男孩 程式!!!


  10. 在做完上一項所提到的所有的事項之後,回到 wx.Test.app 所在的目錄,你會發現它被OSX辨視成一個應用程式(而不是目錄), 滑鼠移過去double click,如果一切正常,你應該也會看到如圖一樣的 100x100 大小的視窗出現在桌面的左上角。

附錄


附上上面程式的VC# project 檔案做為參考。wx.Test.zip