Почему установка vcredist с архитектурой x86.exe не исправляет ошибку SideBySide, когда я разрабатываю EXE на одной машине и запускаю его на другой?
вопрос
я написал проект на C++ под названием " Foo " с помощью Microsoft Visual Studio 2005 Verison 8.0.50727.762 (SP.050727-7600) в Windows XP Professional версии 2002 с пакетом обновления 3. Я построил проект в Foo.исполняемый. Затем я скопировал файл Foo.exe в пакет обновления 2 для 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.
в средстве просмотра событий > система, три события были отяжелевший.
идентификатор события: 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:fooFoo.exe.
Reference error message: The referenced assembly is not installed on your system.
установка распространяемого Microsoft Visual C++ 2005 не исправила его
- скачал vcredist_x86.exe от http://www.microsoft.com/download/en/details.aspx?id=3387
- установил его. Установщик создал папка называется
C:windowswinsxsx86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.42_x-ww_0de06acd
.
версия этого программного обеспечения, как найдено из "установка и удаление программ" был "8.0.50727.42".
при попытке запустить C:foofoo - ... exe, я получил те же ошибки, которые я описал выше.
установка распространяемого Microsoft Visual C++ 2005 SP1 не исправила его
- скачал vcredist_x86.exe из http://www.microsoft.com/download/en/details.aspx?id=5638
- установил его. Установщик создал папку с именем:
C:windowswinsxsx86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.762_x-ww_6b128700
.
версия этого программного обеспечения, как найдено из "установка и удаление программ" был "8.0.56336".
при попытке запустить C:foofoo - ... exe, я получил те же ошибки, которые я описал выше.
копирование DLL CRT и манифеста с той же машины (где я запускаю EXE) не исправлено он.
- я скопировал
msvcm80.dll
,msvcp80.dll
иmsvcr80.dll
отC:WINDOWSWinSxSx86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.42_x-ww_0de06acd
кC:foo
. - далее, я скопировал
C:WINDOWSWinSxSManifestsx86_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:foofoo - ... на этот раз это не сработало. Я снова повторил эту вещь с DLL в C:windowswinsxsx86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.762_x-ww_6b128700
и соответствующий файл манифеста. Это тоже не помогло. У меня та же ошибка.
в обоих случаях я получил следующие ошибки в средстве просмотра событий > 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:fooMicrosoft.VC80.CRT.MANIFEST" on line 4.
идентификатор события: 59; Источник: SideBySide
Generate Activation Context failed for C:fooFoo.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:winntwinsxsx86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.762_x-ww_6b128700
машины Windows XP (где я разработал и построил foo.исполняемый) кC:foo
Windows Server 2003 (где я пытаюсь запустить foo.исполняемый.) - далее, я скопировал
C:winntwinsxsManifestsx86_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:foofoo - ... exe теперь я получил те же ошибки, упомянутые в предыдущем разделе.
копирование библиотек CRT и манифеста из папки Visual Studio Исправлена ошибка.
- скопировал
msvcm80.dll
,msvcp80.dll
,msvcr80.dll
иMicrosoft.VC80.CRT.manifest
СC:Program FilesMicrosoft Visual Studio 8VCredistx86Microsoft.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:foofoo - ... exe без каких-либо проблемы.
вопрос
я ожидал, что установка "Microsoft Visual C++ 2005 SP1 распространяемый" (vcredist_x86.exe), как описано во втором подходе будет исправить. Но этого не произошло. Копирование файлов DLL и манифеста из C:Program FilesMicrosoft Visual Studio 8VCredistx86Microsoft.VC80.CRT
папка машины разработки исправлена. Почему это так?
параметры построения
в случае, это поможет вам ответить на мой вопрос. Вот компилятор и компоновщик параметры, которые я взял из свойств проекта Visual Studio:
свойства конфигурации > C / C++ > Командная строка:
/O2 /GL /D "_MBCS" /FD /EHsc /MD /Fo"Release" /Fd"Releasevc80.pdb" /W3 /nologo /c /Wp64 /Zi /TP /errorReport:prompt
свойства конфигурации > Компоновщик - > Командная строка:
/OUT:"C:MixedBagReleaseFoo.exe" /NOLOGO /MANIFEST /MANIFESTFILE:"ReleaseFoo.exe.intermediate.manifest" /DEBUG /PDB:"c:MixedBagreleaseFoo.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 ответов
Я отвечу на свой собственный вопрос. Помогли комментарии на вопрос Ганса Пассанта и Люка.
Я скачал Microsoft Visual C++ 2005 пакет обновления 1 распространяемый пакет обновления для системы безопасности MFC и установить его в системе, где я пытался запустить C:\foo\foo.exe
. После этого EXE работал нормально.
установщик поместил DLL 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' />
Итак, это подсказка, что мне нужна версия 8.0.50727.6195 DLL. Остальное было вопросом поиска правильного vcredist_x86.exe, который оказался в URL, который я упомянул во втором абзаце. Страница в этом URL содержит ссылка KB2538242 который показывает номера версий DLL, которые будут установлены установщиком.
Примечание: как Эли упомянул в другой ответ к этому вопросу, так как это 32-разрядное приложение, необходимо установить vcredist_x86.exe (не vcredist_x64.exe) в системе, где это приложение должно быть запущено, независимо от того, является ли эта система 32-разрядной системой Windows или 64-разрядной системой Windows. Еще раз, .файл манифеста предоставляет этот ключ в .
вот как вы исправить эту проблему:
вы будет по-прежнему получают ошибки sidebyside, если используемое приложение 32 бит, и вы пытаетесь запустить его на 64-битной ОС, которая имеет vc_redistx64 установлен.
простое решение, вы также должны загрузить VC_REDISTx86 на 64-битной ОС
необходимо установить " распространяемый пакет обновления 1 для Microsoft Visual C++ 2005 обновление безопасности MFChttp://www.microsoft.com/en-us/download/details.aspx?id=26347
У меня была несколько связанная проблема. Две машины разработки 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.
хотя мое заявление было
разработал на Win 2k8 R2 x64 с vs2008 (который имеет msvcm90.dll, msvcp90.dll и msvcr90.DLL в архиве C:\Program (х86)\Майкрософт Visual студии 9.0\ВК\Redist с\amd64\и Майкрософт.VC90.ЭЛТ)
и побежал на win 2k3 SP2 x64,
но msvcm80.dll, msvcp80.dll и msvcr80.dll необходимы.
после установки распространяемый пакет Microsoft Visual C++ 2005 SP1 (x86) приложение может быть установлено и правильно побежал.
для меня бок о бок ошибка пошла просто по chabging под настройкой c / C++ - >CodeGeneration - >RuntimeLibrary, сделайте это MTD, который является многопоточным Debug
У нас есть действительно следующая проблема здесь: исполняемый файл приложения ссылается на 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, вы можете создать фиктивный проект вместе с соответствующей конфигурацией и установщиком для него . Затем вы устанавливаете его один раз на каждой машине, а затем копируете исполняемые файлы на.