Подтвердить что ты не робот

Почему установка vcredist_x86.exe не исправляет ошибку SideBySide, когда я разрабатываю EXE на одной машине и запускаю ее на другой?

Вопрос

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

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

В Event Viewer > System было зарегистрировано три события.

Идентификатор события: 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 С++ 2005 не исправила его

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

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

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

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

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

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

  • Я скопировал msvcm80.dll, msvcp80.dll и msvcr80.dll из C:\windows\winsxs\x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.42_x-ww_0de06acd до C:\foo.
  • Затем я скопировал 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 и соответствующим файлом манифеста. Это тоже не помогло. Я получил ту же ошибку.

В обоих случаях я получил следующие ошибки в Event Viewer > System.

КОД события: 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.

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

  • Я скопировал 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).
  • Затем я скопировал 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 теперь я получил те же ошибки, о которых упоминалось в предыдущем разделе.

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

  • Скопировано 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:\foo машины Windows 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 С++ 2005 SP1 Redistributable' (vcredist_x86.exe), как описано во втором подходе, исправит его. Но это не так. Скопировав DLL и файлы манифеста из папки C:\Program Files\Microsoft Visual Studio 8\VC\redist\x86\Microsoft.VC80.CRT на машине разработки, исправил ее. Почему это было так?

Параметры сборки

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

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

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

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

/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

4b9b3361

Ответ 1

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

Я загрузил Microsoft Visual С++ 2005 с пакетом обновления 1 (Redistributable Package) Обновление безопасности 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 была версией DLL 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, которые будут установлены установщиком.

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

Ответ 2

Вот как вы исправляете эту проблему:

ВЫ ВСЕГДА НЕ ПОЛУЧИТЕ ошибки sidebyside. Если используемое приложение 32 бит, и вы пытаетесь запустить его на 64-разрядной ОС, где установлен VC_REDISTx64.

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

Ответ 4

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

Ответ 5

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

разработан на 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)

и побежал в win 2k3 SP2 x64,

но нужны msvcm80.dll, msvcp80.dll и msvcr80.dll.

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

Ответ 6

Для меня ошибка "бок о бок" пошла просто путем chabging под настройкой c/С++ → CodeGeneration- > RuntimeLibrary, сделайте MTD многопоточным Debug

Ответ 7

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

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

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

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

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

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

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