2010-06-08 14 views
9

Escribí un ensamblado .net usando C# para realizar funciones que serán utilizadas por código administrado y no administrado. Tengo un proyecto VB6 que ahora necesita usar el ensamblado a través de COM.Hacer referencia al ensamblado .NET en VB6 no funcionará

Creé mi .NET assembly, me aseguré de que ComVisible esté configurado en true y de que esté registrado para interoperabilidad COM a través de las propiedades del proyecto.

public class MyClass 

    [ComVisible(true)] 
    public string GetResponse() 
    { 
     return "Testing Response" 
    } 

} 

Construyo el ensamblaje y copio el archivo en una carpeta. TestInterop.dll

A continuación, ejecuto un archivo por lotes para registrar la herramienta de ensamblaje para registrar el objeto para COM.

cd C:\Windows\Microsoft.NET\Framework\v4.0.30319\ 
regasm "c:\Program Files\TestApp\TestInterop.dll" /tlb:TestInterop.tlb 

puedo abrir una nueva aplicación de Visual Basic 6 y referencia TestInterop.dll

En VB6 escribo el siguiente código y compila.

Dim obj as TestInterop.MyClass 
Set obj = new TestInterop.MyClass 

Dim strTest as string 

strTest = obj.GetRespose() 

Cuando corro los errores que programa en la línea obj.GetResponse().

Run-time error' -2147024894 (80070002'): 
Automation error 
The system cannot find the file specified 

Además, el intellesense no funciona en obj. Tuve que escribir el método GetResponse. ¿Esto es normal?

¿Alguien tiene alguna pista de lo que podría estar mal o qué pasos me perdí. ¡Gracias!

Respuesta

11

Querrá poner su ensamblado .NET en el GAC o bien ejecutar RegAsm con el modificador de línea de comando/codebase (se quejará, pero al menos funcionará). Sin intellisense es normal, por desgracia.

+0

Funcionó como un encanto.¡Muchas gracias! Ejecuté la herramienta Regasm usando el comando/codebase. La/codebase también crea el archivo tlb para usted. Gracias a todos por sus respuestas. – dretzlaff17

4

La última vez que vi que olvidé codificar los GUID. Así que cada vez que volví a compilar VB no podría encontrar mi código. Esta es una plantilla de VB.NET. (. No utilice estos GUID, hacer su propio)

<ComClass(ComClass1.ClassId, ComClass1.InterfaceId, ComClass1.EventsId)> _ 
Public Class ComClass1 

#Region "COM GUIDs" 
    ' These GUIDs provide the COM identity for this class 
    ' and its COM interfaces. If you change them, existing 
    ' clients will no longer be able to access the class. 
    Public Const ClassId As String = "eaf83044-f0a7-417b-b333-e45aec398ca5" 
    Public Const InterfaceId As String = "84e0fb8f-266d-40e6-9e8c-3d4eb37d3bf0" 
    Public Const EventsId As String = "22ea2214-032f-4eb6-b2d4-c5dd213bab87" 
#End Region 

    ' A creatable COM class must have a Public Sub New() 
    ' with no parameters, otherwise, the class will not be 
    ' registered in the COM registry and cannot be created 
    ' via CreateObject. 
    Public Sub New() 
     MyBase.New() 
    End Sub 

End Class 
0

creo, el archivo TLB se genera en el directorio marco contra este directorio (c: \ Archivos de programa \ TestApp).

¿Podría ser ese el problema aquí?

1

me he dado cuenta de que no es necesario para ejecutar el RegAsm manualmente, en realidad acaba de establecer AssemblyInfo ComVisible propiedad en true:

[assembly: ComVisible (true)]

También puede hacer esto vaya a Propiedades del proyecto -> Aplicación -> Información de ensamblaje -> Haga visible el ensamblaje COM y configure la casilla de verificación.

No es necesario registrar el ensamblaje que está creando en el GAC para usarlo desde VB6.

0

Estaba teniendo el error -2147024894, u otros errores sin importar lo que intenté, hasta que ejecuté el código de consumidor vb6 directamente desde exe. Algo sobre el depurador VB6 que me impedía usar el dll en tiempo de ejecución. Ni siquiera pude crear una instancia del objeto. Pude referirme a la tlb en el momento del diseño, y también tuve soporte intellisense perfecto. Tan pronto como inicié la aplicación fuera de Visual Studio todo funcionó perfectamente. Espero que esto ayude a alguien.

Cuestiones relacionadas