none
C# llamar a dll vb6 COM desde .NET RRS feed

  • Pregunta

  • Hola,

    Estoy teniendo problemas al llamar a una dll hecha con vb6 desde .NET (C#).

    La dll la tengo registrada, en el proyecto .NET añado la referencia COM, hasta aquí todo perfecto. Una vez añadida la referencia, para poder crear un objeto de esa clase tengo que poner a "falso" la opción "incrustar tipos de interoperabilidad". Una vez establecida puede crear un objeto:

    DllVB6 dll = new DllVB6();

    Hasta aquí todo bien, el problema está en que sólo me reconoce un sub o function de la dll, es decir, la clase en VB6 tiene 4 o 5 funciones públicas, pero desde C# sólo me reconoce una función, todas las funciones en VB6 están realizadas de la misma forma, no hay ninguna diferencia, aún así no entiendo porque sólo puedo llamar a una función.

    He probado con varias dll en VB6 y con todas pasa lo mismo.

    ¿Que puede ser?

    Saludos


    Jose

    lunes, 30 de mayo de 2016 11:08

Respuestas

  • Hola,

    ya he encontrado el problema, he ejecutado el comando tlbImp y me da la siguiente salida:

    El problema está en que la dll en VB6 contiene procedimientos con parámetros de tipo "ADODB.Connection". Supongo que como encuentra un problema en este método por eso no reconoce los demás procedimientos que no tienen parámetros de tipo "ADODB.Connection".

    ¿Esto se puede solucionar para que solo reconozca los métodos que no tengan este tipo de parámetros?

    Saludos


    Jose

    martes, 7 de junio de 2016 15:08
  • No creo que puedas pasar parámetros del tipo ADODB.Connection a la dll en VB6. ten en cuenta que en C#usas ADO.Net

    Lo que puedes hacer es llamr a esas funciones sin la conexión y que sean ellas (u otra función no pública) las que abran y cierren la conexión que necesiten.


    Saludos, Javier J

    miércoles, 8 de junio de 2016 10:12

Todas las respuestas

  • hola

    cuando creaste le referencia a la libreria COM tenia todas las funciones definidas?

    intente quitar la referencia, ve a la carpeta \bin\Debug y elimina el archivo que tenga en su nombre "Interop" ese es el proxy que crea .net a la dll COM

    vuelve a referenciar para que se cree un interop nuevo, quizas esto actualice las funciones faltantes

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    lunes, 30 de mayo de 2016 13:42
  • Hola,

    acabo de generar de nuevo la dll en vb6, la he registrado con "regsvr32", pero nada, sigue igual, sólo me reconoce una función de las 5 o 6 que tiene la clase.

    Saludos


    Jose

    lunes, 30 de mayo de 2016 15:37
  • ¿Alguna idea?

    Saludos


    Jose

    martes, 7 de junio de 2016 11:54
  • Te recomiendo abras una Consola de Desarrollo de Visual Studio y eecutes el siguiente comando para importar la dll y generar un Wrapper.

    tlbimp MiVB6.dll /out:NETMiVB6.dll

    Luego agregas la dll generada como referencia y listo

    Coméntanos


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    martes, 7 de junio de 2016 12:36
    Moderador
  • Hola,

    ya he encontrado el problema, he ejecutado el comando tlbImp y me da la siguiente salida:

    El problema está en que la dll en VB6 contiene procedimientos con parámetros de tipo "ADODB.Connection". Supongo que como encuentra un problema en este método por eso no reconoce los demás procedimientos que no tienen parámetros de tipo "ADODB.Connection".

    ¿Esto se puede solucionar para que solo reconozca los métodos que no tengan este tipo de parámetros?

    Saludos


    Jose

    martes, 7 de junio de 2016 15:08
  • Hola. Has registrado tus componentes de MSDAC con regsvr32?

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    martes, 7 de junio de 2016 16:36
    Moderador
  • Hola,

    acabo de descargar MSDAC desde la siguiente url 

    https://www.microsoft.com/en-us/download/confirmation.aspx?id=5793

    es un .EXE, lo he instalado pero nada, sigue el mismo problema.

    Saludos


    Jose

    miércoles, 8 de junio de 2016 8:41
  • No creo que puedas pasar parámetros del tipo ADODB.Connection a la dll en VB6. ten en cuenta que en C#usas ADO.Net

    Lo que puedes hacer es llamr a esas funciones sin la conexión y que sean ellas (u otra función no pública) las que abran y cierren la conexión que necesiten.


    Saludos, Javier J

    miércoles, 8 de junio de 2016 10:12