Associações do Xamarin.Mac em aplicativos de console
Há alguns cenários em que você deseja usar algumas apis nativas da Apple em C# para criar um aplicativo sem periféneos – um que não tem uma interface do usuário – usando C#.
Os modelos de projeto para aplicativos Mac incluem uma chamada para NSApplication.Init()
seguida por uma chamada para NSApplication.Main(args)
, geralmente tem esta aparência:
static class MainClass {
static void Main (string [] args)
{
NSApplication.Init ();
NSApplication.Main (args);
}
}
A chamada para Init
prepara o runtime do Xamarin.Mac, a chamada para Main(args)
inicia o loop de main do aplicativo Cocoa, que prepara o aplicativo para receber eventos de teclado e mouse e mostrar a janela main do aplicativo. A chamada para Main
também tentará localizar os recursos do Cocoa, preparar uma janela toplevel e espera que o programa faça parte de um pacote de aplicativos (programas distribuídos em um diretório com a .app
extensão e um layout muito específico).
Aplicativos sem cabeça não precisam de uma interface do usuário e não precisam ser executados como parte de um pacote de aplicativos.
Criando o aplicativo de console
Portanto, é melhor começar com um tipo de projeto normal do Console do .NET.
Você precisa fazer algumas coisas:
- Criar um projeto vazio.
- Referencie a biblioteca de Xamarin.Mac.dll.
- Traga a dependência não gerenciada para seu projeto.
Estas etapas são explicadas mais detalhadamente abaixo:
Criar um projeto de console vazio
Crie um novo Projeto de Console do .NET, verifique se ele é .NET e não .NET Core, pois Xamarin.Mac.dll não é executado no runtime do .NET Core, ele é executado apenas com o runtime mono.
Referenciar a biblioteca Xamarin.Mac
Para compilar seu código, você desejará referenciar o Xamarin.Mac.dll
assembly deste diretório: /Library/Frameworks/Xamarin.Mac.framework/Versions/Current/lib/64bits/full
Para fazer isso, acesse as referências do projeto, selecione a guia Assembly do .NET e clique no botão Procurar para localizar o arquivo no sistema de arquivos. Navegue até o caminho acima e selecione o Xamarin.Mac.dll desse diretório.
Isso lhe dará acesso às APIs cocoa em tempo de compilação. Neste ponto, você pode adicionar using AppKit
à parte superior do arquivo e chamar o NSApplication.Init()
método . Há apenas mais uma etapa antes que você possa executar seu aplicativo.
Colocar a biblioteca de suporte não gerenciada em seu projeto
Antes que seu aplicativo seja executado, você precisa trazer a Xamarin.Mac
biblioteca de suporte para seu projeto. Para fazer isso, adicione um novo arquivo ao seu projeto (em opções de projeto, selecione Adicionar e Adicionar Arquivo Existente) e navegue até este diretório:
/Library/Frameworks/Xamarin.Mac.framework/Versions/Current/SDKs/Xamarin.macOS.sdk/lib
Aqui, selecione o arquivo libxammac.dylib. Você terá a opção de copiar, vincular ou mover. Eu pessoalmente gosto de vincular, mas copiar também funciona. Em seguida, você precisa selecionar o arquivo e, no painel de propriedades (selecione Exibir>Propriedades de Painéis> se o painel de propriedades não estiver visível), vá para a seção Compilar e defina a configuração Copiar para Diretório de Saída como Copiar se for mais recente.
Agora você pode executar seu aplicativo Xamarin.Mac.
O resultado no diretório bin terá esta aparência:
Xamarin.Mac.dll
Xamarin.Mac.pdb
consoleapp.exe
consoleapp.pdb
libxammac.dylib
Para executar esse aplicativo, você precisará de todos esses arquivos no mesmo diretório.
Criando um aplicativo autônomo para distribuição
Talvez você queira distribuir um único executável para seus usuários. Para fazer isso, você pode usar a mkbundle
ferramenta para transformar os vários arquivos em um executável autossuficiível.
Primeiro, verifique se o aplicativo é compilado e executado. Quando estiver satisfeito com os resultados, você poderá executar o seguinte comando na linha de comando:
$ 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]
$ _
Na invocação de linha de comando acima, a opção -o
é usada para especificar a saída gerada, nesse caso, passamos /tmp/consoleapp
. Agora esse é um aplicativo autônomo que você pode distribuir e não tem dependências externas no Mono ou no Xamarin.Mac, ele é um executável totalmente autocontido.
A linha de comando especificou manualmente o arquivo demachine.config a ser usado e um arquivo de configuração de mapeamento de biblioteca em todo o sistema. Eles não são necessários para todos os aplicativos, mas é conveniente agrupá-los, pois eles são usados quando você usa mais recursos do .NET
Builds sem projeto
Você não precisa de um projeto completo para criar um aplicativo Xamarin.Mac autocontido. Você também pode usar makefiles unix simples para fazer o trabalho. O exemplo a seguir mostra como você pode configurar um makefile para um aplicativo de linha de comando simples:
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
O acima Makefile
fornece três destinos:
make
criará o programamake run
criará e executará o programa no diretório atualmake bundle
criará um executável autossuficiível