¿Cuándo se debe vincular de forma implícita o explícita a una DLL y cuáles son las prácticas o las dificultades más comunes?Vinculación implícita con explícita a una DLL
Respuesta
Es bastante raro vincular explícitamente una DLL. Principalmente porque es doloroso y propenso a errores. Debe escribir una declaración de puntero a función para la función exportada y obtener el código LoadLibrary + GetProcAddress + FreeLibrary correcto. Solo lo haría si necesita una dependencia de tiempo de ejecución en una DLL de estilo de complemento o si desea seleccionar entre un conjunto de archivos DLL basados en la configuración. O para tratar con versiones, una función API que solo está disponible en versiones posteriores de Windows, por ejemplo. La vinculación explícita es la predeterminada para las DLL COM y .NET.
Más información general en este MSDN Library article.
Supongo que se refiere a la vinculación usando un .lib
frente a cargar un archivo DLL dinámicamente usando LoadLibrary()
.
Cargando una DLL estáticamente conectando con su .lib
es generalmente más seguro. La etapa de enlace comprueba que todos los puntos de entrada existen en tiempo de compilación y no hay posibilidad de que cargue una DLL que no tenga la función que está esperando. También es más fácil no tener que usar GetProcAddress()
.
Por lo general, debe utilizar la carga dinámica solo cuando sea absolutamente necesario.
Estoy de acuerdo con otros que ya le respondieron (Hans Passant y shoosh). Quiero añadir sólo dos cosas:
1) Un escenario común cuando se tiene que utilizar LoadLibrary
y GetProcAddress
es la siguiente: usted quiere usar alguna nueva API existente en las nuevas versiones de Windows solamente, pero la API no son críticas en su solicitud. Entonces prueba con LoadLibrary
y GetProcAddress
si la función que necesita existe, y la usa en el caso. Lo que hace su programa si las funciones no existen depende totalmente de su implementación.
2) Hay una opción importante que no incluyó en su pregunta: delayed loading of DLLs. En este caso, el sistema operativo cargará la DLL cuando se llame a una de sus funciones y no al inicio de la aplicación. Permite utilizar bibliotecas de importación (archivos .lib
) en algunos escenarios en los que se debe utilizar el enlace explícito a primera vista. Además, mejora el tiempo de inicio de las aplicaciones y Windows lo usa ampliamente. Entonces el camino también es recomendado.
La carga del retraso la implementa el vinculador de Visual Studio, no el sistema operativo. Inserta las llamadas apropiadas 'LoadLibrary' y 'GetProcAddress' por usted. El sistema operativo no sabe quién realizó estas llamadas. Es por eso que funciona de nuevo a Windows 95, aunque la función se introdujo en 98. – MSalters
@MSalters: Estás equivocado. La carga de retardo utilizada Ejecutable de programa (PE) tiene una sección 'IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT' adicional. – Oleg
- 1. Vinculación explícita vs implícita de SQL
- 2. La vinculación interna implícita no es lo mismo que la vinculación interna explícita ("estática")?
- 3. ASP.NET: ¿localización explícita frente a implícita?
- 4. Implementación implícita y explícita de la interfaz
- 5. scala conversión implícita o explícita de iterador a iterable
- 6. Llamada explícita vs implícita de toString
- 7. implícita vs implementación de interfaz explícita
- 8. Carga lenta implícita frente a la carga vaga explícita
- 9. Vinculación a la DLL de MSVC desde MinGW
- 10. ¿.NET FtpWebRequest admite tanto implícita (FTPS) como explícita (FTPES)?
- 11. Problemas con espera explícita e implícita en Selenium Webdriver (Selenium 2) con Python
- 12. Vinculación de dll en Visual Studio
- 13. Comprobando si un tipo admite una conversión de tipo implícita o explícita a otro tipo con .NET
- 14. ¿Por qué una clase C# puede heredar de una interfaz de manera implícita y explícita?
- 15. La diferencia entre la creación delegado implícita y explícita (con y sin genéricos)
- 16. Importación explícita de instancias
- 17. Referencia a una DLL desde otra DLL
- 18. Vinculación a una página con un método HTTP específico (ELIMINAR)
- 19. UnsatisfiedLInkError Vinculación a FFMPEG con NDK
- 20. Conversión implícita a Runnable?
- 21. Vinculación con múltiples versiones de una biblioteca
- 22. ¿Se heredan los métodos de conversión de implícita/explícita en C#?
- 23. ¿Cómo exporto las clases con plantilla desde un dll sin especificación explícita?
- 24. ¿Puede una DLL llamar a una DLL .NET?
- 25. Vinculación a bibliotecas estáticas
- 26. ¿Tiene sentido la implementación de la interfaz tanto implícita como explícita?
- 27. Vinculación con ubuntu libtcmalloc
- 28. Brew vinculación con ImageMagick
- 29. JPA 2 No se ha determinado ninguna selección explícita ni implícita fría
- 30. ¿Debo implementar miembros de la interfaz de forma explícita o implícita?
¿qué quieres decir con explícito vs implícito? ¿Quiere decir usar LoadLibrary o enlaces estáticos? – tenfour
@tenfour implícito es cuando usa un .h y necesita vincularlo contra .lib y explícito cuando usa LoadLibrary y GetProcAddress respectivamente. La vinculación estática es otro chicle. – Shinnok
A veces utilizas explícitamente cuando no tienes un archivo .lib a mano. –