es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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

Tags:  , ,

Answer

  1. Avatar for 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:

    [DllImport("ourdevice.so")]
    private static extern short AdcOpen(string adcName, string protocol, string port, ref short handle, byte performSwReset);
    
    // crea un delegado para la función importada
    private delegate short AdcOpenDelegate(string adcName, string protocol, string port, ref short handle, byte performSwReset);
    
    // asigna la función importada al delegado
    private static readonly AdcOpenDelegate adcOpen = AdcOpen;
    

    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.

Comments are closed.