Привязки Xamarin.Mac в консольных приложениях

Существуют некоторые сценарии, в которых вы хотите использовать некоторые собственные API Apple в C# для создания бессерверного приложения , который не имеет пользовательского интерфейса — с помощью C#.

Шаблоны проектов для приложений Mac включают вызов, который NSApplication.Init() следует за вызовом NSApplication.Main(args), как правило, выглядит следующим образом:

static class MainClass {
    static void Main (string [] args)
    {
        NSApplication.Init ();
        NSApplication.Main (args);
    }
}

Вызов Init для подготовки среды выполнения Xamarin.Mac, вызова для Main(args) запуска основного цикла приложения Cocoa, который подготавливает приложение для получения событий клавиатуры и мыши и отображения главного окна приложения. Вызов Main также попытается найти ресурсы Какао, подготовить окно к плейвелу и ожидает, что программа будет частью пакета приложений (программы, распределенные в каталоге с .app расширением и очень конкретным макетом).

Без головных приложений не требуется пользовательский интерфейс и не требуется запускать как часть пакета приложений.

Создание консольного приложения

Поэтому лучше начать с обычного типа проекта консоли .NET.

Вам нужно выполнить несколько действий:

  • Создайте пустой проект.
  • Ссылка на библиотеку Xamarin.Mac.dll.
  • Добавьте в проект неуправляемую зависимость.

Ниже описаны следующие действия.

Создание пустого проекта консоли

Создайте проект консоли .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 из этого каталога.

Это даст вам доступ к API Какао во время компиляции. На этом этапе можно добавить using AppKit в верхнюю часть файла и вызвать NSApplication.Init() метод. Перед запуском приложения можно выполнить еще один шаг.

Перенос неуправляемой библиотеки поддержки в проект

Перед запуском приложения необходимо перенести библиотеку 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 не требуется полный проект, вы также можете использовать простые файлы makefile Unix для выполнения задания. В следующем примере показано, как настроить файл 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 создаст автономный исполняемый файл