Почему установка vcredist_x86.exe не исправляет ошибку SideBySide, когда я разрабатываю EXE на одном компьютере и запускаю его на другом? - PullRequest
40 голосов
/ 18 января 2012

Проблема

Я написал проект C ++ под названием «Foo» с использованием Microsoft Visual Studio 2005 Verison 8.0.50727.762 (SP.050727-7600) в Windows XP Professional Версия 2002 с пакетом обновления 3 (SP3).Я встроил проект в Foo.exe.Затем я скопировал файл Foo.exe в Windows Server 2003 Enterprise Edition с пакетом обновления 2. Когда я попытался запустить его, произошел сбой с этой ошибкой

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

В окне просмотра событий> Система, три событиябыли зарегистрированы.

Код события: 32;Источник: SideBySide

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

Код события: 59;Источник: SideBySide

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

Код события: 59;Источник: SideBySide

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

Установка распространяемого Microsoft Visual C ++ 2005 не устранила

  1. Загруженный файл vcredist_x86.exe из http://www.microsoft.com/download/en/details.aspx?id=3387
  2. Установил его.Программа установки создала папку с именем C:\windows\winsxs\x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.42_x-ww_0de06acd.

Версия этого программного обеспечения, найденная в разделе «Установка и удаление программ», была «8.0.50727.42».

При попытке запуститьC: \ foo \ foo.exe, я получил те же ошибки, которые я описал выше.

Установка распространяемого пакета Microsoft Visual C ++ 2005 с пакетом обновления 1 (SP1) не устранила

  1. Скачал vcredist_x86.exe с http://www.microsoft.com/download/en/details.aspx?id=5638
  2. Установил его.Программа установки создала папку с именем: C:\windows\winsxs\x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.762_x-ww_6b128700.

Версия этого программного обеспечения, найденная в разделе «Установка и удаление программ», была «8.0.56336».

При попытке выполнитьзапустите C: \ foo \ foo.exe, я получил те же ошибки, которые я описал выше.

Копирование CRT DLL и манифеста с той же машины (где я запускаю EXE) не исправилоэто.

  1. Я скопировал msvcm80.dll, msvcp80.dll и msvcr80.dll из C:\WINDOWS\WinSxS\x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.42_x-ww_0de06acd в C:\foo.
  2. Далее я скопировал C:\WINDOWS\WinSxS\Manifests\x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.42_x-ww_0de06acd.manifest вC:\foo и переименовал его в Microsoft.VC80.CRT.manifest.

Четвертая строка файла манифеста выглядела так:

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

Когда я попытался запустить C: \ foo \ foo.exe на этот раз не сработало.Я повторил это снова с DLL в C:\windows\winsxs\x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.762_x-ww_6b128700 и соответствующим файлом манифеста.Это тоже не помогло.Я получил ту же ошибку.

В обоих случаях я получил следующие ошибки в Просмотр событий> Система.

Код события: 34;Источник: SideBySide

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

Код события: 58;Источник: SideBySide

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

Код события: 59;Источник: SideBySide

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

Копирование библиотек CRT DLL и манифеста с компьютера с Windows XP (где я собрал EXE) не удалось исправить.

  1. Я скопировал msvcm80.dll, msvcp80.dll и msvcr80.dll с C:\winnt\winsxs\x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.762_x-ww_6b128700 машины с Windows XP (где я разработал и создал foo.exe) на C:\foo Windows Server 2003 (где я пытаюсь запустить foo.exe).
  2. Затем я скопировал C:\winnt\winsxs\Manifests\x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.762_x-ww_6b128700.manifest в C:\foo и переименовал его в Microsoft.VC80.CRT.manifest.

Четвертая строка файла манифеста выглядела так:

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

При попытке запустить C: \ foo \ foo.exe я получил те же ошибки, которые упоминались в предыдущем разделе.

