主控台應用程式中的 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 將會建立獨立的可執行檔