Jak ugryźć .NET w VB6

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.

image

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.

image

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.

image

W zakładace Application naciśnij przycisk Assembly Information.

image

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.

image

Następnie w zakładce Build należy włączyć opcję Register for COM interop.

image

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.

  image   image

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

image

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

image

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.

image 

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"

imageimageimage  

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ę

image

4. Znajdź na liście bibliotekę utworzoną w .NET (zwróć uwagę, że Location wskazuje na plik MathLibrary.tlb – ten plik powstał podczas rejestracji)

image

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.

image

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.

Advertisements

2 thoughts on “Jak ugryźć .NET w VB6

  1. Ehhh dokładnie wiem coś nt. dużych systemów pisanych w VB6 – jeżeli ktoś nie umiał pisać wcześniej, a dobre pisanie w VB to sztuka – to utrzymywanie i rozwijanie takich aplikacji to istny koszmar, zwłaszcza w postaci ActiveX.A co do artykułu – to czy wersja frameworka to musi być 2.0, czy może być 1.1 bądź 3.5? I czy da się z tej funkcjonalności skorzystać w kontrolkach ActiveX?

  2. Framework 1.1 – nie stestowałemFramework 2.0 – mam przetestowane i działa.Framework 3.5 – również nie sestowałem. Jak zabierałem się za pisanie bibliotego mojej biblioteki .NET/COM to mi powiedziano, że mam ją robić w 2.0, bo z 3.5 są jakieś problemy. Ale teraz Ci nie powiem, czy chodzi o problemy .NET->COM czy COM->.NET. Bowiem całości dodaje pierzu fakt, iż moja biblioteka .NET, używa bibliotek COM\’owskich, a następnie inne COM\’owskie używają mojej… 😉 Jak sprawdze czy z 3.5 dział to napisze.

Możliwość komentowania jest wyłączona.