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
Filed under: .Net | Tagged: c#, dll, export, function export |
Dodaj komentarz