2012-09-23 17 views
8

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.

+0

¿Alguna vez resolvió esto? – JMK

+0

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. –

+0

¡Bastante justo, preguntando por pura curiosidad, gracias por la respuesta! – JMK

Respuesta

2

El IDE de Visual Studio definitivamente toma una ruta diferente al registrar archivos DLL para COM Interop, luego lo hace cuando ejecuta las herramientas de línea de comandos desde un símbolo del sistema.

Dudo que Microsoft haya documentado esto en ninguna parte. Sin embargo, mis años de experiencia han demostrado que este es el caso. Una vez me encontré con una situación en la que un comando "regsvcs" del .NET 2.0 Framework en realidad causaba un bucle infinito. Si lo busca en Google probablemente encontrará otros que hayan tenido este problema. Pude ir un paso más allá al usar el VS IDE para realizar el registro COM de un componente de servicio .NET. Sin embargo, inevitablemente terminó en error. El error fue un paso adelante en el ciclo infinito. De cualquier forma, me demostró que VS IDE toma una ruta de acceso de código/lógica comercial diferente cuando se trata de COM Interop y entradas de registro.

+0

Lo hace. No importará el TLB si hay advertencias. El tipo de advertencias que Tlbimp.exe muestra en la consola y, a menudo, pueden ignorarse porque son benignas. Da o toma. –

Cuestiones relacionadas