Criar e consumir estruturas personalizadas para plataformas semelhantes ao iOS
A partir do .NET 9, o AOT nativo dá suporte à publicação de bibliotecas de classes do .NET que não dependem de cargas de trabalho do iOS para plataformas semelhantes ao iOS. Esse suporte permite que você crie bibliotecas nativas independentes que podem ser consumidas de aplicativos iOS, Mac Catalyst e tvOS.
Importante
Essa abordagem não vem com o suporte interno à interoperabilidade Objective-C e adaptações de código adicionais podem ser necessárias (como empacotamento de argumentos de tipo de referência) para obter interoperabilidade.
Criar bibliotecas compartilhadas
Esta seção descreve as etapas para criar um projeto simples de Biblioteca de Classes do .NET com suporte a NativeAOT e produzir uma biblioteca nativa para plataformas semelhantes ao iOS a partir dele.
Baixar o SDK do .NET 9
Criar um projeto de biblioteca de classes
dotnet new classlib -n "MyNativeAOTLibrary"
Adicione as seguintes propriedades ao arquivo de projeto
MyNativeAOTLibrary.csproj
<PublishAot>true</PublishAot> <PublishAotUsingRuntimePack>true</PublishAotUsingRuntimePack>
Edite o
MyNativeAOTLibrary/Class1.cs
código-fonte para expor um método gerenciado para que ele possa ser referenciado a partir do código nativo comoaotsample_add
. Por exemplo:using System.Runtime.InteropServices; namespace NaotLib; public class Class1 { [UnmanagedCallersOnly(EntryPoint = "aotsample_add")] public static int Add(int a, int b) { return a + b; } }
Publique a biblioteca de classes e direcione a plataforma semelhante ao iOS desejada especificando o identificador de tempo de execução apropriado (referenciado abaixo como
<rid>
):dotnet publish -r <rid> MyNativeAOTLibrary/MyNativeAOTLibrary.csproj
A conclusão bem-sucedida da etapa anterior produz um par de arquivos: uma biblioteca MyNativeAOTLibrary.dylib
compartilhada e seus símbolos MyNativeAOTLibrary.dylib.dSYM
de depuração, que estão localizados em: MyNativeAOTLibrary/bin/Release/net9.0/<rid>/publish/
.
Observação
Para criar estruturas universais, é necessário publicar a biblioteca de classes para x64
ambas e Arm64
arquiteturas para uma determinada plataforma.
Isso significa que você precisa repetir a etapa 5 com um identificador de tempo de execução diferente.
Por exemplo, você publicaria a biblioteca de classes com identificadores de maccatalyst-arm64
tempo de execução e maccatalyst-x64
como um pré-requisito para empacotar a biblioteca compartilhada em uma estrutura universal MacCatalyst personalizada.
Criar e consumir uma estrutura personalizada
A Apple impõe um requisito de que as bibliotecas compartilhadas (.dylibs) precisam ser empacotadas em estruturas para serem consumidas de aplicativos.
Esta seção descreve todas as etapas necessárias para conseguir isso e um cenário simples de um aplicativo iOS/MacCatalyst consumindo uma biblioteca/estrutura NativeAOT compartilhada.
Observação
As etapas descritas são apenas para fins de demonstração. Os requisitos reais podem diferir dependendo do caso de uso exato.
Empacote a biblioteca compartilhada em uma estrutura personalizada do iOS
Crie uma pasta de estrutura:
mkdir MyNativeAOTLibrary.framework
Ajustar comandos de carregamento:
LC_RPATH
comando loadinstall_name_tool -rpath @executable_path @executable_path/Frameworks MyNativeAOTLibrary/bin/Release/net9.0/ios-arm64/publish/MyNativeAOTLibrary.dylib
LC_ID_DYLIB
comando loadinstall_name_tool -id @rpath/MyNativeAOTLibrary.framework/MyNativeAOTLibrary MyNativeAOTLibrary/bin/Release/net9.0/ios-arm64/publish/MyNativeAOTLibrary.dylib
Empacote manualmente o binário em um arquivo universal:
lipo -create MyNativeAOTLibrary/bin/Release/net9.0/ios-arm64/publish/MyNativeAOTLibrary.dylib -output MyNativeAOTLibrary.framework/MyNativeAOTLibrary
Adicione um arquivo de lista de propriedades à sua estrutura:
- Criar um arquivo
Info.plist
touch MyNativeAOTLibrary.framework/Info.plist
- Adicione o conteúdo do apêndice ao arquivo criado
Info.plist
- Criar um arquivo
Após a etapa final, a estrutura da estrutura deve ficar assim:
MyNativeAOTLibrary.framework
|_ MyNativeAOTLibrary
|_ Info.plist
Empacotar a biblioteca compartilhada em uma estrutura universal MacCatalyst personalizada
Estruturas universais requerem binários para arquitetura Arm64
e x64
arquitetura.
Por esse motivo, você deve publicar bibliotecas nativas direcionadas aos dois RIDs a seguir com antecedência: maccatalyst-arm64
e maccatalyst-x64
.
Crie uma estrutura de pastas de estrutura:
mkdir -p MyNativeAOTLibrary.framework/Versions/A/Resources ln -sfh Versions/Current/MyNativeAOTLibrary MyNativeAOTLibrary.framework/MyNativeAOTLibrary ln -sfh Versions/Current/Resources MyNativeAOTLibrary.framework/Resources ln -sfh A MyNativeAOTLibrary.framework/Versions/Current
Ajustar comandos de carregamento:
LC_RPATH
comando loadinstall_name_tool -rpath @executable_path @executable_path/../Frameworks MyNativeAOTLibrary/bin/Release/net9.0/maccatalyst-arm64/publish/MyNativeAOTLibrary.dylib install_name_tool -rpath @executable_path @executable_path/../Frameworks MyNativeAOTLibrary/bin/Release/net9.0/maccatalyst-x64/publish/MyNativeAOTLibrary.dylib
LC_ID_DYLIB
comando loadinstall_name_tool -id @rpath/MyNativeAOTLibrary.framework/Versions/A/MyNativeAOTLibrary MyNativeAOTLibrary/bin/Release/net9.0/maccatalyst-arm64/publish/MyNativeAOTLibrary.dylib install_name_tool -id @rpath/MyNativeAOTLibrary.framework/Versions/A/MyNativeAOTLibrary MyNativeAOTLibrary/bin/Release/net9.0/maccatalyst-x64/publish/MyNativeAOTLibrary.dylib
Empacote manualmente o binário em um arquivo universal:
lipo -create MyNativeAOTLibrary/bin/Release/net9.0/maccatalyst-arm64/publish/MyNativeAOTLibrary.dylib MyNativeAOTLibrary/bin/Release/net9.0/maccatalyst-x64/publish/MyNativeAOTLibrary.dylib -output MyNativeAOTLibrary.framework/Versions/A/MyNativeAOTLibrary
Adicione um arquivo de lista de propriedades à sua estrutura:
- Criar um arquivo
Info.plist
touch MyNativeAOTLibrary.framework/Versions/A/Resources/Info.plist
- Adicione o conteúdo do apêndice ao arquivo criado
Info.plist
- Criar um arquivo
Após a etapa final, a estrutura da estrutura deve ficar assim:
MyNativeAOTLibrary.framework
|_ MyNativeAOTLibrary -> Versions/Current/MyNativeAOTLibrary
|_ Resources -> Versions/Current/Resources
|_ Versions
|_ A
| |_ Resources
| | |_ Info.plist
| |_ MyNativeAOTLibrary
|_ Current -> A
Consumir estruturas personalizadas
Aberto
Xcode
(neste exemploXcode 16.0
é usado)Criar um novo projeto
App
Escolha o nome do seu aplicativo (por exemplo,
MyiOSApp
) e escolha Objective-C como o idioma de origemAdicionar uma referência à
MyNativeAOTLibrary
estrutura- Na guia Geral de
MyiOSApp
destinos, em Estruturas, Bibliotecas e Conteúdo Incorporado, selecione + para adicionarMyNativeAOTLibrary
como a estrutura referenciada - Na caixa de diálogo, escolha Adicionar outro ->Adicionar arquivos e, em seguida, navegue até o local e
MyNativeAOTLibrary.framework
selecione-o - Uma vez selecionado, defina
Embed and Sign
a opção paraMyNativeAOTLibrary
a estrutura
- Na guia Geral de
Adicionar
MyNativeAOTLibrary.framework
localização à lista de Caminhos de Pesquisa de Estrutura na guia Configurações de BuildEdite
main.m
chamando o métodoaotsample_add
gerenciado exposto e imprimindo o resultadoextern int aotsample_add(int a, int b); int main(int argc, char * argv[]) { ... NSLog(@"2 + 5 = %d", aotsample_add(2, 5)); ... }
Selecione seu dispositivo iOS físico e crie/execute o aplicativo
Inspecione os logs depois que o aplicativo for iniciado com êxito. O aplicativo deve imprimir:
2 + 5 = 7
Observação
Para MacCatalyst, use as mesmas etapas, exceto a etapa 7, em que o Destino de execução precisa ser definido como: Mac (Mac Catalyst)
.
Crie bibliotecas estáticas com NativeAOT para plataformas semelhantes ao iOS
Conforme descrito na visão geral da criação de bibliotecas nativas, é melhor criar bibliotecas compartilhadas em vez de estáticas devido a várias limitações.
No entanto, se desejar, você pode criar uma biblioteca estática seguindo as etapas para criar uma compartilhada e incluindo uma propriedade adicional no arquivo de projeto:
<NativeLib>Static</NativeLib>
Após a publicação do projeto, a biblioteca MyNativeAOTLibrary.a
estática pode ser encontrada em: MyNativeAOTLibrary/bin/Release/net9.0/<rid>/publish
.
Este artigo não aborda como consumir a biblioteca estática e configurar o projeto do consumidor.
Conteúdo do Apêndice Info.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleName</key>
<string>MyNativeAOTLibrary</string>
<key>CFBundleIdentifier</key>
<string>com.companyname.MyNativeAOTLibrary</string>
<key>CFBundleVersion</key>
<string>1.0</string>
<key>CFBundleExecutable</key>
<string>MyNativeAOTLibrary</string>
<key>CFBundlePackageType</key>
<string>FMWK</string>
</dict>
</plist>