Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
A interoperabilidade de código nativo é uma tecnologia que permite acessar bibliotecas não gerenciadas a partir de 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 de forma semelhante em implantações de AOT nativo e não AOT, há algumas especificidades que diferem ao publicar como AOT nativo.
Chamadas diretas P/Invoke
As chamadas P/Invoke nos binários compilados por AOT são atribuídas preguiçosamente em tempo de execução por defeito, 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 que vem com o sistema operacional. As bibliotecas não geridas e os pontos de entrada referenciados via chamadas diretas devem estar sempre disponíveis em tempo de execução, caso contrário o binário nativo falha ao iniciar.
Os benefícios das chamadas diretas P/Invoke são:
- Eles têm melhor desempenho em estado estacionário.
- Eles tornam possível vincular as dependências não gerenciadas estaticamente.
Você pode configurar a geração direta de P/Invoke usando os itens <DirectPInvoke> no arquivo de projeto. O nome do item pode ser <modulename>, que permite chamadas diretas para todos os pontos de entrada no módulo, ou <modulename!entrypointname>, que permite uma chamada direta apenas para o módulo específico e o ponto de entrada.
Para especificar uma lista de pontos de entrada num arquivo externo, use <DirectPInvokeList> itens no arquivo de projeto. Uma lista é útil quando o número de chamadas diretas P/Invoke é grande e não é prático especificá-las usando itens individuais <DirectPInvoke> . O arquivo pode conter linhas vazias e comentários 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 suportadas do Windows.
Advertência
Como os métodos P/Invoke diretos são resolvidos pelo carregador dinâmico do sistema operacional e não pela biblioteca de tempo de execução AOT nativa, os métodos diretos P/Invoke 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 através de sinalizadores de vinculação (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 .
Ligação
Para fazer a ligação estática a uma biblioteca não gerida, é necessário especificar <NativeLibrary Include="filename" /> apontando para um arquivo .lib no Windows e um arquivo .a em sistemas tipo 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 e com uma propriedade não vazia EntryPoint como pontos de entrada C públicos. Isso torna possível vincular dinamicamente ou estaticamente os módulos compilados da AOT em programas externos. Apenas os métodos marcados UnmanagedCallersOnly na montagem publicada são considerados. Os métodos em referências de projeto ou pacotes NuGet não serão exportados.
Para obter mais informações, consulte Exemplo de NativeLibrary.