web-dev-qa-db-fra.com

Pourquoi installer vcredist_x86.exe ne corrige pas l'erreur SideBySide lorsque je développe un fichier EXE sur un ordinateur et l'exécute sur un autre?

Problème

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

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

Dans l'Observateur d'événements> Système, trois événements ont été enregistrés.

L'ID d'é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.

L'ID d'é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.

L'ID d'é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échargez vcredist_x86.exe depuis http://www.Microsoft.com/download/en/details.aspx?id=3387
  2. Installé il. 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 eu les mêmes erreurs que décrites ci-dessus.

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

  1. Vcredist_x86.exe téléchargé depuis http://www.Microsoft.com/download/en/details.aspx?id=5638
  2. Installé il. 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, telle que trouvée dans «Ajout/Suppression de programmes», était «8.0.56336».

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

La copie des DLL CRT et du manifeste à partir du même ordinateur (sur lequel j'exécute le fichier EXE) n'a pas résolu le problème.

  1. J'ai copié msvcm80.dll, msvcp80.dll et msvcr80.dll deC:\WINDOWS\WinSxS\x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.42_x-ww_0de06acd__C:\foo.
  2. Ensuite, j'ai copié le ___C:\WINDOWS\WinSxS\Manifests\x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.42_x-ww_0de06acd.manifest.__ au C:\foo et l'ai 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>

Lorsque j'ai essayé d'exécuter C:\foo\foo.exe cette fois, cela n'a pas fonctionné. J'ai répété cette chose encore avec les DLL dans 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é aussi. J'ai eu la même erreur.

Dans les deux cas, j'ai eu les erreurs suivantes dans Observateur d'événements> Système.

L'ID d'événement: 34; Source: SideBySide

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

L'ID d'événement: 58; Source: SideBySide

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

L'ID d'é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 DLL CRT et du manifeste à partir de la machine Windows XP (où j'ai créé le fichier EXE) ne l'a pas corrigé.

  1. J'ai copié msvcm80.dll, msvcp80.dll et msvcr80.dll à partir de C:\winnt\winsxs\x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.762_x-ww_6b128700 de l'ordinateur 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é le ___C:\winnt\winsxs\Manifests\x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.762_x-ww_6b128700.manifest.__ au C:\foo et l'ai 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 DLL CRT et du manifeste à partir du dossier Visual Studio a corrigé le problème.

  1. Copiez msvcm80.dll, msvcp80.dll, msvcr80.dll et Microsoft.VC80.CRT.manifest à partir 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) vers C:\foo de la machine Windows Server 2003 (où je tente 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, j'ai pu exécuter 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) décrite dans la deuxième approche permette de résoudre ce problème. Mais ça n'a pas été le cas. La copie des fichiers DLL et manifestes à partir du dossier C:\Program Files\Microsoft Visual Studio 8\VC\redist\x86\Microsoft.VC80.CRT de la machine de développement l'a corrigé. Pourquoi était-ce ainsi?

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 choisies 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> Éditeur de liens> 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

39
Susam Pal

Je vais répondre à ma propre question. Les commentaires de Hans Passant et de Luke sur la question ont été utiles.

J'ai téléchargé Mise à jour de sécurité MFC pour le package redistribuable Microsoft Visual C++ 2005 Service Pack 1 et je l'ai installé sur le système sur lequel j'essayais d'exécuter C:\foo\foo.exe. Le fichier EXE fonctionnait bien après cela.

Le programme d'installation a placé les DLL 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 de la DLL CRT que je cherchais, à juste titre, comme disait Hans Passant.

Le moyen le plus simple de comprendre cette version consiste à consulter 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 un tag comme ça:

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

Donc, ceci est un indice que j'avais besoin de la version 8.0.50727.6195 des DLL. Le reste était une question de recherche du bon vcredist_x86.exe qui se trouvait dans l’URL que j’ai mentionnée dans le deuxième paragraphe. La page de cette URL contient un lien vers KB2538242 qui indique les numéros de version des DLL à installer par le programme d'installation.

Remarque: Comme Elie a mentionné dans une réponse différente à cette question, comme 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 sur lequel cette application est supposée. être exécuté, 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 l'attribut processorArchitecture.

48
Susam Pal

Voici comment résoudre ce problème:

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

Solution simple, vous devez également charger le VC_REDISTx86 sur le système d'exploitation 64 bits

4
Elie

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

3
Weisheng Liu

J'ai eu un problème un peu lié. Deux machines de développement XP avec VS2005 installé, appelez-les A et B. J'ai développé, construit et exécuté sur A. Ensuite, j'ai copié le projet entier sur B. Construit à cet emplacement. J'ai essayé de courir et j'ai reçu 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 x86_Microsoft.VC80.CRT_xxx (et les dossiers) mais pas les x86_Microsoft.VC80.DebugCRT_xxx correspondants (et pourquoi?!). J'ai essayé plusieurs des danses et incantations décrites par SusamPal en vain. 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. 

3
user1752563

Bien que ma demande ait été 

développé sur Windows 2k8 R2 x64 avec vs2008 (qui contient msvcm90.dll, msvcp90.dll et msvcr90.dll dans C:\Programmes (x86)\Microsoft Visual Studio 9.0\VC\Redist\AMD64\Microsoft.VC90 .CRT) 

et ran à la victoire 2k3 SP2 x64, 

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

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

3
superlee

Pour moi, l'erreur côte à côte est simplement due à la modification du sous paramètre C/c ++ -> Génération de code-> Bibliothèque d'exécution, faites-en un MTD multi-thread Debug.

0
shivi