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.
Hai mai capito questo? – JMK
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. –
Abbastanza giusto, chiedendo pura curiosità, grazie per la risposta! – JMK