Pourquoi l’installation de 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» en utilisant Microsoft Visual Studio 2005 Verison 8.0.50727.762 (SP.050727-7600) sur le Service Pack 3 Windows XP Professionnel version 2002. J’ai construit le projet dans Foo.exe. Ensuite, j’ai copié le fichier Foo.exe vers un Service Pack 2 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.

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. 

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. 

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 Redissortingbutable ne l’a pas réparé

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

La version de ce logiciel, trouvée à partir de «Ajouter ou supprimer des programmes» était «8.0.50727.42».

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

L’installation de Microsoft Visual C ++ 2005 SP1 Redissortingbutable ne l’a pas réparé

  1. Vcredist_x86.exe téléchargé depuis http://www.microsoft.com/download/en/details.aspx?id=5638
  2. L’a 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 à partir de «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 j’ai décrites ci-dessus.

Copier les DLL CRT et manifester à partir de la même machine (où j’exécute le fichier EXE) ne l’a pas réparé.

  1. J’ai copié msvcm80.dll , msvcp80.dll et 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 vers C:\foo et l’ C:\WINDOWS\WinSxS\Manifests\x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.42_x-ww_0de06acd.manifest renommé en Microsoft.VC80.CRT.manifest .

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

  

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 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 reçu les erreurs suivantes dans Observateur d’événements> Système.

ID d’événement: 34; Source: SideBySide

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

ID d’événement: 58; Source: SideBySide

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

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. 

Copier les DLL CRT et manifester à partir de la machine Windows XP (où j’ai construit le fichier EXE) ne l’a pas réparé.

  1. J’ai copié msvcm80.dll , msvcp80.dll et 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 compilé foo.exe) en 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 vers C:\foo et l’ C:\winnt\winsxs\Manifests\x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.762_x-ww_6b128700.manifest renommé en Microsoft.VC80.CRT.manifest .

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

  

En essayant d’exécuter C: \ foo \ foo.exe maintenant j’ai eu les mêmes erreurs mentionnées dans la section précédente.

La copie des DLL CRT et du manifeste du dossier Visual Studio a résolu le problème.

  1. Les msvcm80.dll , msvcp80.dll , msvcr80.dll et Microsoft.VC80.CRT.manifest copiés sur l’ msvcm80.dll C:\Program Files\Microsoft Visual Studio 8\VC\redist\x86\Microsoft.VC80.CRT (où développé et construit foo.exe) à C:\foo de Windows Server 2003 (où je tente de l’exécuter).

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

  

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

Question

Je m’attendais à ce que l’installation de “Microsoft Visual C ++ 2005 SP1 Redissortingbutable” (vcredist_x86.exe), comme décrit dans la seconde approche, le répare. Mais ça n’a pas été le cas. La copie des fichiers DLL et manifest à partir du dossier C:\Program Files\Microsoft Visual Studio 8\VC\redist\x86\Microsoft.VC80.CRT de l’ C:\Program Files\Microsoft Visual Studio 8\VC\redist\x86\Microsoft.VC80.CRT de développement l’a corrigé. 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 obtenues des 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

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

J’ai téléchargé la mise à jour de sécurité MFC du package redissortingbuable Microsoft Visual C ++ 2005 Service Pack 1 et je l’ai installée sur le système où j’essayais d’exécuter C:\foo\foo.exe . Le EXE s’est bien passé 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 des DLL CRT que je cherchais, comme le disait à juste titre Hans Passant.

Le moyen le plus simple de déterminer cette version était d’examiner le fichier manifeste généré par Visual Studio lors de la création de mon projet sur le système de développement. Le mien était situé dans C:\Foo\Release\Foo.exe.intermediate.manifest . Il y avait un tag comme celui-ci:

  

Donc, c’est un indice que j’avais besoin de la version 8.0.50727.6195 des DLL. Le rest consistait à rechercher le bon fichier vcredist_x86.exe qui se trouvait dans l’URL que j’ai mentionnée au deuxième paragraphe. La page de cette URL contient un lien vers KB2538242 qui affiche les numéros de version des DLL à installer par le programme d’installation.

