2012-01-18 9 views
39

IssueDlaczego instalacja vcredist_x86.exe nie naprawia błędu SideBySide podczas tworzenia EXE na jednym komputerze i uruchamiania go na innym?

Napisałem projekt C++ o nazwie 'foo' przy użyciu Microsoft Visual Studio 2005 Verison 8.0.50727.762 (SP.050727-7600) w systemie Windows XP Professional z dodatkiem Service Pack 3. Wersja 2002 zbudowałem projekt na Foo .exe. Potem skopiowany plik foo.exe do 2003 Enterprise Edition z dodatkiem Service Pack Windows Server 2. Kiedy próbowałem go uruchomić, to nie udał się ten błąd,

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

W Podglądzie zdarzeń> System trzy wydarzenia były rejestrowane .

Identyfikator zdarzenia: 32; Źródło: SideBySide

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

Identyfikator zdarzenia: 59; Źródło: SideBySide

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

Identyfikator zdarzenia: 59; Źródło: SideBySide

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

Instalacja programu Microsoft Visual C++ 2005 Redistributable nie rozwiąże to

  1. Pobrano vcredist_x86.exe z http://www.microsoft.com/download/en/details.aspx?id=3387
  2. zainstalowany. Instalator utworzył folder o nazwie C:\windows\winsxs\x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.42_x-ww_0de06acd.

Wersja tego oprogramowania z "Dodaj lub usuń programy" to "8.0.50727.42".

Próbując uruchomić C: \ foo \ foo.exe, otrzymałem te same błędy, które opisałem powyżej.

Instalacja Microsoft Visual C++ 2005 SP1 Redistributable nie rozwiąże to

  1. Pobrano vcredist_x86.exe od http://www.microsoft.com/download/en/details.aspx?id=5638
  2. zainstalowany. Instalator utworzył folder o nazwie: C:\windows\winsxs\x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.762_x-ww_6b128700.

Wersja tego oprogramowania z "Dodaj lub usuń programy" to "8.0.56336".

Próbując uruchomić C: \ foo \ foo.exe, otrzymałem te same błędy, które opisałem powyżej.

Kopiowanie plików DLL CRT i plików manifestu z tego samego komputera (w którym działa plik EXE) nie rozwiązało problemu.

  1. skopiowane msvcm80.dll, msvcp80.dll i msvcr80.dll z C:\WINDOWS\WinSxS\x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.42_x-ww_0de06acd do C:\foo.
  2. Następnie skopiowałem C:\WINDOWS\WinSxS\Manifests\x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.42_x-ww_0de06acd.manifest na C:\foo i zmieniłem nazwę na Microsoft.VC80.CRT.manifest.

Czwarta linia pliku manifestu wyglądał następująco:

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

Kiedy próbowałem z systemem C: \ foo \ foo.exe tym czasie, to nie działa. Powtórzyłem tę rzecz ponownie z bibliotekami DLL w C:\windows\winsxs\x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.762_x-ww_6b128700 i odpowiednim pliku manifestu. To też nie pomogło. Mam ten sam błąd.

W obu przypadkach wystąpiły następujące błędy w Podglądzie zdarzeń> System.

Identyfikator zdarzenia: 34; Źródło: SideBySide

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

Identyfikator zdarzenia: 58; Źródło: SideBySide

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

Identyfikator zdarzenia: 59; Źródło: SideBySide

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

Kopiowanie CRT DLL i manifestu z maszyny Windows XP (gdzie zbudował EXE) nie naprawić.

  1. skopiowane msvcm80.dll, msvcp80.dll i msvcr80.dll z C:\winnt\winsxs\x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.762_x-ww_6b128700 na komputerze z Windows XP (gdzie opracowany i zbudowany foo.exe) do C:\foo systemu Windows Server 2003 (gdy próbuję uruchomić foo.exe).
  2. Następnie skopiowałem C:\winnt\winsxs\Manifests\x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.762_x-ww_6b128700.manifest na C:\foo i zmieniłem nazwę na Microsoft.VC80.CRT.manifest.

Czwarta linia pliku manifestu wyglądał następująco:

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

On próbuje uruchomić C: \ foo \ foo.exe teraz mam te same błędy, o których mowa w poprzednim punkcie.

Skopiowanie bibliotek DLL CRT i manifest z folderu Visual Studio naprawiło to.

  1. Skopiowane msvcm80.dll, msvcp80.dll, msvcr80.dll i Microsoft.VC80.CRT.manifest z C:\Program Files\Microsoft Visual Studio 8\VC\redist\x86\Microsoft.VC80.CRT na komputerze z Windows XP (gdzie opracowany i zbudowany foo.exe) do C:\foo maszyny Windows Server 2003 (gdy próbuję go uruchomić).

Czwarta linia pliku manifestu wyglądał następująco:

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

Tym razem mogłem uruchomić C: \ foo \ foo.exe bez żadnych problemów.

