Crie e consuma estruturas personalizadas para plataformas semelhantes ao iOS
A partir do .NET 9, o AOT nativo oferece suporte à publicação de bibliotecas de classe .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 a partir de aplicativos iOS, Mac Catalyst e tvOS.
Importante
Essa abordagem não vem com o suporte interno de interoperabilidade Objective-C e adaptações adicionais de código podem ser necessárias (como organizar argumentos de tipo de referência) para alcançar a interoperabilidade.
Criar bibliotecas compartilhadas
Esta seção descreve as etapas para criar um projeto simples de Biblioteca de Classes .NET com suporte a NativeAOT e produzir uma biblioteca nativa para plataformas semelhantes ao iOS a partir dele.
Baixar .NET 9 SDK
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/
.
Nota
Para criar estruturas universais, é necessário publicar a biblioteca de classes para ambas e Arm64
x64
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 como maccatalyst-x64
pré-requisito para empacotar a biblioteca compartilhada em uma estrutura universal personalizada do MacCatalyst.
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 a partir de aplicativos.
Esta seção descreve todas as etapas necessárias para alcançar isso e um cenário simples de um aplicativo iOS/MacCatalyst consumindo uma biblioteca/estrutura NativeAOT compartilhada.
Nota
As etapas descritas são apenas para fins de demonstração. Os requisitos reais podem diferir dependendo do caso de uso exato.
Empacotar a biblioteca compartilhada em uma estrutura iOS personalizada
Crie uma pasta de estrutura:
mkdir MyNativeAOTLibrary.framework
Ajustar comandos de carga:
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
Info.plist
ficheiro
touch MyNativeAOTLibrary.framework/Info.plist
- Adicione o conteúdo do apêndice ao arquivo criado
Info.plist
- Criar um
Após a etapa final, a estrutura da estrutura deve ter esta aparência:
MyNativeAOTLibrary.framework
|_ MyNativeAOTLibrary
|_ Info.plist
Empacote a biblioteca compartilhada em uma estrutura universal personalizada do MacCatalyst
Estruturas universais exigem binários para ambos e Arm64
x64
arquitetura.
Por esse motivo, você deve publicar bibliotecas nativas direcionadas a ambos os seguintes RIDs previamente: 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 carga:
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
Info.plist
ficheiro
touch MyNativeAOTLibrary.framework/Versions/A/Resources/Info.plist
- Adicione o conteúdo do apêndice ao arquivo criado
Info.plist
- Criar um
Após a etapa final, a estrutura da estrutura deve ter esta aparência:
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
App
projetoEscolha o nome do seu aplicativo (por exemplo,
MyiOSApp
) e escolha Objective-C como o idioma de origemAdicionar uma referência à
MyNativeAOTLibrary
estruturaMyiOSApp
Na guia Destinos Gerais, em Estruturas, Bibliotecas e Conteúdo Incorporado, selecione + para adicionarMyNativeAOTLibrary
como a estrutura referenciada- Na caixa de diálogo, escolha Adicionar Outros ->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
o quadro
Adicionar
MyNativeAOTLibrary.framework
local à lista de Caminhos de Pesquisa do Framework na guia Configurações de CompilaçãoEdite
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
Nota
Para MacCatalyst, use as mesmas etapas, exceto para a etapa 7, onde o Destino de execução precisa ser definido como: Mac (Mac Catalyst)
.
Crie bibliotecas estáticas com o NativeAOT para plataformas semelhantes ao iOS
Conforme descrito na visão geral da construção de bibliotecas nativas, é melhor criar bibliotecas compartilhadas em vez de bibliotecas 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 biblioteca 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 de consumidor.
Apêndice Info.plist conteúdo
<?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>