Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
La interoperabilidad de código nativo es una tecnología que permite acceder a bibliotecas no administradas desde código administrado o exponer bibliotecas administradas a código no administrado (la dirección opuesta).
Aunque la interoperabilidad de código nativo funciona de forma similar en implementaciones de AOT nativa y que no son de AOT, hay detalles que difieren al publicar como AOT nativa.
Llamadas directas de P/Invoke
Las llamadas P/Invoke en los archivos binarios compilados con AOT se enlazan de manera diferida durante la ejecución por defecto para mejorar la compatibilidad. Puede configurar el compilador AOT para generar llamadas directas para los métodos P/Invoke seleccionados enlazados durante el inicio por el cargador dinámico que viene con el sistema operativo. Las bibliotecas no administradas y los puntos de entrada a los que se hace referencia a través de llamadas directas siempre deben estar disponibles en tiempo de ejecución; de lo contrario, el binario nativo no se puede iniciar.
Las ventajas de las llamadas directas P/Invoke son:
- Tienen un mejor rendimiento de estado estable.
- Permiten vincular estáticamente las dependencias no administradas.
Puede configurar la generación directa de P/Invoke utilizando elementos <DirectPInvoke> en el archivo de proyecto. El nombre del elemento puede ser <modulename>, que permite llamadas directas para todos los puntos de entrada del módulo, o <modulename!entrypointname>, que habilita una llamada directa solo para el módulo específico y el punto de entrada.
Para especificar una lista de puntos de entrada en un archivo externo, use <DirectPInvokeList> elementos en el archivo de proyecto. Una lista es útil cuando el número de llamadas directas P/Invoke es grande y no es práctico especificarlas mediante elementos individuales <DirectPInvoke> . El archivo puede contener líneas vacías y comentarios a partir de #.
Ejemplos:
<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>
En Windows, AOT Nativo utiliza una lista previamente rellenada de métodos directos de P/Invoke que están disponibles en todas las versiones de Windows compatibles.
Advertencia
Como el cargador dinámico del sistema operativo y no la biblioteca en tiempo de ejecución de la AOT nativa es quien resuelve los métodos P/Invoke directos, estos no respetarán DefaultDllImportSearchPathsAttribute. El orden de búsqueda de la biblioteca seguirá las reglas del cargador dinámico definidas por el sistema operativo. Algunos sistemas operativos y cargadores ofrecen formas de controlar la carga dinámica a través de marcas del enlazador (como /DEPENDENTLOADFLAG en Windows o -rpath en Linux). Para obtener más información sobre cómo especificar marcas del enlazador, consulte la sección Vinculación .
Vinculación
Para enlazar estáticamente contra una biblioteca no administrada, debe especificar <NativeLibrary Include="filename" /> que apunte a un archivo .lib en Windows y a un archivo .a en sistemas similares a Unix.
Ejemplos:
<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 banderas adicionales en el enlazador nativo, use el elemento <LinkerArg>.
Ejemplos:
<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>
Exportaciones nativas
El compilador de AOT nativo exporta métodos anotados con UnmanagedCallersOnlyAttribute con una propiedad no vacía EntryPoint como puntos de entrada de C públicos. Esto permite vincular dinámica o estáticamente los módulos compilados AOT a programas externos. Solo se tienen en cuenta los métodos marcados UnmanagedCallersOnly en el ensamblado publicado. Los métodos de referencias de proyecto o paquetes NuGet no se exportarán.
Para obtener más información, vea Ejemplo nativeLibrary.