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.

Migracja z SQL Server 2005 Express do SQL Server 2008 na Webio.pl

Ostatnio miałem okazję pracować nad 3 projektami w ASP.NET. Niestety do tego czasu miałem strasznie długą przerwę z programowaniem aplikacji web’owych, co opłaciłem stratą czasu na przypominaniu sobie, o co w tym chodziło.

Na szczęście sukces został osiągnięty za każdym razem.

RajDzieci_medium Jednym z projektów, nad którymi pracowałem było zrobienie witryny sklepu internetowego RajDzieci.pl. Wykorzystałem do tego stary projekt, który pisałem podczas nauki ASP.NET 2.0. Zrobiłem wówczas bardzo prostą aplikację tego typu, która opierała się na bazie danych Microsoft SQL 2005 Express. Teraz rozwinąłem ten prototyp i powstał normalny sklep. Na hosting został wybrany serwis Webio.pl.

 

WebioBanner Webio.pl obsługuje bazy MS SQL 2005, MS SQL 2008 i MySQL 5. MySQL jest po za obszarem moich zainteresowań. SQL 2005 nie ma już panelu administratora na Webio (sam serwer jest tylko dla tych, którzy jeszcze nie zmigrowali się do 2008). I na początku wydawało mi się, że wszystko pójdzie gładko przeniesieniem mojej bazy express, ale się trochę naciąłem.

 

1. Tworzymy nową bazę na Webio.pl

  • Zaloguj się na Webio.pl
  • Przejdź do SQL Server 2008
  • Utwórz nową bazę danych (Create Database)
  • Podaj jej nazwę (pełna nazwa bazy jest poprzedzona nazwą konta na Webio) i Save

 post02 post03a post04 post05

2. Tworzenie użytkownika

  • Wróć do panelu i w SQL Server 2008 wybierz Create User
  • Podaj nazwę użytkownika (również będzie miała przedrostek w postaci nazwy konta na Webio)
  • Podaj tajne hasło
  • Wybierz bazę danych i pomyślną bazę danych (bazę przed chwilą utworzoną przez panel Webio)

post06 post07

3. Utworzenie ASP.NET Membership Providera

  • Na lokalnym komputerze przejdź do katalogu z Frameworkiem (standartowo: C:\Windows\Microsoft.NET\Framework\v2.0.50727)
  • Uruchom aspnet_regsql.exe
  • W odpalonym wizardzie wybieramy opcję “Configure SQL Server for application services”
  • Podaj nazwę serwera Webio (dokładny adres i port znajduje się w mailu wysłanym przez Webio podczas rejestracji)
  • Rodzaj autentykacji SQL Server, podaj nazwę użytkownika SQL i hasło (utworzony w kroku 2)
  • Podaj nazwę bazy (utworzona w kroku 1). Tutaj w moim przypadku był pierwszy problem. Otóż lista się nie chciała załadować. Ale okazało się, że można ręcznie wpisać nazwę bazy.
  • Po wypełnieniu formularza daj Next, Next i Finish.
  • aspnet_regsql_00 aspnet_regsql_01 aspnet_regsql_02 aspnet_regsql_03 aspnet_regsql_04 aspnet_regsql_05

    4. Test w SQL Server Management Studio

    • Jeśli masz SQL Server Management Studio to możesz teraz sprawdzić czy to co zrobiłeś do tej pory dało jakiś wynik
    • Zalogu się do bazy Webio (connection string jest dostępny w mailu wysłanym podczas rejestracji)
    • Możeliwe, że po zalogowaniu się nie będziesz widział żadnej bazy danych w oknie Object Browser. To był drugi problem, jaki mnie przystopował. Okazało się, że jest to pospolity problem. Wystarczy, że w oknie Object Explorer wybierzesz Databases, następnie klawisz F7. Pokawi się okno Object Explorer Details. Następnie prawym klawiszen naciśnij na nagłówek kolumny Name i wyłącz opcję Collation.
    • Teraz wróć do Object Explorer’a i zrób Refresh. Powinny pojawić się wszystkie bazy danych, w tym i Twoja.
    • Gdy rozwiniesz obiekty twojej bazy, zobaczysz, że w Tables są tablice aspnet_, które zostały wygenerowane automatycznie przez kreatora aspnet_regsql.exe

    collation_01 collation_02 collation_03 aspnet_regsql_06

    5. Export tablic z bazy Express

    • Uruchom Visual Studio
    • Otwórz swój projekt witryny
    • W oknie Server Explorer kliknij na bazę Express prawym klawiszem (czyli bazę w pliku mdf)
    • Z dostępnego menu kontekstowego wybierz Publish to Provider
    • Uruchomi się kreator exportu
    • Okno Select Database: wybierz twoją bazę Express (plik mdf), wyłącz opcję Script all ocjects
    • Okno Choose Object Types: w zależności jakie obiekty występują w Twojej bazie, różne pozycje będą wyświetlane. Kreator skanuje Twoją bazę, i podpowiada tylko takie typy, które istnieją. W moim przypadku interesowały mnie tabele i procedury
    • Okno Stored Procedures: Wybierz tylko Twoje procedury. Nie wybieraj proceduj Membership Providera, ponieważ w docelowej bazie SQL Server 2008 już utworzyłeś Membership Providera (w kroku 3)
    • Okno Tables: Podobnie jak w przypadku procedur, wybierz tylko Twoje tabele, pozostałe z Membership Providera pomiń. One również są utworzone i czekają w docelowej bazie
    • Okno Select an Output Location: wybierz miejsce gdzie chcesz wykonać export. Ja wybrałem, że ma powstać plik ze skryptem. Opcji Publish to shared hosting provider nie testowałem.
    • Następne okno to już tylko podsumowania oraz wynik całego procesu eksportu.

       publish_to_provider_01 publish_to_provider_02publish_to_provider_03publish_to_provider_04 publish_to_provider_05

    publish_to_provider_06 publish_to_provider_07 publish_to_provider_08 publish_to_provider_09 publish_to_provider_10 publish_to_provider_11 

    6. Import w docelowej bazie SQL Server 2008

    • Mając przygotowany plik ze skryptem, uruchom SQL Server Management Studio
    • Otwórz plik ze skryptem i wykonaj go (Execute/F8)
    • Odśwież obiekty na drzewie Object Explorer, powinieneś zobaczyć Twoje tabele
    • Jeśli w tabelach były jakieś dane, to sprawdz od razu czy również zostały zaimportowane.

    publish_to_provider_12

    Gotowe.

    Co ciekawe, wykonanie Publish to Provider exportuje zarówno schemat jak i dane.

    Cała operacja udała mi się dzięki Pomocy On-Line Webio, za co w tym miejscu ponownie dziękuję.