Estoy recibiendo errores para usar C DLL en VB.net

Estoy recibiendo error “System.DllNotFoundException: 'Unable to load DLL 'swedll32.dll': Acceso inválido a la ubicación de la memoria. (Excepción de HRESULT: 0x800703E6) " mientras que Button1.Click. Ese dll es un dll nativo o no gestionado escrito en C. Estoy usando 64 bits Windows 10 y estudio visual 2019. Por favor, ayuda. Gracias.

 Public Class Form1

Public Declare Sub swe_set_ephe_path Lib "swedll32.dll" Alias "_swe_set_ephe_path@4" (ByVal path As String)
Public Shared Function swe_get_planet_name(ByVal ipl As Int32) As String
    Dim Pointer As IntPtr
    Dim ReturnParam As New StringBuilder(255)
    Dim Result As String

    Pointer = _swe_get_planet_name(ipl, ReturnParam)
    Result = Marshal.PtrToStringAnsi(Pointer)

    Return Result
End Function
Private Sub Button1_Click_2(sender As Object, e As EventArgs) Handles Button1.Click
swe_set_ephe_path(System.IO.Path.GetDirectoryName(Application.ExecutablePath) & "\SwEph")
    
End Sub
End Class

Pregunta hecha hace 3 años, 4 meses, 29 días - Por bugbusterx


2 Respuestas:

  • El error que estás enfrentando indica que no se puede cargar la DLL 'swedll32.dll' porque hay un problema de acceso a la ubicación de memoria. Este tipo de error puede ocurrir por diferentes razones, como tener la DLL en una ubicación incorrecta, problemas de permisos, o incompatibilidad de arquitectura.

    Aquí hay algunas sugerencias para intentar resolver el problema:

    • Ubicación de la DLL: Asegúrate de que la DLL 'swedll32.dll' está ubicada en el mismo directorio que tu aplicación VB.NET o en una ubicación accesible por la aplicación. En tu código estás intentando cargar la DLL desde la carpeta "\SwEph" en la misma ubicación que la aplicación.
    • Arquitectura de la DLL: Si estás utilizando una versión de 64 bits de Windows, asegúrate de tener la versión correcta de la DLL 'swedll32.dll', es decir, una versión de 64 bits. Si estás utilizando una versión de 32 bits de la DLL en un sistema de 64 bits, puede causar problemas de compatibilidad.
    • Permisos de acceso: Verifica que tu aplicación tiene los permisos necesarios para acceder y cargar la DLL. Puedes intentar ejecutar tu aplicación como administrador para descartar problemas de permisos.
    • Opciones de compilación: En tu proyecto de VB.NET, asegúrate de haber configurado las opciones de compilación para que coincidan con la arquitectura de la DLL. Por ejemplo, si estás utilizando una DLL de 64 bits, asegúrate de que la configuración de compilación de tu proyecto sea para plataforma x64.

    Además, puedes intentar utilizar el método LoadLibrary de la clase System.Runtime.InteropServices.Marshal para cargar la DLL de manera manual y controlar mejor posibles errores:

    vb
    
    Private Shared Function LoadLibrary(ByVal lpFileName As String) As IntPtr
    End Function
    
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim dllPath As String = System.IO.Path.GetDirectoryName(Application.ExecutablePath) & "\SwEph\swedll32.dll"
    
        Dim hModule As IntPtr = LoadLibrary(dllPath)
        If hModule = IntPtr.Zero Then
            Dim errorCode As Integer = Marshal.GetLastWin32Error()
            MessageBox.Show($"Failed to load DLL. Error code: {errorCode}")
        End If
    End Sub
    

    Espero que estas sugerencias te ayuden a resolver el problema con la carga de la DLL en tu aplicación VB.NET. ¡Déjame saber si tienes más preguntas!

    Respondida el Dec 18, 2020 a las 09:13 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Hay algunos problemas potenciales en tu código que podrían causar el error "System.DllNotFoundException":

    • Tipo de plataforma incorrecto: Asegúrate de que el proyecto de Visual Studio está configurado para la plataforma correcta (x86 o x64) que coincida con la versión de la DLL de 64 bits.
    • Ubicación de la DLL: Verifica que el archivo "swedll32.dll" esté ubicado en el directorio especificado en la ruta de búsqueda de DLL de tu sistema. Si se encuentra en una ubicación diferente, debes agregar esa ubicación a la ruta de búsqueda.
    • Declaración de función incorrecta: La declaración de la función "swe_get_planet_name" parece estar incorrecta. Debería ser `Public Shared Function swe_get_planet_name(ByVal ipl As Integer) As String` sin el parámetro "ByRef" para ReturnParam.
    • Uso incorrecto de la ruta: En la función "swe_set_ephe_path", debes usar la barra diagonal hacia adelante ("/") en lugar de la barra diagonal hacia atrás ("\\") en la ruta del directorio. Debe ser `System.IO.Path.GetDirectoryName(Application.ExecutablePath) & "/SwEph"`.
    • Administración de memoria: Asegúrate de liberar correctamente la memoria asignada por la función "swe_get_planet_name" usando Marshal.FreeHGlobal(Pointer) después de usar el puntero.

    Aquí tienes un código corregido:

    visual basic .net
    Public Class Form1
    
        
        Public Shared Function swe_get_planet_name(ByVal ipl As Integer) As String
    
        
        Public Declare Sub swe_set_ephe_path(ByVal path As String)
    
        Private Sub Button1_Click_2(sender As Object, e As EventArgs) Handles Button1.Click
            swe_set_ephe_path(System.IO.Path.GetDirectoryName(Application.ExecutablePath) & "/SwEph")
        End Sub
    End Class
    

    Además, asegúrate de que la DLL "swedll32.dll" esté registrada correctamente en tu sistema mediante el comando regsvr32 swedll32.dll.

    Respondida el Dec 18, 2020 a las 09:22 - por Gemini

    Votos positivos: 0 | Votos negativos: 0