Note: Comme Elie l’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 (pas vcredist_x64.exe) sur le système sur lequel 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 l’atsortingbut processorArchitecture .

Voici comment résoudre ce problème:

Vous allez toujours obtenir 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 AUSSI CHARGER LE VC_REDISTx86 sur l’OS 64 bits

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

J’ai eu un problème quelque peu lié. Deux machines de développement XP avec VS2005 installées, appelez-les A et B. Je les ai développées, construites et exécutées sur A. Ensuite, j’ai copié le projet dans son intégralité. J’ai essayé de courir et j’ai reçu les mêmes messages d’erreur mentionnés par SusamPal. J’ai réalisé que sur WinSxS de B, il y avait les manifestes (et les dossiers) x86_Microsoft.VC80.CRT_xxx, mais pas ceux 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 de WinSxS de A à B ET les manifestes appropriés à partir de WinSxs \ Manifests.

Bien que ma demande était

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

et a couru sur Win 2k3 SP2 x64,

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

Après avoir installé le package redissortingbuable Microsoft Visual C ++ 2005 SP1 (x86) , l’application peut être installée et exécutée correctement.

Pour moi, l’erreur côte à côte s’est produite simplement en plaçant le sous le paramètre c / c ++ -> CodeGeneration-> RuntimeLibrary, ce qui fait que le MTD est un débogage multi-thread.

Nous avons vraiment le problème suivant: l’exécutable de l’application fait référence à des DLL utilisant des machines manifestes. Dans le passé, les auteurs d’applications ont simplement copié les DLL nécessaires dans les répertoires système. Malheureusement, cela a causé un problème appelé “dll hell” lorsque le remplacement de versions plus anciennes de dll par des versions plus récentes incompatibles pouvait empêcher les applications de fonctionner. MS a ensuite proposé une idée de version (winsxs).

Malheureusement, c’est une machine assez complexe et ce n’est certainement pas une bonne idée d’essayer d’installer manuellement les DLL (assemblys) dans le dossier SXS. L’installation de “paquets redissortingbuables” n’est pas non plus une solution parfaite.

En outre, cela ne peut pas aider lorsque nous voulons des versions de débogage. Comme MS interdit la dissortingbution des versions de débogage des dll prenant en charge, les “packages redissortingbuables” ne les installeront pas. (Notez que l’identifiant de l’assembly dépend de la subversion actuelle de VS2005 et est lié aux bibliothèques de support installées.)

Généralement, le programme d’installation de VS ajoute les assemblys requirejs au système, mais après un certain temps, l’installation de mises à jour ou de nouveaux SDK et outils peut endommager cet état.

Supposons que nous ayons cette situation – nos bibliothèques de débogage ne sont plus intégrées au système. Supposons que nous ayons donné un espace de travail avec le projet A et une configuration de débogage active ne donnant pas une application qui fonctionne. Nous pouvons ensuite créer un projet d’installation, par exemple C dans l’espace de travail actuel, y append notre application (ou ssortingctement un projet avec une configuration active). Le projet d’installation du programme d’installation pour placer notre exécutable à un endroit donné (le bureau est le bon endroit en ce qui concerne cette situation) active le contrôle des dépendances et d’autres propriétés mineures. Créez ensuite le projet C et exécutez le programme d’installation (ou “install” à partir de VS en utilisant le menu contextuel). Maintenant, votre application et les autres bibliothèques créées avec debug dll commencent à fonctionner.

Méfiez-vous lorsque vous exécutez l’installateur avec l’option “supprimer”, vous êtes arrivé à la situation précédente. Voici un bon article sur le sujet de la dissortingbution: http://blogs.msdn.com/b/vcblog/archive/2007/10/12/how-to-redissortingbute-the-visual-c-libraries-with-your-application .aspx .

Si vous avez d’autres applications et que vous souhaitez les déployer simplement en les copiant, peut-être sur des machines sans développement sans VS installé, vous pouvez créer un projet factice avec la configuration et le programme d’installation appropriés. Vous l’installez ensuite une fois sur chaque machine, puis copiez les exécutables sur lesquels vous travaillez.