none
Problema con DLL hecha en .Net y llamada desde VB6 RRS feed

  • Pregunta

  • Hola, tengo una dll hecha en Vb .Net que tengo que utilizar desde Vb6. Me funciona bien, pero en un proceso, para actualizar la pantalla durante el mismo, lanzo un Reaseevent para que llame a un sub de la aplicación VB6. Pués bien, ahí tengo el problema pues me da "Error de automatización" al ejecutar   RaiseEvent OCR_Actualizar()

    Desde el examinador de objetos de VB6 veo la Clase  y su evento OCR_Actualizar

    ¿Que hago? Gracias


    Saludos, Javier J

    viernes, 13 de julio de 2012 15:54

Todas las respuestas

  • Podría ser cualquier cosa.  El detalle que provee no es suficiente.  ¿Usa hilos en el lado de .net o VB6?  ¿Eso es todo lo que sale en el error?  ¿Ya ha depurado su aplicación en .net?

    Jose R. MCP
    Code Samples

    viernes, 13 de julio de 2012 20:03
  • En .Net funciona bien, el error lo da en la linea del reaseevent y solo pone eso.

    En VB6 tengo referenciada la dll (ClaseOCR.dll) de .net, declaro la variable como
    Private WithEvents oNSOCR As ClaseOCR.ClassNSOCR

    Set oNSOCR = New ClaseOCR.ClassNSOCR

    oNSOCR.Procesar

    y en .Net

    <ClassInterface(ClassInterfaceType.AutoDual), _
     ComSourceInterfaces("ClaseOCR.IOCReventos")> _
    Public Class ClassNSOCR
        Implements IOCRmetodos

        Public Sub Procesar
            ProduceEvento
        End Sub

    <ComVisible(False)> _

        Public Delegate Sub elEventoHandler()

        Public Event ProcesarAs elEventoHandler

        Protected Sub ProduceEvento()
            RaiseEvent OCR_Actualizar()    ' <<<< Al ejecutar esta orden da el error en VB6
        End Sub

    End Class


    Saludos, Javier J

    sábado, 14 de julio de 2012 8:45
  • ¿Y qué es OCR_Actualizar()?

    Jose R. MCP
    Code Samples

    sábado, 14 de julio de 2012 12:37
  • OCR_Actualizar es el proceso  que he creado en la aplicación VB6 para poder actualizar datos mientras se ejecuta el método de la clase .Net. Pero no llega a entrar en ese proceso.



    Saludos, Javier J

    sábado, 14 de julio de 2012 13:36
  • En .net usted tiene una función que se llama OCR_Actualizar(), ¿o me equivoco?  Ese Protected Sub ProduceEvento() es .net, ¿cierto?

    Jose R. MCP
    Code Samples

    sábado, 14 de julio de 2012 15:21
  • Si, está definido como

    Public Event OCR_Actualizar As elEventoHandler

    Pero se trata de que ese evento sea un método definido en VB6.


    Saludos, Javier J

    sábado, 14 de julio de 2012 16:19
  • A ver si entiendo:  ¿Su componente de .Net se suscribe a eventos de algún objeto en VB6?  Veo que es un delegate.  Usualmente antes de ejecutar un delegate uno verifica que no sea nulo.  ¿Hace usted esta verificación?

    Jose R. MCP
    Code Samples

    sábado, 14 de julio de 2012 17:25
  • Si, es un delegate.

    No entiendo lo de verificar que no sea nulo. ¿No se trata de que llama al procedimiento que debe estar definido donde se ha llamado a la clase?


    Saludos, Javier J

    sábado, 14 de julio de 2012 17:32
  • Un delegate puede ser nulo.  Así de fácil.  Si usted tiene seguridad que no es nulo, pues perfecto, ejecútelo con confianza, pero si no, mejor es poner un IF.

    Personalmente nunca aprendí VB.net; pasé directo de VB6 a C# y .net 2.0, así que no estoy seguro si RaiseEvent sigue vigente en .Net.  En C# los eventos se ejecutan ejecutando el delegado, así como usted está ejecutando el delegado OCR_Actualizar.  Sin embargo, es práctica común revisar que no sea nulo (Nothing en VB) con un IF:  If (OCR_Actualizar != null) OCR_Actualizar();.  No hay tal RaiseEvent, y hasta donde sé eso también debería funcionar en VB.net.

    En cuanto a VB5 y 6, los objetos son objetos COM y los eventos son eventos COM.  Hay un lado que los ejecuta y otro lado que se suscribe.  Según su descripción inicial del problema, creía que el lado que proveía el evento era VB6 y el que consumía el evento era .net.   Parece que es al revés.  ¿O me equivoco?

    Creo que lo que no me queda claro es el panorama de quién es el dueño del evento y quién consume el evento.


    Jose R. MCP
    Code Samples

    sábado, 14 de julio de 2012 19:59
  • Desde VB6 llamo a un proceso que he incluido en una Dll hecha en .Net. Al ejecutar el evento delegado con raiseevent pretendo que ese proceso en .Net haga llamadas a una subrutina en VB6. 

    Saludos, Javier J

    sábado, 14 de julio de 2012 20:35
  • Desde VB6 llamo a un proceso

    ¿Está ejecutando un proceso externo, o sea un EXE?  Cuando leo la palabra "proceso" eso es lo que pienso:  Un ejecutable aparte.

    que he incluido en una Dll hecha en .Net

    Asumiendo que sí es un EXE, ¿cómo es que ha incluido el EXE en una DLL en .net?  ¿Cómo un recurso, o algo más?

    Al ejecutar el evento delegado con raiseevent

    ¿En qué lado está usted ejecutando el evento delegado:  .Net o VB6?  Supongo que es .Net pero quisiera confirmación porque como no sé VB.net y no sé si RaiseEvent es VB clásico o puede ser VB.net también.

    pretendo que ese proceso en .Net haga llamadas a una subrutina en VB6

    ¿Cómo pretende esto?  ¿Conectó usted el código VB6 con un WithEvents, supongo, y es el que usted muestra en el código original al inicio?  No veo el código para el evento en VB6 clásico.  ¿Podría usted mostrarlo?  Porque estoy entendiendo que debería haber algo escrito para el evento en VB6 porque al fin y al cabo para eso es la palabra clave WithEvents.

    Entonces hasta ahora entiendo esto:  Usted tiene algo en .net (que no sé bien si es un DLL, un EXE o ambos) que sirve como servidor COM que es consumido por VB6.  Usted quiere conectarse a un evento particular de uno de los objetos COM provistos en .Net y por eso declara la variable con WithEvents.  A la hora de que el evento trata de ejecutarse usted obtiene el error descrito.


    Jose R. MCP
    Code Samples

    sábado, 14 de julio de 2012 20:51
  • En VB6 tengo

    Private WithEvents oNSOCR As ClaseOCR.ClassNSOCR
    Set oNSOCR = New ClaseOCR.ClassNSOCR
    oNSOCR.Procesar

    Private Sub oNSOCR_OCR_Actualizar()  ' Este es proceso que quiero que se ejecute con raiseevent

    Data1(1).Refresh

    End Sub

    En .Net tengo una DLL como servidor COM y cuando desde .Net ejecuto raiseevent da el error.

    Al ejecutar la subrutina de la DLL desde VB6 se queda esperando hasta su finalización y lo que pretendo es poder actualizar la información en la pantalla de la aplicación VB6 mientras se ejecuta esa subrutina.



    Saludos, Javier J

    sábado, 14 de julio de 2012 21:45
  • OK, creo que sí entendí bien el asunto.  Por "proceso" se refiere a la rutina Procesar() del objeto COM en .Net.

    Pues podría haber algún problemilla por ahí pero no conozco de VB.net así que no le sé decir con exactitud.  ¿Ha probado consumir el evento desde otro ejecutable, tal vez escrito en C++ o .net?  Solamente para saber si el evento funciona con otros clientes.  ¿Y ha probado consumiendo otros eventos desde VB6 para ver si el problema aparece en todos los eventos o solamente OCR_Actualizar?


    Jose R. MCP
    Code Samples

    sábado, 14 de julio de 2012 22:20
  • ¿Se puede llamar al COM en segundo plano? Me refiero a si se puede ejecutar el objeto COM sin que VB6 se quede bloqueado esperando a que finalice ese proceso.



    Saludos, Javier J

    sábado, 14 de julio de 2012 22:47
  • Sí es posible creando un nuevo hilo.  Pero VB6 es una pesadilla para eso.  Sería mejor que el objeto COM implemente métodos asíncronos y así puede crear el hilo en .net.

    Jose R. MCP
    Code Samples

    sábado, 14 de julio de 2012 23:06