Pytanie

Spodziewałem się, że instalacja 'Microsoft Visual C++ 2005 SP1 Redistributable' (vcredist_x86.exe), jak opisano w drugim podejściem byłoby to naprawić. Ale tak się nie stało.Skopiowanie plików DLL i plików manifestu z folderu C:\Program Files\Microsoft Visual Studio 8\VC\redist\x86\Microsoft.VC80.CRT w maszynie programistycznej rozwiązało problem. Dlaczego tak było?

opcje Zbuduj

W przypadku, pomaga odpowiedzieć na moje pytanie. Oto opcje kompilatora i linkera Podniosłem z Visual właściwości projektu Studio:

właściwości konfiguracyjne> C/C++> Wiersz poleceń:

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

właściwości konfiguracyjne> Linker> Wiersz poleceń:

/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

+4

Możesz rozpoznać numery wersji.Twój komputer ma wersję 6195, ale wersje redystów, których używałeś, są bardzo stare: 42 i 762. Od czasu wydania SP1 było kilka poprawek zabezpieczeń. Najprościej jest po prostu stworzyć projekt instalacji. –

+1

[This] (http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=26347) jest prawdopodobnie tym, czego szukasz. – Luke

+0

Najprostszym sposobem na sprawdzenie wersji redystu wymaganej dla mojej kompilacji było sprawdzenie pliku manifestu utworzonego przez Visual Studio podczas budowania projektu. Mój znajdował się w 'Mine znajdował się na C: \ Foo \ Release \ Foo.exe.intermediate.manifest'. Rozwinąłem to w mojej odpowiedzi na moje własne pytanie poniżej. –

Odpowiedz

48

Odpowiem na moje własne pytanie. Komentarze udzielone przez Hansa Passanta i Luke'a pomogły.

Pobrałem Microsoft Visual C++ 2005 Service Pack 1 Redistributable Package MFC Security Update i zainstalowałem go w systemie, w którym próbowałem uruchomić C:\foo\foo.exe. Plik EXE działał dobrze po tym.

Instalator umieścił biblioteki DLL CRT pod numerem C:\windows\winsxs\x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.6195_x-ww_44262b86. Tak, tak, 8.0.50727.6195 była wersją DLL CRT, którego szukałem, jak słusznie powiedział Hans Passant.

Najprostszym sposobem na sprawdzenie tej wersji było sprawdzenie pliku manifestu wygenerowanego przez program Visual Studio podczas budowania mojego projektu w systemie programistycznym. Mój znajdował się pod adresem C:\Foo\Release\Foo.exe.intermediate.manifest. Miał tag tak:

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

Tak, jest to wskazówka, że ​​muszę 8.0.50727.6195 wersji DLL. Reszta to kwestia znalezienia odpowiedniego pliku vcredist_x86.exe, który znalazł się w adresie URL, o którym wspomniałem w drugim akapicie. Strona pod tym adresem URL zawiera link do KB2538242, który pokazuje numery wersji bibliotek DLL instalowanych przez instalatora.

Uwaga: ponieważ Elie wspomniał o tym w a different answer, ponieważ jest to aplikacja 32-bitowa, konieczne jest zainstalowanie vcredist_x86.exe (nie vcredist_x64.exe) w systemie, w którym ta aplikacja ma być uruchamiana niezależnie od tego, czy ten system jest 32-bitowym systemem Windows, czy 64-bitowym systemem Windows. Po raz kolejny plik manifestu zawiera tę wskazówkę w atrybucie processorArchitecture.

+3

To jest piekło! Dzięki za pomoc, śledzenie tych wersji nie jest łatwe ... – mgol

+0

Dziękuję bardzo za to! Trzy lata później, i rozwiązałeś mój dokładny problem! –

+0

