Je fais toujours référence aux DLL dans mon code C #, mais elles sont restées un peu un mystère que je voudrais clarifier. Il s'agit d'une sorte de mémoire de questions concernant les DLL.
Je comprends qu'une DLL est une bibliothèque liée dynamiquement, ce qui signifie qu'un autre programme peut accéder à cette bibliothèque au moment de l'exécution pour obtenir une «fonctionnalité». Cependant, considérez le projet ASP.NET suivant avec Web.dll
et Business.dll
( Web.dll
est la fonctionnalité frontale et fait référence Business.dll
aux types et méthodes).
À quel point le
Web.dll
lien est-il dynamiqueBusiness.dll
? Vous remarquez beaucoup de battements de disque dur Windows pour des tâches apparemment petites lors de l'utilisation de Word (etc.) et je pense que Word se déclenche et lie dynamiquement les fonctionnalités d'autres DLL?1a. En outre, qu'est-ce qui charge et lie la DLL - le système d'exploitation ou un cadre d'exécution tel que le framework .NET?
1b. Quel est le processus de «liaison»? Des contrôles de compatibilité sont-ils effectués? Chargement dans la même mémoire? Que signifie réellement le lien?
Qu'est-ce qui exécute réellement le code dans la DLL? Est-il exécuté par le processeur ou y a-t-il une autre étape de traduction ou de compilation avant que le processeur ne comprenne le code à l'intérieur de la DLL?
2a. Dans le cas d'une DLL intégrée en C # .NET, qu'est-ce qui l'exécute: le framework .NET ou directement le système d'exploitation?
Une DLL de Linux fonctionne-t-elle sur un système Windows (si une telle chose existe) ou est-elle spécifique au système d'exploitation?
Les DLL sont-elles spécifiques à un framework particulier? Une DLL créée à l'aide de C # .NET peut-elle être utilisée par une DLL créée avec, par exemple, Borland C ++?
4a. Si la réponse à 4 est «non», alors quel est l'intérêt d'une DLL? Pourquoi les différents frameworks n'utilisent-ils pas leurs propres formats pour les fichiers liés? Par exemple: un .exe intégré à .NET sait qu'un type de fichier .abc est quelque chose qu'il peut lier dans son code.
Revenons à l' exemple
Web.dll
/Business.dll
- pour obtenir un type de classe de client àBusiness.dll
partir duquel je dois me référerWeb.dll
. Cela doit signifier qu'ilBusiness.dll
contient une sorte de spécification de ce qu'est réellement une classe client. Si j'avais compilé monBusiness.dll
fichier dans, disons, Delphi: C # le comprendrait-il et serait-il capable de créer une classe client, ou y a-t-il une sorte d'informations d'en-tête ou quelque chose qui dit "hé désolé, vous ne pouvez m'utiliser qu'à partir d'une autre DLL Delphi" ?5a. Il en va de même pour les méthodes; puis-je écrire une
CreateInvoice()
méthode dans une DLL, la compiler en C ++, puis y accéder et l'exécuter à partir de C #? Qu'est-ce qui m'arrête ou me permet de faire ça?En ce qui concerne le détournement de DLL, la DLL de remplacement (mauvaise) doit sûrement contenir les signatures et les types de méthode exacts que celui qui est détourné. Je suppose que ce ne serait pas difficile à faire si vous pouviez découvrir les méthodes disponibles dans la DLL d'origine.
6a. Qu'est-ce qui dans mon programme C # décide si je peux accéder à une autre DLL? Si ma DLL détournée contenait exactement les mêmes méthodes et types que l'original mais qu'elle était compilée dans une autre langue, cela fonctionnerait-il?
Qu'est-ce que l'importation de DLL et l'enregistrement de DLL?