30 votes

Pourquoi l'installation de vcredist_x86.exe ne résout pas l'erreur SideBySide lorsque je développe un EXE sur une machine et que je l'exécute sur une autre ?

Numéro

J'ai écrit un projet C++ appelé 'Foo' en utilisant Microsoft Visual Studio 2005 Verison 8.0.50727.762 (SP.050727-7600) sur Windows XP Professional Version 2002 Service Pack 3. J'ai construit le projet dans Foo.exe. Puis, j'ai copié le fichier Foo.exe sur un Windows Server 2003 Enterprise Edition Service Pack 2. Lorsque j'ai essayé de l'exécuter, il a échoué avec cette erreur,

C:\foo.exe
The application has failed to start because the application configuration is incorrect.
Reinstalling the application may fix the problem.

Dans Event Viewer > System, trois événements ont été enregistrés.

ID de l'événement : 32 ; Source : SideBySide

Dependent Assembly Microsoft.VC80.CRT could not be found and Last Error was
The referenced assembly is not installed on your system.

ID de l'événement : 59 ; Source : SideBySide

Resolve Partial Assembly failed for Microsoft.VC80.CRT.
Reference error message: The referenced assembly is not installed on your system.

ID de l'événement : 59 ; Source : SideBySide

Generate Activation Context failed for C:\foo\Foo.exe.
Reference error message: The referenced assembly is not installed on your system.

L'installation de Microsoft Visual C++ 2005 Redistributable n'a pas résolu le problème.

  1. Téléchargé vcredist_x86.exe à partir de http://www.microsoft.com/download/en/details.aspx?id=3387
  2. Installé. Le programme d'installation a créé un dossier appelé C:\windows\winsxs\x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.42_x-ww_0de06acd .

La version de ce logiciel trouvée dans 'Ajout/Suppression de programmes' était '8.0.50727.42'.

En essayant d'exécuter C:\foo\foo.exe J'ai obtenu les mêmes erreurs que celles décrites ci-dessus.

L'installation de Microsoft Visual C++ 2005 SP1 Redistributable n'a pas résolu le problème.

  1. Téléchargé vcredist_x86.exe à partir de http://www.microsoft.com/download/en/details.aspx?id=5638
  2. Je l'ai installé. Le programme d'installation a créé un dossier appelé : C:\windows\winsxs\x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.762_x-ww_6b128700 .

La version de ce logiciel trouvée dans 'Ajout/Suppression de programmes' était '8.0.56336'.

En essayant d'exécuter C:\foo\foo.exe J'ai obtenu les mêmes erreurs que celles décrites ci-dessus.

La copie des DLL et du manifeste CRT depuis la même machine (où j'exécute l'EXE) n'a pas réglé le problème.

  1. J'ai copié msvcm80.dll , msvcp80.dll y msvcr80.dll de C:\WINDOWS\WinSxS\x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.42_x-ww_0de06acd à C:\foo .
  2. Ensuite, j'ai copié C:\WINDOWS\WinSxS\Manifests\x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.42_x-ww_0de06acd.manifest à C:\foo et l'a renommé en Microsoft.VC80.CRT.manifest .

La quatrième ligne du fichier manifeste ressemblait à ceci :

<assemblyIdentity type="win32" name="Microsoft.VC80.CRT" version="8.0.50727.42"
                  processorArchitecture="x86"
                  publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>

Quand j'ai essayé de lancer C:\foo\foo.exe cette fois, ça n'a pas marché. J'ai répété cette chose encore une fois avec les DLLs en C:\windows\winsxs\x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.762_x-ww_6b128700 et le fichier manifeste correspondant. Cela n'a pas aidé non plus. J'ai obtenu la même erreur.

Dans les deux cas, j'ai obtenu les erreurs suivantes dans Event Viewer > System.

ID de l'événement : 34 ; Source : SideBySide

Component identity found in manifest does not match the identity of the component requested

ID de l'événement : 58 ; Source : SideBySide

Syntax error in manifest or policy file "C:\foo\Microsoft.VC80.CRT.MANIFEST" on line 4.

ID de l'événement : 59 ; Source : SideBySide

Generate Activation Context failed for C:\foo\Foo.exe. Reference error message: The manifest file contains one or more syntax errors.

La copie des DLLs et du manifeste CRT depuis la machine Windows XP (où j'ai construit l'EXE) n'a pas résolu le problème.

  1. J'ai copié msvcm80.dll , msvcp80.dll y msvcr80.dll de C:\winnt\winsxs\x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.762_x-ww_6b128700 de la machine Windows XP (où j'ai développé et construit foo.exe) à C:\foo de Windows Server 2003 (où j'essaie d'exécuter foo.exe).
  2. Ensuite, j'ai copié C:\winnt\winsxs\Manifests\x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.762_x-ww_6b128700.manifest à C:\foo et l'a renommé en Microsoft.VC80.CRT.manifest .

La quatrième ligne du fichier manifeste ressemblait à ceci :

<assemblyIdentity type="win32" name="Microsoft.VC80.CRT" version="8.0.50727.762"
                  processorArchitecture="x86"
                  publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>

En essayant d'exécuter C:\foo\foo.exe J'ai maintenant les mêmes erreurs que celles mentionnées dans la section précédente.

