.NET Wykorzystanie klas z innego programu

Adam Boduch

Jedną z cech platformy .NET jest możliwość współpracy pomiędzy komponentami (podzespołami, ang. assembly), czyli poszczególnymi aplikacjami. Do tej pory jedyną możliwością komunikowania się pomiędzy aplikacjami było wykorzystanie bibliotek DLL. Ale na takiej zasadzie program mógł jedynie wykorzystać daną bibliotekę.

Innym rozwiązaniem było opracowana jeszcze w latach 80 technologia COM, która zakładała tworzenie komponentów wielokrotnego użytku. Taki komponent był plikiem binarnym (np. z rozszerzeniem *.ocx), który mogł zostać wykorzystany w wielu aplikacjach. Tak samo jak w przypadku plików DLL, nie liczył się język, w którym została napisana sama kontrolka. Na owe czasy to była jej podstawowa cecha - niezależność językowa.

Kod generowany przez kompilatory .NET daje postać kodu pośredniego IL, a nie maszynowego. Daje to możliwość wykorzystania w jednej aplikacji całej klasy, która została napisana i zadeklarowana w innym programie!

Na potrzeby tego artykułu posłużę się językiem C#, ale równie dobrze można wykorzystać każdy język wspierany przez .NET. Wybrałem C# dlatego, że jest to język w całości napisany na potrzeby .NET, a dodatkowo w ramach platformy .NET udostępniony jest jego kompilator.

Jeżeli masz zainstalowany pakiet .NET Framework SDK 1.1, to powinieneś w swoim systemie mieć katalog C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322 lub podobny. W owym katalogu znajduje się m.in. plik csc.exe oraz vbc.exe (kompilator Visual Basic.NET). Kompilator C# wywoływany jest z linii komend, tak więc musisz uruchomić konsolę i przejść do katalogu, w którym znajduje się kompilator (dla przypomnienia dodam, że służy do tego polecenie cd [katalog]).

Na dysku C: utwórz dwa pliki - hello.cs oraz main.cs. Pierwszy plik zawierał będzie klasę bazową - HelloClass, natomiast main.cs będzie wywoływał ową klasę.

Zawartość pierwszego pliku (hello.cs):

using System;

public class HelloClass
{
  public static void Hello ( )
  {
    Console.WriteLine("Witaj!");
    Console.WriteLine("Jestem metodą Hello z klasy HelloClass, z pliku hello.exe");
  }

}

class MainApp
{
  public static void Main ( )
  {
    Console.WriteLine("Hello World from C#");
  }
}

Nie zamierzam omawiać tu samych elementów języka C#. Powiem tylko, że pierwsza klasa - HelloClass, będzie klasą, która będzie wykorzystywana w drugim programie. Klasa MainApp to klasa główna - po uruchomieniu programu, wywołana zostanie metoda Main z tej klasy.

Kompilacja programu wygląda tak:

csc c:\hello.cs

Takie polecenie spowoduje kompilację programu, a plik wykonywalny zostanie umieszczony w katalogu C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322 (czyli w tym samym, w którym znajduje się kompilator csc.exe - u Ciebie może to być inny katalog).

Możesz sprawdzić działanie programu uruchamiając go - również z linii poleceń konsoli:

C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322>hello
Hello World from C#

Tak więc program działa dobrze - na ekranie wyświetli się napis Hello World from C#.

Zawartość drugiego pliku powinna wyglądać tak:

using System;

class MainClass
{
  public static void Main ( )
  {
    try
    {
      HelloClass.Hello( );
    }
    catch (Exception e)
    {
      Console.WriteLine(e.ToString( ));
    }
  }
} 

W .NET, w przypadku korzystania jedynie z metod, z pominięciem pól klasy, nie jest konieczne wywoływanie konstruktora. Tak też zrobiłem w tym przypadku. Linia:

 HelloClass.Hello( );

spowoduje wywołanie metody Hello z klasy HelloClass.

Zwróć uwagę, że zastosowałem tutaj także obsługę wyjątków. Tak więc ewentualne błędy zostają przeniesione z programu hello.exe na program main.exe.

Kompilator nie wie jednak, czym jest polecenie HelloClass, musimy go w tym uświadomić kompilując program w ten sposób:

csc /r:hello.exe /out:main.exe c:\main.cs

Spowoduje to kompilację programu, do postacii pliku main.exe. Dzięki frazie /r:hello.exe, niejako umożliwiamy skorzystanie z klas zawartych w programie hello.exe.

O to co się stanie po uruchomieniu programu:

C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322>main
Witaj!
Jestem metodą Hello z klasy HelloClass, z pliku hello.exe

W tym momencie aplikacja main.exe skorzystała z hello.exe, a dokładniej z klasy HelloClass, i powyżej widzisz rezultat działania takiego programu..

W dziale Kody źródłowe umieściłem źródła do programów, które zaprezentowałem tutaj oraz wyjątkowo (ze względu na mały rozmiar aplikacji wykonywalnych) także pliki wynikowe.

0 komentarzy