¿Existe un módulo y función equivalente en Linux para LoadLibrary() de kernel32.dll que pueda llamar desde .Net Core?
Estoy trabajando en la migración de una aplicación .Net Core 3.1 de Windows a Linux.
Tengo un archivo ourdevice.dll en Windows, y el equivalente ourdevice.so creado para Linux.
Este archivo DLL es un archivo DLL nativo que estamos utilizando en Windows con un envoltorio pinvoke.
Cargamos las funciones del archivo DLL nativo utilizando DllImport de kernel32.dll.
[DllImport("kernel32.dll", EntryPoint = "LoadLibrary", SetLastError = true)]
public static extern IntPtr LoadLibrary(string dllToLoad);
[DllImport("kernel32.dll")]
public static extern IntPtr GetProcAddress(IntPtr hModule, string procedureName);
[DllImport("kernel32.dll")]
public static extern bool FreeLibrary(IntPtr hModule);
Creamos delegados para cada una de las funciones a importar:
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
private delegate short AdcOpen([MarshalAs(UnmanagedType.LPStr)] string adcName, [MarshalAs(UnmanagedType.LPStr)] string protocol, [MarshalAs(UnmanagedType.LPStr)] string port, ref short handle, byte performSwReset);
private AdcOpen adcOpen;
Luego mapeamos todas las funciones nativas de la siguiente manera:
IntPtr pAddressOfFunction;
pDll = LoadLibrary(LibraryName);
// comprobamos si se cargó la biblioteca
if (pDll != IntPtr.Zero)
{
// obtenemos la dirección de la función nativa
pAddressOfFunction = GetProcAddress(pDll, "AdcOpen");
if (pAddressOfFunction != IntPtr.Zero)
adcOpen = (AdcOpen)Marshal.GetDelegateForFunctionPointer(pAddressOfFunction, typeof(AdcOpen));
else
message += "Función AdcOpen no encontrada\n";
// recorte de carga de todas las funciones exportadas
}
En la aplicación de Linux, obviamente no podemos usar kernel32.dll.
Estamos escribiendo C# en .Net Core en Linux, y tenemos el módulo nativo ourdevice.so.
¿Cómo puedo importar las funciones del módulo nativo de Linux en nuestro envoltorio C#?
¿Es esto incluso posible?
davy.ai
Sí, es posible importar funciones de un módulo nativo de Linux a un envoltorio C# en .Net Core. Sin embargo, en lugar de utilizar DllImports de kernel32.dll, deberás usar el atributo DllImport del espacio de nombres System.Runtime.InteropServices.
Aquí tienes un ejemplo de cómo puedes importar una función de un módulo nativo de Linux:
Después, puedes utilizar la función importada como lo harías normalmente en tu código C#.
Ten en cuenta que la API exacta para importar funciones puede variar dependiendo de la plataforma y el sistema operativo que estés utilizando, por lo que es posible que necesites consultar la documentación de tu entorno específico para obtener más detalles.