Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Systeemeigen code-interoperabiliteit is een technologie waarmee u toegang hebt tot niet-beheerde bibliotheken vanuit beheerde code of beheerde bibliotheken beschikbaar kunt maken voor onbeheerde code (de tegenovergestelde richting).
Hoewel systeemeigen code-interoperabiliteit op dezelfde manier werkt in systeemeigen AOT- en niet-AOT-implementaties, zijn er enkele specifieke kenmerken die verschillen bij het publiceren als systeemeigen AOT.
Directe P/Invoke-aanroepen
De P/Invoke-aanroepen in AOT-gecompileerde binaire bestanden worden standaard op een luie manier bij runtime gebonden, voor betere compatibiliteit. U kunt de AOT-compiler configureren om directe aanroepen te genereren voor geselecteerde P/Invoke-methoden die tijdens het opstarten zijn gebonden door het dynamische laadprogramma dat bij het besturingssysteem wordt geleverd. De niet-beheerde bibliotheken en toegangspunten waarnaar wordt verwezen via directe aanroepen, moeten altijd beschikbaar zijn tijdens runtime, anders kan het systeemeigen binaire bestand niet worden gestart.
De voordelen van directe P/Invoke-aanroepen zijn:
- Ze hebben betere stabiele statusprestaties.
- Ze maken het mogelijk om de niet-beheerde afhankelijkheden statisch te koppelen.
U kunt de directe generatie P/Invoke configureren met behulp van <DirectPInvoke> items in het projectbestand. De itemnaam kan modulenaam< zijn>, die directe aanroepen voor alle toegangspunten in de module mogelijk maakt, of <modulenaam!entrypointname>, waardoor alleen een directe aanroep voor de specifieke module en het toegangspunt mogelijk is.
Als u een lijst met toegangspunten in een extern bestand wilt opgeven, gebruikt u <DirectPInvokeList>-items in het projectbestand. Een lijst is handig wanneer het aantal directe P/Invoke-aanroepen groot is en het is onpraktisch om deze op te geven met behulp van afzonderlijke <DirectPInvoke> items. Het bestand kan lege regels en opmerkingen bevatten die beginnen met #.
Voorbeelden:
<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>
In Windows maakt Systeemeigen AOT gebruik van een vooraf ingevulde lijst met directe P/Invoke-methoden die beschikbaar zijn in alle ondersteunde versies van Windows.
Waarschuwing
Omdat directe P/Invoke-methoden worden opgelost door de dynamische lader van het besturingssysteem en niet door de Native AOT-runtimebibliotheek, zullen directe P/Invoke-methoden de DefaultDllImportSearchPathsAttribute niet respecteren. De bibliotheekzoekvolgorde volgt de dynamische laadprogrammaregels zoals gedefinieerd door het besturingssysteem. Sommige besturingssystemen en loaders bieden manieren om dynamisch laden te beheren via linkervlaggen (zoals /DEPENDENTLOADFLAG in Windows of -rpath op Linux). Voor meer informatie over het opgeven van linkervlaggen, zie de sectie Koppelen.
Koppelen
Als u statisch wilt koppelen aan een niet-beheerde bibliotheek, moet u <NativeLibrary Include="filename" /> opgeven dat verwijst naar een .lib bestand op Windows en een .a bestand op Unix-achtige systemen.
Voorbeelden:
<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>
Als u extra vlaggen wilt opgeven voor de systeemeigen linker, gebruikt u het <LinkerArg> item.
Voorbeelden:
<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>
Oorspronkelijke exports
De systeemeigen AOT-compiler exporteert methoden die zijn geannoteerd met UnmanagedCallersOnlyAttribute met een niet-lege EntryPoint eigenschap als openbare C-invoerpunten. Hierdoor kunnen de gecompileerde AOT-modules dynamisch of statisch worden gekoppeld aan externe programma's. Alleen methoden die zijn gemarkeerd UnmanagedCallersOnly in de gepubliceerde assembly, worden overwogen. Methoden in projectverwijzingen of NuGet-pakketten worden niet geƫxporteerd.
Zie NativeLibrary-voorbeeld voor meer informatie.