Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Ez a cikk bemutatja, hogy a futtatókörnyezet mely útvonalakon keres natív kódtárak P/Invoke használatával való betöltésekor. Azt is bemutatja, hogyan kell használni SetDllImportResolver.
Könyvtárnév-változatok
A platformfüggetlen P/Invoke kód egyszerűbb megkönnyítése érdekében a futtatókörnyezet hozzáadja a canonical shared library bővítményt (.dll.sovagy .dylib) a natív kódtárnevekhez. Unix-alapú platformokon a futtatókörnyezet megpróbálja az lib előtagolását is. Ezeket a könyvtárnév-változatokat automatikusan megkeresik a natív könyvtárakat betöltő API-k, például DllImportAttribute használatakor.
Megjegyzés
A kódtárnevek abszolút elérési útjai (például ) a következőképpen vannak kezelve, /usr/lib/libc.soés a rendszer nem keres változatokat.
Vegye figyelembe a P/Invoke használatát az alábbi példában:
[DllImport("nativedep")]
static extern int ExportedFunction();
Windows rendszeren való futtatáskor a DLL a következő sorrendben lesz keresve:
nativedep-
nativedep.dll(ha a könyvtár neve még nem végződik.dll-val/vel vagy .exe-val/vel)
Linux vagy macOS rendszeren való futtatáskor a futtatókörnyezet megpróbálja előre hozzáadni a lib és utána illeszteni a kanonikus megosztott könyvtár kiterjesztést. Ezeken az operációs rendszereken a könyvtárnév-változatokat a következő sorrendben próbálják ki:
nativedep.so/nativedep.dylib-
libnativedep.so/libnativedep.dylib1 nativedep-
libnativedep1
Linuxon a keresési sorrend eltérő, ha a kódtár neve végződik .so vagy tartalmaz .so. (jegyezze fel a zárót .). Vegyük a következő példát:
[DllImport("nativedep.so.6")]
static extern int ExportedFunction();
Ebben az esetben a könyvtárnév-változatokat a következő sorrendben próbálják:
nativedep.so.6-
libnativedep.so.61 nativedep.so.6.so-
libnativedep.so.6.so1
1 Az elérési út csak akkor van bejelölve, ha az erőforrástár neve nem tartalmaz könyvtárelválasztó karaktert (/).
Egyéni importálási megoldó
Összetettebb esetekben a DLL-importálások futásidőben történő feloldására is használható SetDllImportResolver . Az alábbi példában a nativedep értéke nativedep_avx2 lesz, ha a processzor támogatja azt.
Tipp.
Ez a funkció csak a .NET Core 3.1-ben és a .NET 5+-ban érhető el.
using System;
using System.Reflection;
using System.Runtime.InteropServices;
namespace PInvokeSamples
{
public static partial class Program
{
[LibraryImport("nativedep")]
private static partial int ExportedFunction();
public static void Main(string[] args)
{
// Register the import resolver before calling the imported function.
// Only one import resolver can be set for a given assembly.
NativeLibrary.SetDllImportResolver(Assembly.GetExecutingAssembly(), DllImportResolver);
int value = ExportedFunction();
Console.WriteLine(value);
}
private static IntPtr DllImportResolver(string libraryName, Assembly assembly, DllImportSearchPath? searchPath)
{
if (libraryName == "nativedep")
{
// On systems with AVX2 support, load a different library.
if (System.Runtime.Intrinsics.X86.Avx2.IsSupported)
{
return NativeLibrary.Load("nativedep_avx2", assembly, searchPath);
}
}
// Otherwise, fallback to default import resolver.
return IntPtr.Zero;
}
}
}