Programowanie w języku C# » Artykuły

.NET Wykorzystanie klas z innego programu

Jedną z cech platformy .NET</wiki> 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</wiki>. Ale na takiej zasadzie program mógł jedynie wykorzystać daną bibliotekę.

Innym rozwiązaniem było opracowana jeszcze w latach 80 technologia COM</wiki>, 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</wiki>, 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.