Pregunta

He intentado resolver este problema durante mucho tiempo y nada parece funcionar.

Tengo una DLL COM escrita en vb6. Agrego una referencia a esta DLL en .net, con las propiedades 'aisladas' y 'copia locales' establecidas en true en la referencia. Aparentemente, se supone que esto habilita a com libre de reg.

Pero no funciona. Si lo intento en otra computadora, o anulo el registro de la DLL con regsvr32, intentar acceder a la DLL produce una excepción (esencialmente diciendo que la clase de comunicación deseada no existe). La DLL y los archivos de manifiesto están en la misma carpeta que el EXE, pero aparentemente los ignora por completo.

¿Qué estoy haciendo mal? He leído un montón de artículos dispersos sobre esto, pero ninguno de ellos me da una solución de trabajo. He jugado con el estudio visual en vano. He jugado una pequeña cantidad con make-my-manifest, pero no funcionó (incluso en un proyecto de prueba).

¿Fue útil?

Solución

Estaba creando y usando la clase com en un subproceso que no es ui. Al parecer Reg-Free com en DLL vb6 no funciona en esa situación. Este código de prueba lo muestra:

Private Sub RunTest() Handles Button1.Click
    Try
        Dim x As New RegTestProject.RegTestCall
        MsgBox(x.RegTestFunction())
    Catch ex As Exception
        MsgBox(ex.ToString)
    End Try
End Sub

Private Sub RunThreadedTest() Handles Button2.Click
    'fails if reg-free COM is used'
    Dim t As New Threading.Thread(AddressOf RunTest)
    t.Start()
End Sub

Cuando ejecuto esto con la DLL registrada normalmente, ambas pruebas tienen éxito. Si utilizo reg-free com, la prueba de subprocesos falla aunque la prueba normal aún tenga éxito. Parece que esto va a ser un gran problema para la solución.

Otros consejos

Estoy bastante seguro de que cuando hace referencia a los componentes COM de esta manera, la importación del componente COM ocurre cada vez que se crea. Eso significa que el componente COM debe registrarse de manera tradicional en cada máquina en la que se construirá el proyecto.

Aquí hay un enlace que describe el uso del registro libre com interoperabilidad. Si ya has hecho esto, por favor publica tu archivo de manifiesto. Es posible que tenga un error tipográfico de su falta.

Editar

Una simple idea podría ser más simple simplemente registrar la dll la primera vez que la aplicación se ejecuta en una nueva máquina. El registro gratuito com interopt solo está disponible en Windows XP y más reciente, por lo tanto, si no está apuntando a dinosaurios, no funcionará.

Aquí hay un extracto de la sección Solución de problemas de un MSDN artículo sobre COM libre de registros. Disculpas si ya lo has visto. La buena noticia es que ya eres parte del camino a través de los pasos. Se sugiere reproducir el problema en Windows Server 2003 (tal vez con PC virtual ?) y luego el registro de eventos debería ayudar.

  

Primero consigue ... tu cliente trabaja con   un servidor registrado; luego anular el registro   El servidor y verifica que tu error.   mensaje es lo que esperabas; y   finalmente ... fabricar y desplegar manifiesto   archivos. De esta manera su solución de problemas   esfuerzos ... se limitarán a la   estructura de sus archivos de manifiesto (y   La correcta incrustación del montaje.   manifiesto si decide hacerlo).

     

Al solucionar problemas sin registro   Problemas de COM, el Visor de eventos en   Windows Server 2003 es tu amigo ...   busque en el Registro de eventos del sistema los eventos del servidor COM.   No sugiero que mires al   Registro de eventos de Windows XP ...   contendrá invariablemente un   mensaje ... que no ayuda   identificar el problema.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top