Zawsze odwołuję się do bibliotek DLL w moim kodzie C #, ale pozostały one nieco tajemnicą, którą chciałbym wyjaśnić. To rodzaj zrzutu mózgów pytań dotyczących bibliotek DLL.
Rozumiem, że biblioteka DLL jest biblioteką połączoną dynamicznie, co oznacza, że inny program może uzyskać dostęp do tej biblioteki w czasie wykonywania, aby uzyskać „funkcjonalność”. Należy jednak wziąć pod uwagę następujący projekt ASP.NET z Web.dll
i Business.dll
( Web.dll
jest to funkcja frontonu i odwołuje się Business.dll
do typów i metod).
W którym momencie następuje
Web.dll
łącze dynamiczneBusiness.dll
? Zauważasz dużo w Windowsie, gdy dysk twardy w systemie Windows pęka z powodu pozornie małych zadań podczas korzystania z programu Word (itp.) I myślę, że program Word działa i dynamicznie łączy funkcje z innych bibliotek DLL?1a. Ponadto, co ładuje i łączy bibliotekę DLL - system operacyjny lub pewne środowisko wykonawcze, takie jak platforma .NET?
1b. Jak wygląda proces „łączenia”? Czy przeprowadzane są kontrole zgodności? Ładowanie do tej samej pamięci? Co właściwie oznacza linkowanie?
Co właściwie wykonuje kod w bibliotece DLL? Czy jest wykonywany przez procesor, czy też jest inny etap tłumaczenia lub kompilacji, zanim procesor zrozumie kod wewnątrz biblioteki DLL?
2a. W przypadku biblioteki DLL wbudowanej w C # .NET, co to uruchamia: platforma .NET czy bezpośrednio system operacyjny?
Czy biblioteka DLL z Linuksa działa w systemie Windows (jeśli coś takiego istnieje), czy też są one specyficzne dla systemu operacyjnego?
Czy biblioteki DLL są specyficzne dla określonej struktury? Czy biblioteka DLL zbudowana w języku C # .NET może być używana przez bibliotekę DLL utworzoną na przykład w języku Borland C ++?
4a. Jeśli odpowiedź na 4 brzmi „nie”, to jaki jest cel biblioteki DLL? Dlaczego różne frameworki nie używają własnych formatów dla plików połączonych? Na przykład: plik .exe wbudowany w .NET wie, że typ pliku .abc jest czymś, co może połączyć z jego kodem.
Wracając do
Web.dll
/Business.dll
przykład - aby uzyskać typ klasy klienta trzeba odwołaćBusiness.dll
odWeb.dll
. Musi to oznaczać, żeBusiness.dll
zawiera jakąś specyfikację tego, czym właściwie jest klasa klienta. Gdybym skompilował swójBusiness.dll
plik, powiedzmy, w Delphi: czy C # zrozumie go i będzie w stanie utworzyć klasę klienta, czy jest tam jakieś informacje w nagłówku lub coś, co mówi „hej, przepraszam, możesz używać mnie tylko z innej biblioteki Delphi DLL” ?5a. To samo dotyczy metod; czy mogę napisać
CreateInvoice()
metodę w bibliotece DLL, skompilować ją w C ++, a następnie uzyskać do niej dostęp i uruchomić ją z poziomu C #? Co mnie powstrzymuje lub pozwala?Jeśli chodzi o przechwytywanie bibliotek DLL, z pewnością zastępcza (zła) biblioteka DLL musi zawierać dokładne sygnatury i typy metod, jak ta, która jest przejmowana. Przypuszczam, że nie byłoby to trudne, gdybyś mógł dowiedzieć się, jakie metody były dostępne w oryginalnej bibliotece DLL.
6a. Co w moim programie C # decyduje, czy mogę uzyskać dostęp do innej biblioteki DLL? Jeśli moja przejęta biblioteka DLL zawierała dokładnie te same metody i typy, co oryginał, ale została skompilowana w innym języku, czy zadziała?
Co to jest importowanie i rejestracja bibliotek DLL?