主控台應用程式中的 Xamarin.Mac 系結
在某些情況下,您想要在 C# 中使用一些 Apple 原生 API 來建置無外設應用程式 ,其中一個應用程式沒有使用者介面, 使用 C#。
Mac 應用程式的專案範本包括呼叫 NSApplication.Init()
,後面接著呼叫 NSApplication.Main(args)
,通常看起來像這樣:
static class MainClass {
static void Main (string [] args)
{
NSApplication.Init ();
NSApplication.Main (args);
}
}
準備 Xamarin.Mac 執行時間的呼叫 Init
、啟動 Cocoa 應用程式主要循環的呼叫 Main(args)
,其會準備應用程式接收鍵盤和滑鼠事件,並顯示應用程式的主要視窗。 對的呼叫 Main
也會嘗試尋找 Cocoa 資源、準備一個 Toplevel 視窗,並預期程式會是應用程式套件組合的一部分(以延伸模組和非常特定的配置散發在目錄中 .app
的程式)。
無前端應用程式不需要使用者介面,也不需要在應用程式套件組合中執行。
建立主控台應用程式
因此,最好從一般 .NET 控制台項目類型開始。
您需要執行一些動作:
- 建立空的專案。
- 參考Xamarin.Mac.dll連結庫。
- 將 Unmanaged 相依性帶入您的專案。
下列步驟將詳細說明:
建立空的主控台專案
建立新的 .NET 控制台專案,確定它是 .NET,而不是 .NET Core,因為Xamarin.Mac.dll不會在 .NET Core 運行時間下執行,它只會與 Mono 運行時間一起執行。
參考 Xamarin.Mac 連結庫
若要編譯程式代碼,您會想要從這個目錄參考 Xamarin.Mac.dll
元件: /Library/Frameworks/Xamarin.Mac.framework/Versions/Current/lib/64bits/full
若要這樣做,請移至專案參考,選取 [.NET 元件 ] 索引標籤,然後按兩下 [瀏覽 ] 按鈕以找出檔案系統上的檔案。 流覽至上述路徑,然後從該目錄選取 Xamarin.Mac.dll 。
這可讓您在編譯時期存取Cocoa API。 此時,您可以將 新增 using AppKit
至檔案頂端,並呼叫 NSApplication.Init()
方法。 您只能再執行一個步驟。
將 Unmanaged 支援連結庫帶入您的專案中
在應用程式執行之前,您需要將 Xamarin.Mac
支持連結庫帶入您的專案中。 若要這樣做,請將新的檔案新增至您的專案(在項目選項中,選取 [新增],然後選取 [新增現有檔案],然後流覽至此目錄:
/Library/Frameworks/Xamarin.Mac.framework/Versions/Current/SDKs/Xamarin.macOS.sdk/lib
在這裡,選取 libxammac.dylib 檔案。 您可以選擇複製、連結或移動。 我個人喜歡連結,但複製也有效。 然後,您需要選取檔案,然後在屬性板中(如果看不到屬性板,請選取 [檢視>板>屬性 ]),移至 [建 置] 區段,並將 [複製到輸出目錄 ] 設定設為 [如果更新時複製]。
您現在可以執行 Xamarin.Mac 應用程式。
bin 目錄中的結果看起來會像這樣:
Xamarin.Mac.dll
Xamarin.Mac.pdb
consoleapp.exe
consoleapp.pdb
libxammac.dylib
若要執行此應用程式,您需要相同目錄中的所有檔案。
建置獨立應用程式以進行散發
您可能想要將單一可執行檔散發給使用者。 若要這樣做,您可以使用 mkbundle
工具來將各種檔案轉換成獨立的可執行檔。
首先,請確定您的應用程式會編譯和執行。 一旦您滿意結果,您可以從命令行執行下列命令:
$ mkbundle --simple -o /tmp/consoleapp consoleapp.exe --library libxammac.dylib --config /Library/Frameworks/Mono.framework/Versions/Current/etc/mono/config --machine-config /Library/Frameworks/Mono.framework/Versions/Current/etc/mono/4.5/machine.config
[Output from the bundling tool]
$ _
在上述命令行調用中,會使用 選項 -o
來指定產生的輸出,在此案例中,我們傳遞了 /tmp/consoleapp
。 現在是獨立應用程式,您可以在Mono或 Xamarin.Mac 上散發且沒有外部相依性,它是完全獨立的可執行檔。
命令行手動指定 要使用的machine.config 檔案,以及全系統連結庫對應組態檔。 它們並非所有應用程式的必要專案,但方便將它們組合在一起,因為當您使用更多 .NET 功能時會使用這些應用程式
無項目組建
您不需要完整的專案來建立獨立的 Xamarin.Mac 應用程式,您也可以使用簡單的 Unix makefiles 來完成作業。 下列範例示範如何為簡單的命令行應用程式設定makefile:
XAMMAC_PATH=/Library/Frameworks/Xamarin.Mac.framework/Versions/Current/lib/x86_64/full/
DYLD=/Library/Frameworks/Xamarin.Mac.framework/Versions/Current/lib
MONODIR=/Library/Frameworks/Mono.framework/Versions/Current/etc/mono
all: consoleapp.exe
consoelapp.exe: consoleapp.cs Makefile
mcs -g -r:$(XAMMAC_PATH)/Xamarin.Mac.dll consoleapp.cs
run: consoleapp.exe
MONO_PATH=$(XAMMAC_PATH) DYLD_LIBRARY_PATH=$(DYLD) mono --debug consoleapp.exe $(COMMAND)
bundle: consoleapp.exe
mkbundle --simple consoleapp.exe -o ncsharp -L $(XAMMAC_PATH) --library $(DYLD)/libxammac.dylib --config $(MONODIR)/config --machine-config $(MONODIR)/4.5/machine.config
上述 Makefile
提供三個目標:
make
將會建置程式make run
將會在目前目錄中建置並執行程式make bundle
將會建立獨立的可執行檔