Siempre hago referencia a las DLL en mi código C #, pero siguen siendo un misterio que me gustaría aclarar. Esta es una especie de volcado de preguntas sobre las DLL.
Entiendo que una DLL es una biblioteca vinculada dinámicamente, lo que significa que otro programa puede acceder a esta biblioteca en tiempo de ejecución para obtener "funcionalidad". Sin embargo, considere el siguiente proyecto ASP.NET con Web.dll
y Business.dll
( Web.dll
es la funcionalidad del front-end y hace referencia Business.dll
a tipos y métodos).
En que punto
Web.dll
se vincula dinámicamenteBusiness.dll
? ¿Observa mucho en el disco duro de Windows que se golpea para tareas aparentemente pequeñas cuando usa Word (etc.) y creo que Word se está apagando y vinculando dinámicamente la funcionalidad de otras DLL?1a. Además, ¿qué carga y vincula la DLL: el sistema operativo o algún marco de tiempo de ejecución como el marco .NET?
1b. ¿Cuál es el proceso de "vinculación"? ¿Se realizan comprobaciones de compatibilidad? ¿Cargando en la misma memoria? ¿Qué significa realmente vincular?
¿Qué ejecuta realmente el código en la DLL? ¿Lo ejecuta el procesador o hay otra etapa de traducción o compilación antes de que el procesador entienda el código dentro de la DLL?
2a. En el caso de una DLL construida en C # .NET, ¿qué ejecuta esto: el marco .NET o el sistema operativo directamente?
¿Funciona una DLL de Linux en un sistema Windows (si existe tal cosa), o son específicos del sistema operativo?
¿Son las DLL específicas de un marco en particular? ¿Puede una DLL construida con C # .NET ser utilizada por una DLL construida con, por ejemplo, Borland C ++?
4a. Si la respuesta a 4 es "no", ¿cuál es el punto de una DLL? ¿Por qué los distintos marcos no utilizan sus propios formatos para los archivos vinculados? Por ejemplo: un .exe integrado en .NET sabe que un tipo de archivo .abc es algo que puede vincular a su código.
Volviendo a la
Web.dll
/Business.dll
ejemplo - para obtener un tipo de clase de cliente que necesita hacer referenciaBusiness.dll
aWeb.dll
. Esto debe significar queBusiness.dll
contiene algún tipo de especificación sobre lo que es realmente una clase de cliente. Si hubiera compilado miBusiness.dll
archivo en, digamos, Delphi: ¿C # lo entendería y sería capaz de crear una clase de cliente, o hay algún tipo de información de encabezado o algo que dice "oye, lo siento, solo puedes usarme desde otra DLL de Delphi" ?5a. Lo mismo se aplica a los métodos; ¿Puedo escribir un
CreateInvoice()
método en una DLL, compilarlo en C ++ y luego acceder y ejecutarlo desde C #? ¿Qué me detiene o me permite hacer esto?Sobre el tema del secuestro de DLL, seguramente la DLL de reemplazo (mala) debe contener las firmas y tipos de método exactos como el que está siendo secuestrado. Supongo que esto no sería difícil de hacer si pudiera averiguar qué métodos estaban disponibles en la DLL original.
6a. ¿Qué en mi programa C # está decidiendo si puedo acceder a otra DLL? Si mi DLL secuestrado contuviera exactamente los mismos métodos y tipos que el original pero fue compilado en otro idioma, ¿funcionaría?
¿Qué es la importación y el registro de DLL?