Jestem w trakcie konwersji dość dużego projektu napisanego w VB6 na C#. Biorąc pod uwagę rozmiar przenoszonego projektu, jest on przeprowadzany etapami w ciągu 18 miesięcy. Występuje problem z dodaniem odwołania do biblioteki ActiveX dll VB6 do projektu .Net.Dodanie odwołania VB6 w Visual Studio daje "Importer bibliotek typów napotkał błąd podczas weryfikacji typu"
Jeśli wykonasz dokładnie te kroki, Ty również powinieneś móc odtworzyć problem.
Pisałem interfejs w .NET, który jest widoczny COM:
<ComVisible(True)>
Public Interface ITestInterface
Property A As String
Function TestMethod() As String
End Interface
Wybierając „Zarejestruj się za współdziałanie COM” w zakładce kompilacji właściwości projektu, otrzymasz plik TLB.
Stworzyłem projekt VB6, który odwołuje się do TLB i klasy, która implementuje odsłonięty interfejs.
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
Jeżeli ustawić Component zakładkę właściwości projektu w VB6 używać „zdalny serwer plików”, a następnie TLB jest automatycznie tworzona podczas kompilacji. Mogę zobaczyć, że TLB w OleView i zobaczyć następujące (w uzupełnieniu do informacji o konkretnej implementacji wykonanej w VB6 interfejsu określonego w projekcie .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");
Teraz mogę tworzyć zupełnie nowe. Projekt sieci. Jeśli dodać odwołanie do biblioteki DLL VB6, pojawia się następujący błąd:
Nie można rozpoznać odwołanie COM "ef005573-bfc7-436d-a382-f906ca09f94a" wersja 3.0. Importer bibliotek typów napotkał błąd podczas weryfikacji typu. Spróbuj importować bez członków klasy.
Jednakże, jeśli uruchomić Visual Studio wiersz polecenia i uruchom następujące:
tlbimp TestVB6Interface.tlb /out:TestVB6Interface.MyInterop.dll
Potem można dodać, że dll jako odniesienie w moim roztwór .Net i działa perfekcyjnie.
Moje pytanie. Co robi tlbimp w wierszu poleceń, który nie jest wykonywany, gdy dodaję bezpośrednio referencję? Gdy wiadomość w programie Visual Studio mówi "spróbuj importować bez członków klasy", jak dokładnie to zrobić w Visual Studio? Wiem, jak to zrobić w tlbimp.
Przepraszam za ścianę tekstu, ale chciałem opisać sytuację najlepiej jak mogłem zachować informacje, które uważałem za istotne.
Czy kiedykolwiek to rozgryzłeś? – JMK
Zrobiliśmy (trochę). Klasa VB6, która implementuje interfejs .Net, musi być ustawiona na "Attribute VB_Exposed = False". Oznacza to, że nie znajduje się ona w TLB lub jest odsłonięta poza biblioteką DLL VB6, ale wciąż można przekazać metody wyeksponowane przez COM, oczekując interfejsu .Net (i to wszystko, czego tak naprawdę potrzebowaliśmy). Naprawiło to symptom (błąd zniknął!), Ale na pewno nie naprawiłem problemu z rootem, którego dotyczyło moje pytanie, ponieważ to rozwiązanie może nie działać dla wszystkich. –
Wystarczająco uczciwe, prosząc z czystej ciekawości, dziękuję za odpowiedź! – JMK