Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
A interoperabilidade de código nativo é uma tecnologia que permite acessar bibliotecas não gerenciadas do código gerenciado ou expor bibliotecas gerenciadas a código não gerenciado (a direção oposta).
Embora a interoperabilidade de código nativo funcione da mesma forma em implantações AOT Nativas e não AOT, há algumas especificidades que diferem ao publicar como AOT Nativo.
Chamadas diretas de P/Invoke
As chamadas P/Invoke em binários compilados por AOT são associadas de forma preguiçosa no runtime por padrão, para melhor compatibilidade. Você pode configurar o compilador AOT para gerar chamadas diretas para métodos P/Invoke selecionados que são vinculados durante a inicialização pelo carregador dinâmico do sistema operacional. As bibliotecas não gerenciadas e os pontos de entrada referenciados por meio de chamadas diretas devem estar sempre disponíveis em runtime, caso contrário, o binário nativo não é iniciado.
Os benefícios das chamadas P/Invoke diretas são:
- Eles têm melhor desempenho de estado estável.
- Eles possibilitam vincular estaticamente as dependências não gerenciadas.
Você pode configurar a geração direta de P/Invoke usando os itens <DirectPInvoke> no arquivo de projeto. O nome do item pode ser <nomedomódulo>, que permite chamadas diretas para todos os pontos de entrada no módulo, ou <nomedomódulo!nomedopontodeentrada>, que permite uma chamada direta apenas para o módulo específico e ponto de entrada.
Para especificar uma lista de pontos de entrada em um arquivo externo, utilize os elementos <DirectPInvokeList> no arquivo de projeto. Uma lista é útil quando o número de chamadas P/Invoke diretas é grande e não é prática especificá-las usando itens individuais <DirectPInvoke> . O arquivo pode conter linhas e comentários vazios começando com #.
Exemplos:
<ItemGroup>
<!-- Generate direct PInvoke calls for everything in __Internal -->
<!-- This option replicates Mono AOT behavior that generates direct PInvoke calls for __Internal -->
<DirectPInvoke Include="__Internal" />
<!-- Generate direct PInvoke calls for everything in libc (also matches libc.so on Linux or libc.dylib on macOS) -->
<DirectPInvoke Include="libc" />
<!-- Generate direct PInvoke calls for Sleep in kernel32 (also matches kernel32.dll on Windows) -->
<DirectPInvoke Include="kernel32!Sleep" />
<!-- Generate direct PInvoke for all APIs listed in DirectXAPIs.txt -->
<DirectPInvokeList Include="DirectXAPIs.txt" />
</ItemGroup>
No Windows, o AOT nativo usa uma lista pré-preenchida de métodos P/Invoke diretos que estão disponíveis em todas as versões com suporte do Windows.
Aviso
Como os métodos P/Invoke diretos são resolvidos pelo carregador dinâmico do sistema operacional e não pela biblioteca de runtime do AOT nativo, os métodos P/Invoke diretos não respeitarão o DefaultDllImportSearchPathsAttribute. A ordem de pesquisa da biblioteca seguirá as regras do carregador dinâmico, conforme definido pelo sistema operacional. Alguns sistemas operacionais e carregadores oferecem maneiras de controlar o carregamento dinâmico por meio de sinalizadores do vinculador (como /DEPENDENTLOADFLAG no Windows ou -rpath no Linux). Para obter mais informações sobre como especificar sinalizadores de vinculador, consulte a seção Vinculação .
Vinculação
Para vincular estaticamente a uma biblioteca não gerenciada, você precisa especificar <NativeLibrary Include="filename" /> apontando para um .lib arquivo no Windows e um .a arquivo em sistemas semelhantes ao Unix.
Exemplos:
<ItemGroup>
<!-- Generate direct PInvokes for Dependency -->
<DirectPInvoke Include="Dependency" />
<!-- Specify library to link against -->
<NativeLibrary Include="Dependency.lib" Condition="$(RuntimeIdentifier.StartsWith('win'))" />
<NativeLibrary Include="Dependency.a" Condition="!$(RuntimeIdentifier.StartsWith('win'))" />
</ItemGroup>
Para especificar sinalizadores adicionais para o vinculador nativo, use o <LinkerArg> item.
Exemplos:
<ItemGroup>
<!-- link.exe is used as the linker on Windows -->
<LinkerArg Include="/DEPENDENTLOADFLAG:0x800" Condition="$(RuntimeIdentifier.StartsWith('win'))" />
<!-- Native AOT invokes clang/gcc as the linker, so arguments need to be prefixed with "-Wl," -->
<LinkerArg Include="-Wl,-rpath,'/bin/'" Condition="$(RuntimeIdentifier.StartsWith('linux'))" />
</ItemGroup>
Exportações nativas
O compilador AOT nativo exporta métodos anotados com UnmanagedCallersOnlyAttribute com uma propriedade não vazia EntryPoint como pontos de entrada C públicos. Isso possibilita vincular dinamicamente ou estaticamente os módulos compilados pelo AOT a programas externos. Somente os métodos marcados UnmanagedCallersOnly no assembly publicado são considerados. Métodos em referências de projeto ou pacotes NuGet não serão exportados.
Para obter mais informações, consulte o exemplo de NativeLibrary.