La copie des DLLs CRT et du manifeste depuis le dossier Visual Studio l'a réparé.

  1. Copié msvcm80.dll , msvcp80.dll , msvcr80.dll y Microsoft.VC80.CRT.manifest de C:\Program Files\Microsoft Visual Studio 8\VC\redist\x86\Microsoft.VC80.CRT de la machine Windows XP (où j'ai développé et construit foo.exe) pour C:\foo de la machine Windows Server 2003 (où j'essaie de l'exécuter).

La quatrième ligne du fichier manifeste ressemblait à ceci :

<assemblyIdentity type="win32" name="Microsoft.VC80.CRT" version="8.0.50727.6195"
                  processorArchitecture="x86"
                  publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>

Cette fois, je pourrais courir C:\foo\foo.exe sans aucun problème.

Question

Je m'attendais à ce que l'installation de "Microsoft Visual C++ 2005 SP1 Redistributable" (vcredist_x86.exe), comme décrit dans la deuxième approche, règle le problème. Mais ce n'est pas le cas. En copiant les DLLs et les fichiers manifestes de l'application C:\Program Files\Microsoft Visual Studio 8\VC\redist\x86\Microsoft.VC80.CRT de la machine de développement a réglé le problème. Pourquoi était-ce le cas ?

Options de construction

Au cas où cela vous aiderait à répondre à ma question. Voici les options du compilateur et de l'éditeur de liens que j'ai récupérées dans les propriétés du projet Visual Studio :

Propriétés de configuration > C/C++ > Ligne de commande :

/O2 /GL /D "_MBCS" /FD /EHsc /MD /Fo"Release\\" /Fd"Release\vc80.pdb" /W3 /nologo /c /Wp64 /Zi /TP /errorReport:prompt

Propriétés de configuration > Linker > Ligne de commande :

/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

37voto

Susam Pal Points 6171

Je vais répondre à ma propre question. Les commentaires à la question par Hans Passant et Luke ont aidé.

J'ai téléchargé Mise à jour de sécurité de Microsoft Visual C++ 2005 Service Pack 1 Redistributable Package MFC et l'a installé sur le système où j'essayais de faire fonctionner C:\foo\foo.exe . L'EXE a bien fonctionné après cela.

Le programme d'installation a placé les DLLs CRT dans C:\windows\winsxs\x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.6195_x-ww_44262b86 . Donc, oui, 8.0.50727.6195 était la version des DLLs CRT que je cherchais comme Hans Passant l'a dit à juste titre.

La façon la plus simple de déterminer cette version était de regarder le fichier manifeste généré par Visual Studio lors de la construction de mon projet sur le système de développement. Le mien était situé à C:\Foo\Release\Foo.exe.intermediate.manifest . Il y avait une étiquette comme celle-ci :

<assemblyIdentity type='win32' name='Microsoft.VC80.CRT' version='8.0.50727.6195'
                  processorArchitecture='x86'
                  publicKeyToken='1fc8b3b9a1e18e3b' />

C'est donc un indice que j'avais besoin de la version 8.0.50727.6195 des DLLs. Le reste n'était qu'une question de recherche du bon vcredist_x86.exe qui se trouvait dans l'URL que j'ai mentionné dans le deuxième paragraphe. La page de cette URL contient un lien vers KB2538242 qui montre les numéros de version des DLLs qui seraient installées par le programme d'installation.

Note : Comme Elie l'a mentionné dans une réponse différente Pour répondre à cette question, étant donné qu'il s'agit d'une application 32 bits, il est nécessaire d'installer vcredist_x86.exe (et non vcredist_x64.exe) sur le système où cette application est censée être exécutée, que ce système soit un système Windows 32 bits ou un système Windows 64 bits. Une fois encore, le fichier .manifest fournit cet indice dans le champ processorArchitecture attribut.

4voto

Elie Points 46

Voici comment résoudre ce problème :

Vous WILL Si l'application utilisée est en 32 bits et que vous essayez de l'exécuter sur un système d'exploitation en 64 bits sur lequel est installé VC_REDISTx64, vous obtiendrez toujours les erreurs sidebyside.

Solution simple, vous DEVEZ AUSSI CHARGER LE VC_REDISTx86 sur le système 64 bits.

3voto

Weisheng Liu Points 21

Vous devez installer "Microsoft Visual C++ 2005 Service Pack 1 Redistributable Package". Mise à jour de sécurité MFC " qui est ici : http://www.microsoft.com/en-us/download/details.aspx?id=26347

3voto

user1752563 Points 31

J'ai eu un problème un peu similaire. Deux machines XP de développement avec VS2005 installé, appelons-les A et B. J'ai développé, construit et exécuté sur A. Puis j'ai copié l'ensemble du projet sur B. J'ai construit là. J'ai essayé de l'exécuter et j'ai obtenu les mêmes messages d'erreur que ceux mentionnés par SusamPal. J'ai réalisé que sur le WinSxS de B il y avait les manifestes (et dossiers) x86_Microsoft.VC80.CRT_xxx mais pas les manifestes x86_Microsoft.VC80.DebugCRT_xxx correspondants (et pourquoi ? !). J'ai essayé plusieurs des danses et incantations décrites par SusamPal, sans succès. J'ai résolu le problème en copiant les dossiers appropriés du WinSxS de A vers B ET les manifestes appropriés du WinSxs \Manifests.

3voto

superlee Points 96

Bien que ma demande ait été

développé sur Win 2k8 R2 x64 avec vs2008 (qui a msvcm90.dll, msvcp90.dll et msvcr90.dll en C:\Program Fichiers (x86) \Microsoft Visual Studio 9.0 \VC\redist\amd64\Microsoft.VC90.CRT )

y a couru sur win 2k3 SP2 x64,

mais les fichiers msvcm80.dll, msvcp80.dll et msvcr80.dll sont nécessaires.

Après l'installation Paquet Redistribuable Microsoft Visual C++ 2005 SP1 (x86) l'application peut être installée et exécutée correctement.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X