można również uzyskać wersję dll z narzędzia xstrace.exe, jak wyjaśniono [tutaj] (https://blogs.msdn.microsoft.com/cesardelatorre/2011/03/27/the-application-has-failed-to -start-bo-jej-side-by-side-configuration-is-incorrect-error-related-to-mmc-exe-programs-and-weird-cause-simple-solution /) – rrosa

3

miałem nieco związany z tym problem. Dwie maszyny XP z zainstalowanym VS2005, nazywają je A i B. Rozwinąłem, zbudowałem i uruchomiłem A. Potem skopiowałem cały projekt do B. Zbudowałem tam. Próbowałem uruchomić i otrzymałem te same komunikaty o błędach, o których wspomniał SusamPal. Zdarzyło mi się, że na WinSxS B były manifesty x86_Microsoft.VC80.CRT_xxx (i foldery), ale nie odpowiadające im x86_Microsoft.VC80.DebugCRT_xxx (i dlaczego ?!). Wypróbowałem kilka tańców i zaklęć opisanych przez SusamPal bezskutecznie. Rozwiązałem problem, kopiując odpowiednie foldery z WinSxS od A do B ORAZ odpowiednie manifesty z WinSxs \ Manifests.

+0

Nie, jak już powiedziałem, miałem "Dwa rozwojowe maszyny XP z zainstalowanym VS2005". Dokładnie taki sam VS2005 na Każdy. – user1752563

3

Chociaż mój wniosek był

opracowany Win 2k8 R2 x64 z VS2008 (który ma msvcm90.dll, msvcp90.dll i Msvcr90.dll w katalogu C: \ Program Files (x86) \ Microsoft Visual Studio 9.0 \ VC \ redist \ amd64 Microsoft.VC90.CRT \)

i prowadził na Win 2k3 SP2 x64

ale potrzebne są msvcm80.dll, msvcp80.dll i msvcr80.dll.

Po zainstalowaniu Microsoft Visual C++ 2005 SP1 Redistributable Package (x86), aplikacja może zostać zainstalowana i uruchomiona prawidłowo.

4

Oto jak rozwiązać ten problem:

You BĘDZIE wciąż błędy SideBySide Jeśli aplikacja używana jest 32-bitowy i spróbować uruchomić go na 64-bitowym systemie operacyjnym, który ma zainstalowany VC_REDISTx64.

Proste rozwiązanie, MUSISZ również załadować VC_REDISTx86 na 64-bitowym systemie operacyjnym

+0

To bardzo dobry punkt. Dziękuję za udostępnienie tego. Teraz w mojej odpowiedzi na to pytanie dodałem notatkę o architekturze procesora. –

0

Dla mnie obok błędu bocznej trafiła przez chabging Under zachodzącego C/C++ -> CodeGeneration-> RuntimeLibrary, sprawiają, że MTD to jest Debugowanie wielowątkowe

-2

Mamy następujący problem: plik wykonywalny referencji DLL za pomocą oczywistych maszyn. W głębi przeszłości autorzy aplikacji skopiowali wymagane biblioteki dll do katalogów systemowych. Niestety to spowodowało tak zwany problem z "piekłem dll", gdy nadpisywanie starszej wersji dll przez niezgodne z nowszą wersją mogło spowodować, że aplikacje przestały działać. MS następnie wpadł na pomysł wersjonowania (winsxs).

Niestety jest to dość skomplikowana maszyneria i zdecydowanie nie jest dobrym pomysłem, aby ręcznie zainstalować biblioteki dll (złożeń) w folderze sxs. Instalowanie tak zwanych "pakietów redystrybucyjnych" również nie jest idealnym rozwiązaniem.

Dodatkowo nie może to pomóc, gdy chcemy wersji do debugowania. Ponieważ MS zakazuje dystrybucji wersji debugujących pomocniczych bibliotek dll, "pakiety redystrybucyjne" nie instalują ich. (Należy zauważyć, że identyfikator złożenia zależy od aktualnej subversion VS2005 i jest powiązany z zainstalowanymi bibliotekami pomocniczymi).

Zwykle instalator VS dodaje wymagane zestawy do systemu, ale po pewnym czasie instaluje aktualizacje lub nowsze pakiety SDK i narzędzia może uszkodzić ten prawidłowy stan.

Załóżmy, że mamy taką sytuację - nasze biblioteki debugowania nie są już zintegrowane z systemem. Załóżmy, że nadaliśmy obszar roboczy z projektem A i aktywną konfiguracją debugowania, podając niepracującą aplikację. Następnie możemy utworzyć projekt instalatora, na przykład C w bieżącym obszarze roboczym, dodać do niego naszą aplikację (lub ściśle, projekt z aktywną konfiguracją). Skonfiguruj projekt instalatora, aby umieścić nasz plik wykonywalny w jakimś miejscu (komputer jest właściwym miejscem w tej sytuacji) umożliwia sprawdzenie zależności i kilka innych mniejszych właściwości. Następnie utwórz projekt C i uruchom instalator (lub "zainstaluj" z VS za pomocą menu kontekstowego). Teraz twoja aplikacja i inne stworzone z bibliotekami DLL debug zaczynają działać.

Uwaga: po uruchomieniu instalatora z opcją "usuń" pojawiła się poprzednia sytuacja. Oto dobry artykuł związany z tematem dystrybucji: http://blogs.msdn.com/b/vcblog/archive/2007/10/12/how-to-redistribute-the-visual-c-libraries-with-your-application.aspx.

Jeśli masz jakieś inne aplikacje i chcesz je wdrożyć, po prostu kopiując, może na maszynie nie deweloperskiej bez zainstalowanego VS, możesz utworzyć fałszywy projekt wraz z odpowiednią konfiguracją i instalatorem. Następnie zainstaluj go raz na każdym komputerze, a następnie skopiuj pliki wykonywalne, nad którymi pracujesz.

+1

Czy możesz dodać przerwy linii? Jest prawie niemożliwe, aby to przeczytać. – Cleb

Powiązane problemy