2010-06-08 10 views
9

Ho scritto un assembly .net utilizzando C# per eseguire funzioni che verranno utilizzate dal codice gestito e non gestito. Ho un progetto VB6 che ora ha bisogno di utilizzare l'assembly tramite COM.Riferimento all'assembly .NET in VB6 non funzionante

Ho creato il mio .net assembly, assicurandomi che ComVisible sia impostato su true e che sia registrato per l'interoperabilità COM tramite le proprietà del progetto.

public class MyClass 

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

} 

Costruisco l'assieme e copio il file in una cartella. TestInterop.dll

Quindi eseguo un file batch per registrare lo strumento di assemblaggio per registrare l'oggetto per COM.

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

I aprire una nuova applicazione VB6 e riferimento TestInterop.dll

In VB6 scrivo il seguente codice ed compila.

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

Dim strTest as string 

strTest = obj.GetRespose() 

Quando si esegue il programma, esso errori nella riga obj.GetResponse().

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

Inoltre, l'intellesense non funziona su obj. Ho dovuto digitare il metodo GetResponse. È normale?

Qualcuno ha idea di cosa potrebbe essere sbagliato o quali passaggi mi sono perso. Grazie!

risposta

11

Si vorrà inserire l'assembly .NET nel GAC oppure eseguire RegAsm con l'opzione della riga di comando/codebase (si lamenterà, ma almeno funzionerà). Nessun intellisense è normale, sfortunatamente.

+0

Ha funzionato come un fascino.Grazie mille! Ho eseguito lo strumento regasm usando il comando/codebase. Il/codebase crea anche il file tlb per te. Grazie a tutti per le vostre risposte. – dretzlaff17

4

L'ultima volta che l'ho visto, ho dimenticato di codificare i GUID. Quindi ogni volta che ho ricompilato VB non sarei riuscito a trovare il mio codice. Questo è un modello di VB.NET. (. Non utilizzare questi GUID, fare il proprio)

<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

credo, il file TLB viene creato nella directory quadro contro questa directory (C: \ Program Files \ TestApp).

Questo potrebbe essere il problema qui?

1

ho notato che non è necessario eseguire il RegAsm manualmente, in realtà solo impostare AssemblyInfo proprietà ComVisible true:

[assembly: ComVisible (true)]

È inoltre possibile effettuare questa operazione andando su Proprietà progetto -> Applicazione -> Informazioni sull'assemblaggio -> Rendi visibile l'assieme COM e imposta la casella di controllo.

Non è necessario registrare l'assembly che si sta creando nel GAC per poterlo utilizzare da VB6.

0

Stavo avendo l'errore -2147024894, o altri errori, non importa quello che ho provato, fino a quando ho eseguito il codice del consumatore vb6 direttamente da exe. Qualcosa sul debugger VB6 che mi impediva di permettermi di usare la DLL in fase di runtime. Non riuscivo nemmeno a creare un'istanza dell'oggetto. Potevo fare riferimento al tlb in fase di progettazione e avevo anche un perfetto supporto intellisense. Non appena ho lanciato l'applicazione all'esterno di Visual Studio, tutto ha funzionato perfettamente. Spero che questo aiuti qualcuno.

Problemi correlati