Partilhar via


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.

  1. Baixar .NET 9 SDK

  2. Criar um projeto de biblioteca de classes

    dotnet new classlib -n "MyNativeAOTLibrary"
    
  3. Adicione as seguintes propriedades ao arquivo de projeto MyNativeAOTLibrary.csproj

    <PublishAot>true</PublishAot>
    <PublishAotUsingRuntimePack>true</PublishAotUsingRuntimePack>
    
  4. 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 como aotsample_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;
        }
    }
    
  5. 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.dSYMde 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

  1. Crie uma pasta de estrutura:

    mkdir MyNativeAOTLibrary.framework
    
  2. Ajustar comandos de carga:

    • LC_RPATH comando load

      install_name_tool -rpath @executable_path @executable_path/Frameworks MyNativeAOTLibrary/bin/Release/net9.0/ios-arm64/publish/MyNativeAOTLibrary.dylib
      
    • LC_ID_DYLIB comando load

      install_name_tool -id @rpath/MyNativeAOTLibrary.framework/MyNativeAOTLibrary MyNativeAOTLibrary/bin/Release/net9.0/ios-arm64/publish/MyNativeAOTLibrary.dylib
      
  3. 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
    
  4. 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

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.

  1. 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
    
  2. Ajustar comandos de carga:

    • LC_RPATH comando load

      install_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 load

      install_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
      
  3. 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
    
  4. 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

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

  1. Aberto Xcode (neste exemplo Xcode 16.0 é usado)

  2. Criar um novo App projeto

  3. Escolha o nome do seu aplicativo (por exemplo, MyiOSApp) e escolha Objective-C como o idioma de origem

  4. Adicionar uma referência à MyNativeAOTLibrary estrutura

    • MyiOSApp Na guia Destinos Gerais, em Estruturas, Bibliotecas e Conteúdo Incorporado, selecione + para adicionar MyNativeAOTLibrary 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 para MyNativeAOTLibrary o quadro

    Xcode adicionar referência de estrutura

  5. Adicionar MyNativeAOTLibrary.framework local à lista de Caminhos de Pesquisa do Framework na guia Configurações de Compilação

    Xcode adicionar caminho de pesquisa de estrutura

  6. Edite main.m chamando o método aotsample_add gerenciado exposto e imprimindo o resultado

    extern int aotsample_add(int a, int b);
    int main(int argc, char * argv[]) {
        ...
        NSLog(@"2 + 5 = %d", aotsample_add(2, 5));
        ...
    }
    
  7. Selecione seu dispositivo iOS físico e crie/execute o aplicativo

  8. 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>