Исправлено это при копировании библиотек CRT и манифеста из папки Visual Studio.

  1. Скопировано msvcm80.dll, msvcp80.dll, msvcr80.dll и Microsoft.VC80.CRT.manifest с C:\Program Files\Microsoft Visual Studio 8\VC\redist\x86\Microsoft.VC80.CRT машины Windows XP (где я разрабатывал и создавал foo.exe) в C:\fooWindows Server 2003 (где я пытаюсь его запустить).

Четвертая строка файла манифеста выглядела так:

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

На этот раз я могуЯ запустил C: \ foo \ foo.exe без проблем.

Вопрос

Я ожидал, что при установке «Microsoft Visual C ++ 2005 SP1 Redistributable» (vcredist_x86.exe)), как описано во втором подходе, это исправит.Но это не так.Копирование DLL-файлов и файлов манифеста из папки C:\Program Files\Microsoft Visual Studio 8\VC\redist\x86\Microsoft.VC80.CRT на компьютере разработчика исправило это.Почему так?

Опции сборки

На случай, если это поможет вам ответить на мой вопрос.Вот параметры компилятора и компоновщика, которые я выбрал из свойств проекта Visual Studio:

Свойства конфигурации> C / C ++> Командная строка:

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

Свойства конфигурации>Линкер> Командная строка:

/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

Ответы [ 7 ]

49 голосов
/ 19 января 2012

Я отвечу на свой вопрос. Помогли комментарии к вопросу Ханса Пассанта и Люка.

Я скачал Microsoft Visual C ++ 2005 Service Pack 1 Вторично распространяемый пакет Обновление безопасности MFC и установил его в системе, где я пытался запустить C:\foo\foo.exe. После этого EXE-файл работал нормально.

Установщик поместил библиотеки CRT в C:\windows\winsxs\x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.6195_x-ww_44262b86. Так что да, 8.0.50727.6195 была версией библиотеки CRT, которую я искал, как правильно сказал Ханс Пассант.

Самый простой способ определить эту версию - это посмотреть файл манифеста, сгенерированный Visual Studio, при создании моего проекта в системе разработки. Шахта была расположена на C:\Foo\Release\Foo.exe.intermediate.manifest. У него был такой тег:

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

Итак, это подсказка, что мне нужна версия DLL для 8.0.50727.6195. Остальное было связано с поиском правильного vcredist_x86.exe, который оказался в URL, который я упомянул во втором абзаце. Страница в этом URL содержит ссылку на KB2538242 , в которой указаны номера версий библиотек DLL, которые будут установлены программой установки.

Примечание: как Elie упомянул в другой ответ на этот вопрос, поскольку это 32-разрядное приложение, необходимо установить vcredist_x86.exe (не vcredist_x64.exe) в системе, где Предполагается, что это приложение будет запущено независимо от того, является ли эта система 32-битной системой Windows или 64-битной системой Windows. Еще раз, файл .manifest предоставляет эту подсказку в атрибуте processorArchitecture.

4 голосов
/ 21 ноября 2012

Вот как вы можете решить эту проблему:

You WILL STILL Получите ошибки sidebyside Если используемое приложение 32-разрядное и вы пытаетесь запустить его на 64-разрядной ОС, которая имеетустановленный VC_REDISTx64.

Простое решение, вы ДОЛЖНЫ ТАКЖЕ ЗАГРУЗИТЬ VC_REDISTx86 на 64-битной ОС

3 голосов
/ 30 октября 2012

Хотя мое приложение было

разработано на Win 2k8 R2 x64 с vs2008 (в котором есть msvcm90.dll, msvcp90.dll и msvcr90.dll в C: \ Program Files (x86)\ Microsoft Visual Studio 9.0 \ VC \ redist \ amd64 \ Microsoft.VC90.CRT)

и выполнили на выигрыше 2k3 SP2 x64,

, но msvcm80.dll,Необходимы msvcp80.dll и msvcr80.dll.

