c++ - microsoft - ¿Por qué instalar vcredist_x86.exe no soluciona el error SideBySide cuando desarrollo un EXE en una máquina y lo ejecuto en otro?
microsoft visual c++ 2017 error 0x80240017 (7)
Problema
Escribí un proyecto de C ++ llamado ''Foo'' usando Microsoft Visual Studio 2005 Verison 8.0.50727.762 (SP.050727-7600) en Windows XP Professional Version 2002 Service Pack 3. Creé el proyecto en Foo.exe. Luego, copié el archivo Foo.exe en un Service Pack 2 de Windows Server 2003 Enterprise Edition. Cuando intenté ejecutarlo, falló con este error,
C:/foo.exe
The application has failed to start because the application configuration is incorrect.
Reinstalling the application may fix the problem.
En el Visor de eventos> Sistema, se registraron tres eventos.
Identificador de evento: 32; Fuente: SideBySide
Dependent Assembly Microsoft.VC80.CRT could not be found and Last Error was
The referenced assembly is not installed on your system.
Identificador de evento: 59; Fuente: SideBySide
Resolve Partial Assembly failed for Microsoft.VC80.CRT.
Reference error message: The referenced assembly is not installed on your system.
Identificador de evento: 59; Fuente: SideBySide
Generate Activation Context failed for C:/foo/Foo.exe.
Reference error message: The referenced assembly is not installed on your system.
Instalar Microsoft Visual C ++ 2005 Redistributable no lo solucionó
- Vcredist_x86.exe descargado desde http://www.microsoft.com/download/en/details.aspx?id=3387
- Instalado. El instalador creó una carpeta llamada
C:/windows/winsxs/x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.42_x-ww_0de06acd
.
La versión de este software que se encuentra en ''Agregar o quitar programas'' era ''8.0.50727.42''.
Al intentar ejecutar C: / foo / foo.exe, obtuve los mismos errores que describí anteriormente.
Instalar Microsoft Visual C ++ 2005 SP1 redistribuible no lo solucionó
- Vcredist_x86.exe descargado desde http://www.microsoft.com/download/en/details.aspx?id=5638
- Instalado. El instalador creó una carpeta llamada:
C:/windows/winsxs/x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.762_x-ww_6b128700
.
La versión de este software que se encuentra en ''Agregar o quitar programas'' era ''8.0.56336''.
Al intentar ejecutar C: / foo / foo.exe, obtuve los mismos errores que describí anteriormente.
Copiar DLL CRT y manifiesto desde la misma máquina (donde estoy ejecutando el EXE) no lo solucionó.
- Copié
msvcm80.dll
,msvcp80.dll
ymsvcr80.dll
deC:/WINDOWS/WinSxS/x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.42_x-ww_0de06acd
aC:/foo
. - Luego, copié
C:/WINDOWS/WinSxS/Manifests/x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.42_x-ww_0de06acd.manifest
aC:/foo
y loC:/WINDOWS/WinSxS/Manifests/x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.42_x-ww_0de06acd.manifest
aMicrosoft.VC80.CRT.manifest
.
La cuarta línea del archivo de manifiesto se veía así:
<assemblyIdentity type="win32" name="Microsoft.VC80.CRT" version="8.0.50727.42"
processorArchitecture="x86"
publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
Cuando intenté ejecutar C: / foo / foo.exe esta vez, no funcionó. Repetí esto otra vez con los archivos DLL en C:/windows/winsxs/x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.762_x-ww_6b128700
y el archivo de manifiesto correspondiente. Tampoco ayudó. Tengo el mismo error.
En ambos casos, obtuve los siguientes errores en el Visor de eventos> Sistema.
Identificador de evento: 34; Fuente: SideBySide
Component identity found in manifest does not match the identity of the component requested
Identificador de evento: 58; Fuente: SideBySide
Syntax error in manifest or policy file "C:/foo/Microsoft.VC80.CRT.MANIFEST" on line 4.
Identificador de evento: 59; Fuente: SideBySide
Generate Activation Context failed for C:/foo/Foo.exe. Reference error message: The manifest file contains one or more syntax errors.
Copiar DLL CRT y manifiesto desde la máquina con Windows XP (donde construí el EXE) no lo solucionó.
- Copié
msvcm80.dll
,msvcp80.dll
ymsvcr80.dll
deC:/winnt/winsxs/x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.762_x-ww_6b128700
de la máquina con Windows XP (donde desarrollé y creé foo.exe) aC:/foo
de Windows Server 2003 (donde intento ejecutar foo.exe). - A continuación, copié
C:/winnt/winsxs/Manifests/x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.762_x-ww_6b128700.manifest
aC:/foo
y loC:/winnt/winsxs/Manifests/x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.762_x-ww_6b128700.manifest
aMicrosoft.VC80.CRT.manifest
.
La cuarta línea del archivo de manifiesto se veía así:
<assemblyIdentity type="win32" name="Microsoft.VC80.CRT" version="8.0.50727.762"
processorArchitecture="x86"
publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
Al intentar ejecutar C: / foo / foo.exe ahora recibí los mismos errores mencionados en la sección anterior.
Copiar DLL CRT y manifiesto desde la carpeta de Visual Studio lo solucionó.
- Se
msvcm80.dll
,msvcp80.dll
,msvcr80.dll
yMicrosoft.VC80.CRT.manifest
desdeC:/Program Files/Microsoft Visual Studio 8/VC/redist/x86/Microsoft.VC80.CRT
de la máquina con Windows XP (donde desarrollado y construido foo.exe) aC:/foo
del equipo de Windows Server 2003 (donde estoy tratando de ejecutarlo).
La cuarta línea del archivo de manifiesto se veía así:
<assemblyIdentity type="win32" name="Microsoft.VC80.CRT" version="8.0.50727.6195"
processorArchitecture="x86"
publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
Esta vez podría ejecutar C: / foo / foo.exe sin ningún problema.
Pregunta
Esperaba que instalar "Microsoft Visual C ++ 2005 SP1 Redistributable" (vcredist_x86.exe) como se describe en el segundo enfoque lo solucionaría. Pero no fue así. Copiando las DLL y los archivos de manifiesto de la carpeta C:/Program Files/Microsoft Visual Studio 8/VC/redist/x86/Microsoft.VC80.CRT
de la máquina de desarrollo se arregló. ¿Por qué fue así?
Opciones de compilación
En caso, te ayuda a responder mi pregunta. Aquí están las opciones de compilador y enlazador que seleccioné de las propiedades del proyecto de Visual Studio:
Propiedades de configuración> C / C ++> Línea de comando:
/O2 /GL /D "_MBCS" /FD /EHsc /MD /Fo"Release//" /Fd"Release/vc80.pdb" /W3 /nologo /c /Wp64 /Zi /TP /errorReport:prompt
Propiedades de configuración> Enlazador> Línea de comando:
/OUT:"C:/MixedBag/Release/Foo.exe" /NOLOGO /MANIFEST /MANIFESTFILE:"Release/Foo.exe.intermediate.manifest" /DEBUG /PDB:"c:/MixedBag/release/Foo.pdb" /OPT:REF /OPT:ICF /LTCG /MACHINE:X86 /ERRORREPORT:PROMPT kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib
Aquí tenemos realmente el siguiente problema: el ejecutable de la aplicación hace referencia a dlls utilizando maquinaria de manifiesto. En el pasado profundo, los autores de la aplicación simplemente copiaban las DLL requeridas en los directorios del sistema. Desafortunadamente, esto causó el llamado "problema del infierno de dll" al sobrescribir versiones dll más antiguas por uno incompatible más nuevo que podría hacer que las aplicaciones dejaran de funcionar. A MS se le ocurrió una idea de control de versiones (winsxs).
Desafortunadamente esta es una maquinaria bastante compleja y definitivamente no es una buena idea intentar instalar dlls (assemblies) manualmente en la carpeta sxs. La instalación de los denominados "paquetes redistribuibles" tampoco es una solución perfecta.
Además, esto no puede ayudar cuando queremos versiones de depuración. Como MS prohíbe la distribución de versiones de depuración de dlls compatibles, los "paquetes redistribuibles" no los instalarán. (Tenga en cuenta que el id. De ensamblado depende de la subversión actual de VS2005 y está relacionado con las bibliotecas de soporte instaladas).
Por lo general, el instalador de VS agrega los ensamblajes necesarios al sistema, pero después de un tiempo la instalación de las actualizaciones o los nuevos SDK y herramientas pueden dañar este estado correcto.
Supongamos que tenemos esta situación: nuestras bibliotecas de depuración ya no están integradas en el sistema. Supongamos que le hemos dado espacio de trabajo con el proyecto A y una configuración de depuración activa que da una aplicación que no funciona. Luego podemos crear un proyecto de instalación, digamos C en el área de trabajo actual, agregar nuestra aplicación (o estrictamente, proyecto con configuración activa). Instalar el proyecto del instalador para colocar nuestro ejecutable en algún lugar (el escritorio es el lugar correcto con respecto a esta situación) habilitar la verificación de dependencias y algunas otras propiedades menores. Luego crea el proyecto C y ejecuta el instalador (o "instala" desde VS usando el menú contextual). Ahora su aplicación y otras creadas con bibliotecas dll de depuración comienzan a funcionar.
Tenga cuidado cuando ejecute el instalador con la opción "eliminar" que vino a la situación anterior. Aquí hay un buen artículo relacionado con el tema de distribución: http://blogs.msdn.com/b/vcblog/archive/2007/10/12/how-to-redistribute-the-visual-c-libraries-with-your-application.aspx .
Si tiene otras aplicaciones y desea implementarlas simplemente copiando, tal vez en una máquina sin desarrollo sin una VS instalada, puede crear un proyecto ficticio junto con la configuración e instalador adecuados para ello. Luego, instálalo una vez en cada máquina y luego copia los ejecutables en los que estás trabajando.
Así es como arreglas este problema:
TODAVÍA obtendrá los errores laterales Si la aplicación utilizada es de 32 bits e intente ejecutarla en un sistema operativo de 64 bits que tenga instalado VC_REDISTx64.
Solución simple, también DEBE CARGAR VC_REDISTx86 en el sistema operativo de 64 bits
Aunque mi aplicación fue
desarrollado en Win 2k8 R2 x64 con vs2008 (que tiene msvcm90.dll, msvcp90.dll y msvcr90.dll en C: / Archivos de programa (x86) / Microsoft Visual Studio 9.0 / VC / redist / amd64 / Microsoft.VC90.CRT)
y funcionó en ganar 2k3 SP2 x64,
pero se necesitan msvcm80.dll, msvcp80.dll y msvcr80.dll.
Después de instalar el paquete redistribuible de Microsoft Visual C ++ 2005 SP1 (x86) , la aplicación se puede instalar y ejecutar correctamente.
Debe instalar " Actualización de seguridad de MFC del paquete redistribuible de Microsoft Visual C ++ 2005 Service Pack 1", que se encuentra aquí: http://www.microsoft.com/en-us/download/details.aspx?id=26347
Para mí, el error al costado fue simplemente por debajo del ajuste c / c ++ -> CodeGeneration-> RuntimeLibrary, hacer que MTD sea multi-Thread Debug
Responderé mi propia pregunta. Los comentarios a la pregunta de Hans Passant y Luke ayudaron.
Descargué This y lo instalé en el sistema donde intentaba ejecutar C:/foo/foo.exe
. El EXE funcionó bien después de esto.
El instalador colocó las DLL de CRT en C:/windows/winsxs/x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.6195_x-ww_44262b86
. Entonces, sí, 8.0.50727.6195 era la versión de los DLL de CRT que estaba buscando, como dijo acertadamente Hans Passant.
La forma más fácil de calcular esta versión fue mirando el archivo de manifiesto generado por Visual Studio mientras desarrollaba mi proyecto en el sistema de desarrollo. El mío estaba ubicado en C:/Foo/Release/Foo.exe.intermediate.manifest
. Tenía una etiqueta como esta:
<assemblyIdentity type=''win32'' name=''Microsoft.VC80.CRT'' version=''8.0.50727.6195''
processorArchitecture=''x86''
publicKeyToken=''1fc8b3b9a1e18e3b'' />
Entonces, esta es una pista de que necesitaba la versión 8.0.50727.6195 de los DLL. El resto era cuestión de buscar el vcredist_x86.exe correcto que estaba en la URL que mencioné en el segundo párrafo. La página en esa URL contiene un enlace a KB2538242 que muestra los números de versión de las DLL que instalaría el instalador.
Nota: Como Elie ha mencionado en una respuesta diferente a esta pregunta, dado que esta es una aplicación de 32 bits, es necesario instalar vcredist_x86.exe (no vcredist_x64.exe) en el sistema donde se supone que debe ejecutarse esta aplicación independientemente de si ese sistema es un sistema de Windows de 32 bits o un sistema de Windows de 64 bits. Una vez más, el archivo .manifest proporciona esta pista en el atributo de arquitectura del processorArchitecture
.
Tuve un problema relacionado de alguna manera. Dos máquinas XP de desarrollo con VS2005 instaladas, llámalas A y B. Desarrollé, construí y ejecuté en A. Luego copié todo el proyecto a B. Construido allí. Intenté ejecutar y recibí los mismos mensajes de error mencionados por SusamPal. Me di cuenta de que en WinSxS de B había manifiestos x86_Microsoft.VC80.CRT_xxx (y carpetas) pero no los correspondientes x86_Microsoft.VC80.DebugCRT_xxx (¿y por qué ?!). Intenté varios de los bailes y encantamientos descritos por SusamPal en vano. Resolví el problema copiando las carpetas apropiadas de WinSxS de A a B Y los manifiestos apropiados de WinSxs / Manifests.