2012-09-23 9 views
8

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.

+0

Czy kiedykolwiek to rozgryzłeś? – JMK

+0

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. –

+0

Wystarczająco uczciwe, prosząc z czystej ciekawości, dziękuję za odpowiedź! – JMK

Odpowiedz

2

Identyfikator Visual Studio IDE na pewno przyjmuje inną ścieżkę podczas rejestrowania bibliotek DLL dla obiektu COM Interop, co ma miejsce w przypadku uruchamiania narzędzi wiersza poleceń z wiersza polecenia.

Wątpię, czy Microsoft udokumentował to gdziekolwiek. Jednak moje wieloletnie doświadczenie dowiodło, że tak właśnie jest. Raz natknąłem się na sytuację, w której polecenie "regsvcs" z .NET 2.0 Framework spowodowałoby nieskończoną pętlę. Jeśli to zrobisz, prawdopodobnie znajdziesz inne, które miały ten problem. Udało mi się zrobić krok dalej, korzystając z IDE VS, aby przeprowadzić rejestrację COM dla składnika .NET Serviced Component. Jednak nieuchronnie zakończył się błędem. Błąd był krokiem naprzód w nieskończonej pętli. Tak czy inaczej okazało się, że IDS VS przyjmuje inną ścieżkę kodową/logikę biznesową, gdy zajmuję się wpisami COM Interop i rejestru.

+0

To robi. Nie będzie importować TLB, jeśli pojawią się jakieś ostrzeżenia. Ostrzeżenia wyświetlane przez Tlbimp.exe na konsoli i często mogą być ignorowane, ponieważ są łagodne. Daj albo bierz. –

Powiązane problemy