Not
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Interop för inbyggd kod är en teknik som gör att du kan komma åt ohanterade bibliotek från hanterad kod eller exponera hanterade bibliotek för ohanterad kod (motsatt riktning).
Även om interop för intern kod fungerar på samma sätt i interna AOT- och icke-AOT-distributioner, finns det vissa detaljer som skiljer sig åt vid publicering som intern AOT.
Direkt P/Invoke-anrop
P/Invoke-anropen i AOT-kompilerade binärfiler binds latt vid körning som standard för bättre kompatibilitet. Du kan konfigurera AOT-kompilatorn för att generera direkta anrop för valda P/Invoke-metoder som är bundna under starten av den dynamiska inläsaren som medföljer operativsystemet. De ohanterade bibliotek och startpunkter som refereras via direktanrop måste alltid vara tillgängliga vid körning, annars startar inte den interna binära filen.
Fördelarna med direkta P/Invoke-anrop är:
- De har bättre prestanda för stabilt tillstånd.
- De gör det möjligt att länka de ohanterade beroendena statiskt.
Du kan konfigurera den direkta P/Invoke-genereringen med hjälp av <DirectPInvoke> objekt i projektfilen. Objektnamnet kan vara antingen <modulename>, vilket möjliggör direkta anrop för alla startpunkter i modulen eller <modulename!entrypointname>, vilket möjliggör ett direktanrop endast för den specifika modulen och startpunkten.
Om du vill ange en lista över startpunkter i en extern fil använder du <DirectPInvokeList> objekt i projektfilen. En lista är användbar när antalet direkta P/Invoke-anrop är stort och det är opraktiskt att ange dem med hjälp av enskilda <DirectPInvoke> objekt. Filen kan innehålla tomma rader och kommentarer som börjar med #.
Exempel:
<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>
I Windows använder intern AOT en fördefinierad lista med direkta P/Invoke-metoder som är tillgängliga i alla versioner av Windows som stöds.
Varning
Eftersom direkta P/Invoke-metoder löses av operativsystemets dynamiska laddare och inte av det innfödda AOT-körbiblioteket, kommer direkta P/Invoke-metoder inte att respektera DefaultDllImportSearchPathsAttribute. Bibliotekssökningsordningen följer reglerna för dynamisk inläsning enligt operativsystemets definition. Vissa operativsystem och inläsare erbjuder sätt att styra dynamisk inläsning via länkflaggor (till exempel /DEPENDENTLOADFLAG i Windows eller -rpath i Linux). Mer information om hur du anger länkflaggor finns i avsnittet Länka .
Länkning
Om du vill länka statiskt mot ett ohanterat bibliotek måste du ange <NativeLibrary Include="filename" /> pekar på en .lib fil i Windows och en .a fil i Unix-liknande system.
Exempel:
<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>
Om du vill ange ytterligare flaggor för den inhemska länkaren, använder du objektet <LinkerArg>.
Exempel:
<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>
Inhemska exporter
Den Native AOT-kompilatorn exporterar metoder som har annoterats med UnmanagedCallersOnlyAttribute med en icke-tom EntryPoint egenskap som offentliga C-ingångspunkter. Detta gör det möjligt att antingen dynamiskt eller statiskt länka AOT-kompilerade moduler till externa program. Endast metoder som har markerats UnmanagedCallersOnly i den publicerade sammansättningen beaktas. Metoder i projektreferenser eller NuGet-paket exporteras inte.
Mer information finns i NativeLibrary-exempel.