Me gustaría implementar una DLL muy simple con mi aplicación C#, pero cualquier DLL que construyo en Visual Studio 2008 parece tener una dependencia en "Microsoft.VC90.CRT". ¿Es posible construir una DLL usando VS2008 sin esta dependencia? ¿Cómo puedo saber qué está causando la dependencia?¿Es posible construir una DLL en C++ que no tenga dependencias?
Respuesta
No estoy seguro acerca de las últimas versiones de VC++, pero anteriormente podía decirle al enlazador que vincule con una versión estática de la biblioteca de tiempo de ejecución de MSVCRT en lugar de la versión dinámica (DLL). Es posible que esta opción aún exista.
Dale a esta herramienta una oportunidad: http://www.dependencywalker.com/. Le permitirá recorrer sus dependencias en un exe o dll determinado.
Parece que crear una DLL vacía en VS2008 también tiene esta dependencia. No agregué ninguna referencia adicional ni nada, solo un proyecto vacío. –
De acuerdo con this MSDN page, las bibliotecas estáticas todavía están disponibles. Ir a propiedades del proyecto, propiedades de configuración, C/C++, generación de código, biblioteca de tiempo de ejecución.
Seleccione Depuración multiproceso para la configuración de depuración y Multiproceso para la configuración de lanzamiento. (No estoy seguro de si los nombres son todos iguales en VS2008, pero deberían estar "en algún lugar". Puede actualizarse mañana con diferencias específicas de VS2008)
Además, como se sugirió wbic16, use la función de dependencia para identificar otras dependencias estáticas.
Si está absolutamente seguro de que no tiene dependencias en el tiempo de ejecución de C, puede evitar vincularlo activando el indicador "Ignorar todas las bibliotecas predeterminadas" (/ NODEFAULTLIB) en el Enlazador -> Proyecto de entrada página de opciones. Es posible que también deba deshabilitar las comprobaciones básicas de tiempo de ejecución (establezca "Comprobaciones básicas de tiempo de ejecución" en Predeterminado en C/C++ -> Generación de código) y también puede tener que eliminar el punto de entrada (configure "Sin punto de entrada" en "Sí (//NOENTRY) "en Linker -> Advanced).
Ver también http://support.microsoft.com/kb/814472, tiene buena información sobre la creación de DLL para extensiones administradas para C++.
Editar: Observe que la ejecución sin tiempo de ejecución de C también significa que no tiene la función de asignación de memoria fácil como malloc() y nueva.
Creo que NODEFAULTLIB solo debe utilizarse en esas circunstancias excepcionales en las que puede garantizar que NO se está utilizando la biblioteca estándar. De lo contrario, es mejor vincular el tiempo de ejecución como estático. –
Con un poco de trabajo, libCTiny todavía funciona como un reemplazo para la lib predeterminada. Este tipo de biblioteca hace/NODEFAULTLIB utilizable.
Para responder a su segunda pregunta, con el interruptor de enlace/VERBOSE el vinculador le dirá qué símbolos se toman de qué biblioteca.
Asegúrate de que cada cosa se publica con tanta frecuencia en depuración, el dll se vincula con dlls de depuración especiales que normalmente no se envían con Windows y provocará problemas de dependencia.
- 1. ¿Es posible que un dominio de Grails no tenga 'id'?
- 2. ¿Es posible construir una DLL .NET con tipos visibles COM sin VS que requiera elevación?
- 3. ¿Es posible que una tabla SQL tenga cero columnas?
- 4. ¿Es posible tener una interfaz que tenga métodos privados/protegidos?
- 5. ¿Es posible construir un shell C interactivo?
- 6. ¿Cómo construir un proyecto de C# sin verificar las dependencias?
- 7. ¿Es posible usar una DLL creada usando C# en una aplicación VC++ no administrada?
- 8. ¿Es posible que Castle Windsor resuelva dependencias de propiedad cuando no tiene una referencia al contenedor?
- 9. ¿Es posible construir una GUI personalizada como esta en Java?
- 10. ¿Es posible llamar a una DLL administrada desde C++ no administrado?
- 11. ¿Cómo puedo usar un dll C# (managed) que no tengo?
- 12. ¿Es posible combinar una DLL en un EXE .NET?
- 13. DLL duplicado en la carpeta "Dependencias detectadas"
- 14. ¿Es posible detectar al construir en el VS IDE?
- 15. Cómo crear una DLL que se usará en C#
- 16. ¿Es posible que un ciclo 'foreach' tenga una verificación de estado?
- 17. ¿Es posible construir exe en Vista e implementar en XP usando py2exe
- 18. ¿Es posible construir una entidad JPA extendiendo un POJO?
- 19. Fusiona varias DLL nativas en una DLL
- 20. ¿Hay un formato de fecha/hora que no tenga espacios?
- 21. Uso DLL externa en cmake construir
- 22. Cargando C++/CLI .dll de modo mixto (y dependencias) dinámicamente desde C++ no administrado
- 23. ¿Es posible construir una extensión de Chrome utilizando Java?
- 24. Inyección Dll - ¿Qué es posible con eso?
- 25. Dependencias de DLL circular en .NET
- 26. ¿Es posible depurar un dll generador de C++ desde Delphi si tengo el código fuente dll?
- 27. ¿Es posible forzar que una función no esté en línea?
- 28. Incrustar dll no administrado en un C# dll administrado
- 29. ¿Es posible compartir una declaración enum entre C# y C++ no administrado?
- 30. ¿Es posible evitar que se guarde un archivo php que tenga un error de análisis?
Esta es una idea interesante. Parece que MS recomienda no hacerlo, pero si resuelve mis problemas ... –
Esto funcionó como un campeón, gracias. –
No estoy de acuerdo. Puede encontrar todo tipo de problemas cuando intenta vincular bibliotecas estáticas dentro de una biblioteca que es dinámica. –