Eksport funkcji DLL w C#

W VisualStudio możemy tworzyć biblioteki DLL. To jest to oczywiście super sprawa bo nasze programy dzięki temu są modułowe. Tak przygotowane projekty łatwo jest serwisować, rozbudowywać jednym słowem zarządzać. Jednak programy napisane w językach niższego poziomu, nie korzystające z .NET nie będą w stanie wykorzystać tych bibliotek. Tak samo nie uda się zaimportować funkcji z tych bibliotek przy użyciu DllImport. Funkcje nie są eksportowane tak jak w C++ . Nic jednak nie jest straconego, istnieje furtka która umożliwia export funkcji, ale trzeba trochę się natrudzić.

Tworzymy więc bibliotekę

Klikamy New Project  wybieramy Class Library i wybieramy nazwę dla nowej klasy. Wewnątrz tworzymy potrzebne metody – powinny być one statyczne. Całość kompilujemy w standardowy sposób. Zabawa zaczyna się po kompilacji.

Do dzieła

Załóżmy więc że mamy bibliotekę exportClass.dll z następującą klasą:

public class exportClass
{
  public static void action()
  {
    Console.WriteLine("Export");
  }
}

Kiedy mamy już naszą bibliotekę trzeba disasamblować bibliotekę i zmodyfikować informacje o zawartości dll. Później wszystko składamy i mamy gotową bibliotekę z udostępnionymi funkcjami. Wszystko to możliwe dzięki narzędzia z Visual Studio i .Net Freamework ildasm.exe oraz ilasm.exe. Nie sprawdziłem czy znajdują się w wszystkich wersjach ale u mnie w VS 2005 oraz .Net 2 są 🙂

C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin\ildasm.exe
C:\Windows\Microsoft.NET\Framework\v2.0.50727\ilasm.exe

Zaczynamy od wyeksportowania informacji z pliku dll:

ildasm exportClass.dll /linenum /out:exportClass.il

Wewnątrz pliku exportClass.il znajdą się informację na temat biblioteki. Wyszukujemy w nim naszej metody wpis powinien wyglądać miej więcej tak:

.method public hidebysig instance void
        action() cil managed
{
  // Code size       11 (0xb)
  .maxstack  8
  .line 12,12 : 13,41 'C:\\Projects\\Export\\exportClass\\exportClass.cs'
  .vtentry 1:1
  .export [1] as action
  IL_0000:  ldstr      "Export"
  IL_0005:  call       void [mscorlib]System.Console::WriteLine(string)
  .line 13,13 : 9,10 ''
  IL_000a:  ret
} // end of method exportClass::action

W pliku nie znajdziesz dwóch lini, które są w powyższym kodzie wyeksponowane. Są to wpisy które trzeba dodać, aby metoda action była dostępna w sposób, do którego się przyzwyczailiśmy korzystając z C++. Dodatkowo zostały zaznaczone dwie wartości na czerwono. Numerują one eksportowane metody, za to słówko „.export [1] as action” oznacza, że metoda zostanie wyeksportowana pod nazwą „action

Na koniec potrzeba jedynie wszystko z powrotem połączyć

ilasm /dll exportClass.il /out:exportClass.dll /res:exportClass.res

Więcej na ten temat znajdziesz pod adresem:

http://www.blong.com/Conferences/BorConUK2002/Interop1/Win32AndDotNetInterop.htm

Dodaj komentarz