Yerel kodun Yerel AOT ile birlikte çalışması

Yerel kod birlikte çalışması, yönetilen koddan yönetilmeyen kitaplıklara erişmenize veya yönetilen kitaplıkları ters yönde yönetilmeyen koda sunmanıza olanak tanıyan bir teknolojidir.

Yerel kod entegrasyonu Yerel AOT ve AOT dışı dağıtımlarda benzer şekilde çalışsa da, Yerel AOT olarak yayımlanırken bazı farklar mevcuttur.

Direct P/Invoke çağrıları

AOT derlenmiş ikili dosyalardaki P/Invoke çağrıları, daha iyi uyumluluk için varsayılan olarak çalışma zamanında gevşek bir şekilde bağlanır. AOT derleyicisini, işletim sistemiyle birlikte gelen dinamik yükleyici tarafından başlatma sırasında bağlanan seçili P/Invoke yöntemleri için doğrudan çağrılar oluşturacak şekilde yapılandırabilirsiniz. Doğrudan çağrılar aracılığıyla başvuruda bulunulan yönetilmeyen kütüphaneler ve giriş noktaları her zaman çalışma zamanında kullanılabilir olmalıdır, aksi takdirde yerel ikili dosya çalıştırılamaz.

Doğrudan P/Invoke çağrılarının avantajları şunlardır:

  • Daha iyi kararlı durum performansına sahiptirler.
  • Yönetilmeyen bağımlılıkları statik olarak bağlamayı mümkün hale getirir.

Proje dosyasındaki öğeleri kullanarak <DirectPInvoke> doğrudan P/Invoke oluşturmayı yapılandırabilirsiniz. Öğe adı, modüldeki tüm giriş noktaları için doğrudan çağrıları etkinleştiren modulename< veya yalnızca belirli bir modül ve giriş noktası için doğrudan çağrı sağlayan modulename!entrypointname><olabilir.>

Dış dosyadaki giriş noktalarının listesini belirtmek için proje dosyasındaki öğeleri kullanın <DirectPInvokeList> . Bir liste, doğrudan P/Invoke çağrılarının sayısı büyük olduğunda ve bunları tek tek <DirectPInvoke> öğeleri kullanarak belirtmek pratik olmadığında kullanışlıdır. Dosya, boş satırlar ve # ile başlayan açıklamalar içerebilir.

Örnekler:

<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>

Windows'da Yerel AOT, Windows'un desteklenen tüm sürümlerinde kullanılabilen doğrudan P/Invoke yöntemlerinin önceden doldurulmuş bir listesini kullanır.

Uyarı

Doğrudan P/Invoke yöntemleri, Yerel AOT çalışma zamanı kitaplığı tarafından değil, işletim sistemi dinamik yükleyicisi tarafından çözümlendiğinden, doğrudan P/Invoke yöntemleri DefaultDllImportSearchPathsAttribute öğesini dikkate almayacaktır. Kitaplık arama sırası, işletim sistemi tarafından tanımlanan dinamik yükleyici kurallarına uyar. Bazı işletim sistemleri ve yükleyiciler bağlayıcı bayrakları aracılığıyla (Windows veya /DEPENDENTLOADFLAG Linux gibi-rpath) dinamik yüklemeyi denetlemenin yollarını sunar. Bağlayıcı bayraklarını belirtme hakkında daha fazla bilgi için Bağlama bölümüne bakın.

Bağlantı Kurma

Yönetilmeyen bir kütüphaneye statik olarak bağlanmak için, Windows'ta bir <NativeLibrary Include="filename" /> dosyasını ve Unix benzeri sistemlerde bir .lib dosyasını işaret eden .a belirtmeniz gerekir.

Örnekler:

<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>

Yerel bağlayıcıya ek bayraklar belirtmek için <LinkerArg> öğesini kullanın.

Örnekler:

<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>

Özgün ihracatlar

Yerel AOT derleyicisi, boş olmayan UnmanagedCallersOnlyAttribute özelliklere sahip EntryPoint ile etiketli yöntemleri genel C giriş noktaları olarak dışarı aktarır. Bu, AOT derlenmiş modüllerin dış programlara dinamik veya statik olarak bağlanmasını mümkün kılar. Yalnızca yayımlanan derlemede işaretlenen UnmanagedCallersOnly yöntemler dikkate alınır. Proje başvurularındaki veya NuGet paketlerindeki yöntemler dışarı aktarılamaz. Daha fazla bilgi için bkz . NativeLibrary örneği.