3 votes

Folie côte à côte - exécution de binaires sur le même ordinateur

Voici ma configuration :

  • Ordinateur A - Windows 7, MS Visual Studio 2005 patché pour la compatibilité avec Win7 (8.0.50727.867)
  • Ordinateur B - Windows XP SP2, MS Visual Studio 2005 installé (8.0.50727.42)

Mon projet a quelques dépendances externes (DLLs pré-construites - construites sur A ou téléchargées sur Internet), quelques DLLs construites à partir des sources et un exécutable. Je développe principalement sur A et tout va bien là-bas. À un moment donné, j'essaie de construire mon projet sur l'ordinateur B, en copiant les DLLs pré-construites dans le dossier de sortie. Tout se construit bien, mais en essayant de lancer mon application, j'obtiens

L'application n'a pas réussi à s'initialiser correctement (0xc0150002)....

Le journal des événements contient deux de ces messages :

L'assembly dépendant Microsoft.VC80.CRT n'a pas pu être trouvé et la dernière erreur était L'assembly référencé n'est pas installé sur votre système.

plus un peu plus amusant

Générer le contexte d'activation a échoué pour some.dll. Message d'erreur de référence : L'opération s'est terminée correctement.

À ce stade, j'essaye de faire appel à mon Google-Fu, mais en vain - pratiquement tous les résultats concernent l'exécution de binaires sur des machines sans Visual Studio installé. Dans mon cas, cependant, les exécutables échouent à s'exécuter sur l'ordinateur sur lequel ils sont construits.

La prochaine étape a été d'essayer Dependency Walker et cela m'a encore plus déconcerté - mes DLLs construites à partir des sources sur la même machine ne peuvent pas trouver MSVCR80.DLL et MSVCP80.DLL, cependant l'exécutable semble être correct en ce qui concerne ces deux DLLs c'est-à-dire que lorsque j'ouvre l'exécutable avec Dependency Walker, il montre que les MSVC?80.DLL peuvent être trouvées, mais lorsque j'ouvre l'une de mes DLLs, il dit qu'elles ne peuvent pas. C'est là que je suis complètement à court d'idées sur quoi faire, donc je vous demande, chers utilisateurs de stackoverflow :)

J'avoue que je suis un peu confus sur tout ce côté "side-by-side", donc une lecture générale sur le sujet sera également appréciée.

3voto

Alexey Ivanov Points 6564

Votre question a la réponse à votre problème: l'ordinateur A a VC runtime de la version 8.0.50727.867, et l'ordinateur B a seulement la version 8.0.50727.42.

Vous avez construit vos bibliothèques sur l'ordinateur A, et elles dépendent de la version 867 de VC runtime. (Cela peut être trouvé dans le manifeste incorporé dans les bibliothèques.) Lorsque vous les copiez sur l'ordinateur B, ces bibliothèques nécessitent encore la version 867 de la runtime mais vous avez seulement la version 42.

Pour résoudre les dépendances d'assemblage VC runtime, vous devez installer les redistribuables de VC runtime de la version 867 sur l'ordinateur B. Cependant, je vous conseille de mettre à jour Visual Studio sur l'ordinateur B afin d'avoir la même version sur les deux ordinateurs. Et encore mieux, installez Visual Studio 2005 SP1 sur les deux ordinateurs, puis installez cette mise à jour de sécurité vers SP1. Après avoir installé cette dernière, vos bibliothèques dépendront de la version 8.0.50727.4053.

1voto

Andy T Points 8016

Il est possible que le problème soit lié à des versions différentes de CRT Runtime installées sur les deux machines. Est-il possible de construire tous vos modules pour utiliser le CRT Runtime lié statiquement afin de vérifier cela?

0voto

Andy T Points 8016

Tout d'abord, je vérifierais que les DLL pré-construites en préparant un projet factice pour les charger

0voto

edA-qa mort-ora-y Points 8413

Récemment, j'ai rencontré le même type d'erreur lors de la construction de projets sur une machine puis en les déplaçant vers une autre machine. Le plus grand coupable ici est probablement une configuration de débogage pour l'un des composants binaires. C'est-à-dire, MSVC a l'exigence assez rigide que tous les DLL/EXE soient construits avec la même bibliothèque d'exécution, en mode debug ou release, sinon ils ne fonctionneront pas ensemble.

Quand cela m'est arrivé, ils semblent également se compiler correctement, mais quand vous essayez de les exécuter, vous obtenez ce message d'erreur extrêmement cryptique.

Vous devez vous assurer que chaque module que vous construisez ensemble utilise la même configuration, donc debug ou release tout au long de la chaîne de construction. Cette erreur risque également de survenir avec des incohérences dans d'autres bibliothèques, alors assurez-vous que votre MSVC est exactement la même version sur les machines où vous construisez.

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