2010-02-03 24 views
7

Tengo una aplicación MFC que intento empaquetar para la implementación. Parece depender de los archivos 'msvcr90.dll', 'msvcp90.dll' y 'mfc90.dll'. ¿Cuál es la forma correcta de distribuir estos archivos?Forma correcta de distribuir archivos de tiempo de ejecución de VC++

No puedo usar módulos de fusión ya que mi instalador no los admite. Sé que puedo ejecutar VCRedist_x86.exe, pero no quiero hacer esto por varias razones.

Por lo que puedo ver, mi única alternativa es instalar los archivos como ensamblajes privados uno al lado del otro. ¿Es esto correcto?

De acuerdo con http://msdn.microsoft.com/en-us/library/ms235317(VS.80).aspx, la forma correcta de instalar un ensamblado privado es copiar las carpetas 'Microsoft.VC90.CRT' y 'Microsoft.VC90.MFC' en la misma carpeta que el ejecutable. ¿Es esta la forma correcta de resolver el problema? Funciona, pero parece un poco la década de 1990 para copiar los archivos del sistema de esta manera. ¿Alguien puede mostrarme un ejemplo de otra aplicación (o al menos un proyecto de demostración) que hace esto?

Finalmente, ¿cuándo tengo que preocuparme de distribuir un archivo .manifest para mi aplicación? ¿Se supone que debo instalar explícitamente el archivo XML, o está incrustado en mi ejecutable de alguna manera?

+0

FWIW Hice una pregunta similar sobre el envío de las DLL CRT. http://stackoverflow.com/questions/2131093/distributing-the-visual-c-runtime-libraries-msvcrt – Rob

+0

Bienvenido a DLL Hell, capítulo 3. * (Los dos primeros capítulos tratan sobre problemas de ubicación de archivos y problemas de versión). –

Respuesta

1

Normalmente, diría que debe instalar la redistribuible requerida en la máquina de destino, ya que es la "manera limpia". Pero también puedes hacerlo al estilo de los 90. Depende fuertemente de la biblioteca CRT/MFC que esté utilizando para compilar la aplicación. Esto puede ser inspeccionado dentro del archivo de manifiesto. También puede forzar a la aplicación a vincularse con una lib especificada. Sin ninguna definición VS2008 normalmente vincula el 9.0.21022.8, con

#define _BIND_TO_CURRENT_VCLIBS_VERSION 1 

se toman las librerías más recientes. También puede enlazar con una versión especificada:

#define _CRT_ASSEMBLY_VERSION "9.0.30729.1" 

y/o

#define _MFC_ASSEMBLY_VERSION "9.0.30729.1" 

Así que si quieres hacerlo al estilo años 90, copie los archivos de C:\Windows\Winsxs\ y tomar las DLL de esa carpeta enlazado con, por ejemplo desde amd64_microsoft.vc90.crt_1fc8b3b9a1e18e3b_9.0.30729.1_none_99b61f5e8371c1d4 si usa CRT para una aplicación x64 o su equivalente x86_microsoft.vc90.crt_1fc8b3b9a1e18e3b_9.0.30729.1_none_99b61f5e8371c1d para la versión x86 de CRT.

+1

uhm, #define no toma un operador de asignación ... – kusma

1

También podría considerar la vinculación estática con ambos MFC y CRT, y luego solo debe enviar los archivos EXE. Sin embargo, hay pros y contras para esto.

+0

Eso es cierto, pero [Microsoft desalienta la vinculación estática] (http://msdn.microsoft.com/en-us/library/ms235316.aspx). – skst

1

Yo diría que es suficiente para poner estos dlls junto con su exe, porque la ruta actual es donde primero se buscan.

Por supuesto, debe esforzarse por instalar la redistribuible ya que es la forma más segura de hacerlo.

+0

El uso de los redistribuibles es la [recomendación actual de Microsoft] (http://msdn.microsoft.com/en-us/library/ms235316.aspx). – skst

+0

Esta es la respuesta correcta. [Microsoft recomienda] (https://msdn.microsoft.com/en-us/library/ms235299.aspx) instalar el redistribuible o instalar los dlls junto al ejecutable.Para citar: "Para implementar archivos redistribuibles de Visual C++, puede usar los paquetes redistribuibles de Visual C++ que se incluyen en Visual Studio o usar módulos de fusión redistribuibles, o puede instalar directamente DLLs redistribuibles de Visual C++ en la carpeta local de la aplicación, que es la carpeta que contiene el archivo de la aplicación ejecutable ". – Marc

Cuestiones relacionadas