Estoy en el proceso de convertir un proyecto bastante grande escrito en VB6 en C#. Dado el tamaño del proyecto que se mueve, se está haciendo en fases en el transcurso de 18 meses. Me encuentro con un problema al agregar una referencia de un dll ActiveX VB6 a un proyecto .Net.Agregar una referencia VB6 en Visual Studio da "Importador de biblioteca de tipos encontró un error durante la verificación de tipo"
Si sigue exactamente estos pasos, también debería poder volver a crear el problema.
He escrito una interfaz en .Net que es visible COM:
<ComVisible(True)>
Public Interface ITestInterface
Property A As String
Function TestMethod() As String
End Interface
Al seleccionar "Registrar para interoperabilidad COM" en la ficha compilar de propiedades del proyecto, se obtiene un archivo TLB.
He creado un proyecto VB6 que hace referencia a este TLB y una clase que implementa la interfaz expuesta.
Implements ITestInterface
Private mA As String
Public Property Get ITestInterface_A() As String
ITestInterface_A = mA
End Property
Public Property Let ITestInterface_A(ByVal value As String)
mA = value
End Property
Public Function ITestInterface_TestMethod() As String
ITestInterface_TestMethod = "From VB6"
End Function
si fijo la ficha componentes de las propiedades del proyecto en VB6 usar "Archivos de servidor remoto", entonces una TLB se crea automáticamente al compilar. Puedo ver que TLB en Oleview y ver lo siguiente (además de los detalles de la implementación concreta hecho en VB6 de la interfaz definida en el proyecto .Net):
// typelib filename: TestVB6Interface.dll
[
uuid(**EF005573-BFC7-436D-A382-F906CA09F94A**),
version(3.0)
]
// ... some other stuff
// TLib : // TLib : : {79EC733A-0267-4506-8D38-C4D4655E0755}
importlib("SimpleDotNetLibrary.tlb");
Ahora, puedo crear una completamente nueva. Proyecto neto Si agrego una referencia a la DLL de VB6, me sale el siguiente error:
No se pudo resolver la referencia COM "ef005573-bfc7-436d-A382-f906ca09f94a" versión 3.0. El importador de la biblioteca de tipos encontró un error durante la verificación de tipo. Intenta importar sin miembros de la clase.
Sin embargo, si lanzo un Visual Studio del sistema y ejecute el siguiente:
tlbimp TestVB6Interface.tlb /out:TestVB6Interface.MyInterop.dll
entonces puedo añadir que DLL como una referencia en mi solución .Net y funciona perfectamente bien.
Mi pregunta. ¿Qué está haciendo tlbimp en la línea de comandos que no se está haciendo cuando simplemente agrego la referencia directamente? Cuando el mensaje en Visual Studio dice "intente importar sin miembros de la clase", ¿cómo exactamente lo hago en Visual Studio? Sé cómo hacer eso en tlbimp.
Pido disculpas por el muro de texto, pero quería describir la situación lo mejor que pude para mantener la información que consideraba relevante.
¿Alguna vez resolvió esto? – JMK
Lo hicimos (un poco). La clase VB6 que implementa la interfaz .Net debe configurarse como "Atributo VB_Exposed = False" Esto significa que no está en el TLB ni está expuesta fuera de la DLL VB6, pero aún se pueden pasar los métodos expuestos a través de COM esperando la interfaz .Net (y eso es todo lo que realmente necesitamos de todos modos). Esto solucionó el síntoma (¡el error desaparece!), Pero definitivamente no solucionó el problema de raíz tratado en mi pregunta, ya que esta solución podría no funcionar para todos. –
¡Bastante justo, preguntando por pura curiosidad, gracias por la respuesta! – JMK