Usuario
Problema con DLL hecha en .Net y llamada desde VB6

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
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 -
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.ClassNSOCRSet oNSOCR = New ClaseOCR.ClassNSOCR
oNSOCR.Procesar
y en .Net
<ClassInterface(ClassInterfaceType.AutoDual), _
ComSourceInterfaces("ClaseOCR.IOCReventos")> _
Public Class ClassNSOCR
Implements IOCRmetodosPublic 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 SubEnd Class
Saludos, Javier J
-
¿Y qué es OCR_Actualizar()?
Jose R. MCP
Code Samples -
-
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 -
-
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 -
-
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 -
-
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 -
En VB6 tengo
Private WithEvents oNSOCR As ClaseOCR.ClassNSOCR
Set oNSOCR = New ClaseOCR.ClassNSOCR
oNSOCR.ProcesarPrivate Sub oNSOCR_OCR_Actualizar() ' Este es proceso que quiero que se ejecute con raiseevent
Data1(1).Refresh
End SubEn .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
-
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í 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