Visual Basic 6 to język, który “królował” w roku 1998. Dzisiaj z kolei “rządzi” .NET. Ale… życie pokazuje, że język i technologia używane ponad 10 lat temu, żyją dalej, mają się dobrze i co gorsza nic nie wskazuje na to, że coś się zmieni. Wiadomo, trudno jest teraz rzucić stary system i przepisać go w tydzień na .NET.
Na szczęście nie jest aż tak źle. Bowiem jak zapewne wszyscy wiedzą jest możliwość używania bibliotek COM’owskich w .NET’cie i vice versa. Natomiast czasami nie jest to takie hop siup, o czym się przekonałem całkiem niedawno pracująć nad moim ostatnim projektem, w którym musiałem otworzyć furtkę dostępu z aplikacji VB6.
Poziom odbiorcy poniższego opisu miał być z założenia bardzo niski.
Wstęp
Celem tego dokumentu jest opisanie drogi jaką należy pokonać, aby móc w VB6 wywoływać funkcje bibliotek napisanych w .NET. Oczywiście w .NET jest pełna dowolność w jakim języku jest napisana biblioteka. Może to być VB.NET jak i C#.
W ramach tego opisu zostanie utworzona prosta biblioteka .NET, która zostanie użyta w VB6. Biblioteka wykonuje proste operacje matematyczne.
Założenia
Na kompletnie dwóch różnych maszynach są zainstalowane różne środowiska developerskie. Jedna maszyna jest przeznaczona dla VB6, druga dla .NET.
Przygotowanie biblioteki .NET do współpracy z VB6 (COM)
1. Uruchom Visual Studio 2008 i utwórz nowy projekt
Wersja Framework : 2.0 Szablon: Class Library Nazwę projektu podaj: MathLibrary Naciśnij OK.
![]()
2. Zanim rozpoczniesz kodowanie, warto ustawić kilka właściwości projektu, które są niezbędne do prawidłowego funkcjonowania Twojej biblioteki w docelowym VB6. Otwórz okno Properties projektu.
W zakładace Application naciśnij przycisk Assembly Information.
W oknie Assembly Information należy włączyć opcję Make assembly COM-Visible. Dzięki temu pola, właściwości, metody będą domyślnie widoczne w VB6.
Następnie w zakładce Build należy włączyć opcję Register for COM interop.
Oczywiście w możesz również ustawiać i zmieniać inne opcje projektu. Ale te dwie są ważne do osiągnięcia zamierzonego celu. Gdy wszystkie ustawienia projektu są już wprowadzone, możesz zamknąć okno właściwości.
3. Domyślnie Visual Studio 2008 tworzy jeden plik Class1.cs. Można go usunąć i utworzyć własny plik z klasą, lub zmienić nazwę istniejącego. Ja zdecydowałem się zmienić nazwę istniejącego pliku Class1.cs na Math.cs. Można to zrobić w oknie Solution Explorer.
4. Możesz przystąpić do napisania ciała klasy
namespace MathLibrary
{
public class Math
{
private int _value = 0;
public int Value
{
get { return _value; }
set { _value = value }
}
public void Add(int n)
{
_value += n;
}
public void Substract(int n)
{
_value -= n;
}
}
}
5. Normalnie to by był już koniec, ale ponieważ mówimy tu o współpracy w COM to trzeba dodać namespace i kilka atrybutów.
-
Na górze pliku dodać przestrzeń System.Runtime.InteropServices.
-
Nad klasą należy dodać następujące atrybuty:
using System;
using System.Runtime.InteropServices;namespace MathLibrary
{
[GuidAttribute("30A8BD56-F61F-4346-B027-33D9BD1AA99F")]
[ClassInterfaceAttribute(ClassInterfaceType.AutoDual)]
[ProgIdAttribute("MathLibrary.Math")]
public class Math
{
…
-
Wartość GUID można wygenerować w Visual Studio 2008 wywołując narzędzie z menu: Tools / Create GUID
-
Następnie wybierz czwartą opcję i naciśnij New GUID i Copy. Teraz gdy wrócisz do kodu z klasą Math możesz wkleić wygenerowany klucz GUID do atrybutu GuidAttribute.
6. Jeżeli chcesz ukryć pewne metody lub właściwości przed aplikacjami COM, możesz wykorzystać atrybut ComVisible. Dodając go nad właściwością lub metodą i ustawiając jego wartość na true lub false zarządzasz widocznością.
[ComVisible(false)]
public void Substract(int n)
{
_value -= n;
}
7. Wykonaj build projektu (kompilacja)
Przeniesienie biblioteki na maszynę VB6
Mając przygotowaną bibliotekę .NET należy przejść do miejsca gdzie powstał plik dll. W tym przypadku chodzi o plik MathLibrary.dll w katalogu projektu MathLibrary / bin / Debug.
Skopiuj ten plik na komputer z VB6.
Rejestracja biblioteki
Aby dokończyć proces wystarczy teraz zarejestrować bibliotekę, aby Visual Basic 6 ją widział w referencjach.
Uruchom wiersz poleceń (Start / Uruchom / cmd.exe) Przejdź do katalogu C:\Windows\Microsoft.NET\Framework\v2.0.50727 Uruchom polecenie regasm z parametrami /tlb oraz /codebase oraz ścieżką do pliku dll. tlb – tworzy bibliotekę typów i rejestruje ją codebase – ustawia ścieżkę bazową kodu w rejestrze Przykład pełnego polecenia: Regasm /tlb /codebase "e:\poniat\MathLibrary.dll"
Test w VB6
Biblioteka jest już zarejestrowana. Pozostało już tylko przetestować całość. Utwórz nowy projekt w Visual Studio 6, dodaj referencje do stworzonej w .NET biblioteki i napisy kawałek kodu, wywołujący metody w biblioteki .NET.
1. Uruchom Visual Studio 6
2. Utwórz nowy projekt
3. Dodaj referencję
4. Znajdź na liście bibliotekę utworzoną w .NET (zwróć uwagę, że Location wskazuje na plik MathLibrary.tlb – ten plik powstał podczas rejestracji)
![]()
5. Na formie nanieś przycisk i w jego zdarzeniu Click wpisz poniższy kod.
-
Zwróć uwagę, że inteli-sense wyświetla właściwości o metody klasy Math.
-
Zwróć uwagę, że inteli-sense nie wyświetla metody Substract (odejmowanie). Dzieje się tak, dzięki temu, że w projekcie .NET użyty został atrybut ComVisible(false), czyli metoda Sustract została oznaczona, że nie ma być widoczna w COM.
-
Jeżeli zrobiłeś wszystko zgodnie z powyższym opisem na ekranie powinien zostać wyświetlony wynik dodawania.
Podsumowanie
Z początku wydawało się, że nie ma żadnego problemu z kompatybilnością wsteczną .NET w COM. Wiedziałem, że wiąże się to z kilkoma zabiegami jakie trzeba wykonać, ale niestety wszelkie opisy i poradniki się nie sprawdzały. Na szczęście wspólnymi siłami doszliśmy do finalnego rozwiązani, które teraz zostało przelane na “papier”.
Ktoś może zapytać co to w ogóle o tym pisać. Niestety są jeszcze frmy, w których duże systemy zostały napisane w VB6. Systemy te chodzią do dzisiaj i są dalej rozwijane.