2012-09-23 6 views
8

Sto procedendo a convertire un progetto piuttosto grande scritto in VB6 in C#. Data la dimensione del progetto che viene spostato, viene eseguito in fasi nel corso di 18 mesi. Ho riscontrato un problema con l'aggiunta di un riferimento di una DLL VB6 ActiveX a un progetto .Net.L'aggiunta di un riferimento VB6 in Visual Studio fornisce "Errore durante la verifica del tipo di importazione libreria"

Se segui esattamente questi passaggi, anche tu dovresti essere in grado di ricreare il problema.

Ho scritto un'interfaccia a Netto che è COM visibile:

<ComVisible(True)> 
Public Interface ITestInterface 
    Property A As String 
    Function TestMethod() As String 
End Interface 

Selezionando "Registra per interoperabilità COM" nella scheda Compila di proprietà del progetto, si ottiene un file TLB.

Ho creato un progetto VB6 che fa riferimento a questo TLB e una classe che implementa l'interfaccia esposta.

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 

Se ho impostato la scheda componenti della proprietà del progetto in VB6 per usare "File server remoto", quindi un TLB viene creato automaticamente durante la compilazione. Posso vedere che TLB in OleView e vedere il seguente (oltre ai dettagli della realizzazione concreta fatta in VB6 dell'interfaccia definita nel progetto .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"); 

Ora, creare un completamente nuovo. Progetto netto. Se posso aggiungere un riferimento alla DLL VB6, ottengo il seguente errore:

Impossibile risolvere il riferimento COM "ef005573-bfc7-436d-A382-f906ca09f94a" versione 3.0. L'importatore della libreria dei tipi ha riscontrato un errore durante la verifica del tipo. Prova a importare senza membri della classe.

Tuttavia, se io lancio un Visual Studio Command Prompt ed eseguire il seguente:

tlbimp TestVB6Interface.tlb /out:TestVB6Interface.MyInterop.dll 

allora posso aggiungere che dll come riferimento nella mia soluzione Net e funziona perfettamente bene.

La mia domanda. Cosa fa tlbimp sulla riga di comando che non viene eseguita quando aggiungo direttamente il riferimento? Quando il messaggio in Visual Studio dice "prova ad importare senza membri della classe", esattamente come lo faccio in Visual Studio? So come farlo in tlbimp.

Mi scuso per il muro di testo, ma volevo descrivere la situazione nel miglior modo possibile mantenendo le informazioni che ritenevo rilevanti.

+0

Hai mai capito questo? – JMK

+0

Abbiamo fatto (un po '). La classe VB6 che implementa l'interfaccia .Net deve essere impostata su "Attributo VB_Exposed = False" Ciò significa che non è nel TLB o è esposto all'esterno della DLL VB6, ma è comunque possibile passare i metodi esposti su COM in attesa dell'interfaccia .Net (e questo è tutto ciò di cui avevamo davvero bisogno comunque). Questo ha corretto il sintomo (l'errore va via!), Ma sicuramente non ha risolto il problema di root affrontato nella mia domanda poiché questa soluzione potrebbe non funzionare per tutti. –

+0

Abbastanza giusto, chiedendo pura curiosità, grazie per la risposta! – JMK

risposta

2

L'IDE di Visual Studio prende definitivamente un percorso diverso durante la registrazione di DLL per COM Interop, quindi quando esegue gli strumenti da riga di comando da un prompt dei comandi.

Dubito che Microsoft abbia documentato questo ovunque. Tuttavia, i miei anni di esperienza hanno dimostrato che questo è il caso. Una volta mi sono imbattuto in una situazione in cui un comando "regsvcs" da .NET 2.0 Framework avrebbe effettivamente causato un ciclo infinito. Se tu Google, probabilmente troverai altri che hanno avuto questo problema. Sono stato in grado di fare un ulteriore passo avanti usando VS IDE per eseguire la registrazione COM di un componente .NET assistito. Tuttavia, si è inevitabilmente concluso con errori. L'errore era un passo in avanti sul ciclo infinito. In entrambi i casi mi è stato dimostrato che VS IDE utilizza un diverso percorso di codice/logica di business quando si ha a che fare con Interoperabilità COM e voci di registro.

+0

Lo fa. Non importerà il TLB se ci sono avvisi. Il tipo di avvertenze che Tlbimp.exe visualizza sulla console e può spesso essere ignorato perché sono benigni. Prendere o lasciare. –

Problemi correlati