После установки Распространяемый пакет Microsoft Visual C ++ 2005 с пакетом обновления 1 (x86) , приложение можно установить и правильно запустить.

3 голосов
/ 17 октября 2012

У меня была несколько связанная проблема.Две машины XP с установленным VS2005, назовем их A и B. Я разработал, собрал и запустил на A. Затем я скопировал весь проект в B. Построенный там.Попытался запустить и получил те же сообщения об ошибках, упомянутых SusamPal.Я понял, что на WinSxS B были манифесты (и папки) x86_Microsoft.VC80.CRT_xxx, но не соответствующие x86_Microsoft.VC80.DebugCRT_xxx (и почему ?!).Я попробовал несколько танцев и заклинаний, описанных SusamPal, но безрезультатно.Я решил проблему, скопировав соответствующие папки из WinSxS от A до B И соответствующие манифесты из WinSxs \ Manifests.

3 голосов
/ 17 мая 2012

Вы должны установить «Распространяемый пакет Microsoft Visual C ++ 2005 с пакетом обновления 1 Обновление безопасности MFC », который находится здесь: http://www.microsoft.com/en-us/download/details.aspx?id=26347

0 голосов
/ 28 июня 2015

Здесь у нас действительно следующая проблема: исполняемые файлы приложения ссылаются на dll с использованием механизма манифеста. В глубоком прошлом авторы приложений просто копировали необходимые библиотеки DLL в системные каталоги. К сожалению, это вызвало так называемую проблему "dll hell", когда перезапись старых версий dll несовместимыми более новыми могла привести к прекращению работы приложений. Затем MS предложила идею управления версиями (winsxs).

К сожалению, это довольно сложный механизм, и определенно не стоит пытаться вручную устанавливать dll (сборки) в папку sxs. Установка так называемых «распространяемых пакетов» также не является идеальным решением.

Кроме того, это не может помочь, когда мы хотим отладочные версии. Поскольку MS запрещает распространение отладочных версий поддерживающих dll, «распространяемые пакеты» не будут их устанавливать. (Обратите внимание, что идентификатор сборки зависит от текущей версии Subversion VS2005 и связан с установленными вспомогательными библиотеками.)

Обычно установщик VS добавляет необходимые сборки в систему, но через некоторое время установка обновлений или более новых SDK и инструментов может повредить это правильное состояние.

Давайте предположим, что у нас такая ситуация - наши библиотеки отладки больше не интегрированы в систему. Предположим, мы дали рабочую область с проектом A и конфигурацией активной отладки, дающей не работающее приложение. Затем мы можем создать проект установщика, скажем, C в текущей рабочей области, добавить в него наше приложение (или, строго говоря, проект с активной конфигурацией). Программа установки установщика, чтобы поместить наш исполняемый файл в какое-то место (рабочий стол - правильное место в этой ситуации), включить проверку зависимостей и некоторые другие второстепенные свойства. Затем создайте проект C и запустите установщик (или «установите» из VS с помощью контекстного меню). Теперь ваше приложение и другие созданные с помощью отладочных библиотек DLL начинают работать.

Осторожно, когда вы запускаете установщик с опцией «удалить», вы пришли в предыдущую ситуацию. Вот хорошая статья, связанная с темой распространения: http://blogs.msdn.com/b/vcblog/archive/2007/10/12/how-to-redistribute-the-visual-c-libraries-with-your-application.aspx.

Если у вас есть другие приложения и вы хотите развернуть их, просто скопировав их, возможно, на компьютере, на котором нет разработки, без установленной VS, вы можете создать фиктивный проект вместе с соответствующей конфигурацией и установщиком для него. Затем вы устанавливаете его один раз на каждую машину, а затем копируете исполняемые файлы, над которыми работаете.

0 голосов
/ 03 июня 2014

Для меня параллельная ошибка пошла просто путем изменения значения параметра c / c ++ -> CodeGeneration-> RuntimeLibrary, сделав его MTD многопоточным отладочным

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...