Двоичный файл, скомпилированный для VS2008, требует параллельной сборки DebugCRT, не работает в VS2010

Я работаю с VS2010 над проектом, который использует Havok, а в последнем выпуске есть только VS2008 и более ранние двоичные файлы. Встроенный манифест, созданный VS, содержит следующие

<assemblyIdentity type="win32" name="Microsoft.VC90.DebugCRT" version="9.0.21022.8" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>

Поскольку очевидно, что VS больше не использует параллельные сборки (исходный код), начиная с 2010, в моем каталоге winsxs не установлены отладочные сборки crt, а распространяемый пакет vs не устанавливает отладочные версии. Если мы скомпилируем библиотеки DLL, использующие Havok, со встроенным манифестом, приложения, загружающие библиотеки DLL, не запустятся.

Я запустил sxstrace и получил следующее:

INFO: Begin assembly probing.
INFO: Did not find the assembly in WinSxS.
INFO: Attempt to probe manifest at G:\Windows\assembly\GAC_32\Microsoft.VC90.DebugCRT\9.0.21022.8__1fc8b3b9a1e18e3b\Microsoft.VC90.DebugCRT.DLL.
INFO: Attempt to probe manifest at D:\Projects\GTS new\bld\Debug\Microsoft.VC90.DebugCRT.DLL.
INFO: Attempt to probe manifest at D:\Projects\GTS new\bld\Debug\Microsoft.VC90.DebugCRT.MANIFEST.
INFO: Attempt to probe manifest at D:\Projects\GTS new\bld\Debug\Microsoft.VC90.DebugCRT\Microsoft.VC90.DebugCRT.DLL.
INFO: Attempt to probe manifest at D:\Projects\GTS new\bld\Debug\Microsoft.VC90.DebugCRT\Microsoft.VC90.DebugCRT.MANIFEST.
INFO: Did not find manifest for culture Neutral.
INFO: End assembly probing.
ERROR: Cannot resolve reference Microsoft.VC90.DebugCRT,processorArchitecture="x86",publicKeyToken="1fc8b3b9a1e18e3b",type="win32",version="9.0.21022.8".
ERROR: Activation Context generation failed.
End Activation Context Generation.

Приложения работают на одной из машин моего коллеги, поскольку (предположительно) на нем была установлена ​​VS2008, но не на другом или моем коллеге, поскольку у нас была установлена ​​только VS2010. Единственные файлы debugcrt, которые есть на рабочем компьютере в каталоге winsxs, - это

x86_microsoft.vc90.debugcrt_1fc8b3b9a1e18e3b_9.0.30729.1_none_bb1f6aa1308c35eb

как папка с dll, файл .manifest и файл .cat (тот же publicKeyToken, но другая версия)

Я попытался скопировать файлы в свой каталог winsxs, но это не устранило проблему. Размещение dll непосредственно в каталоге с двоичными файлами также ничего не дало. Помещение файлов в bin\Microsoft.VC90.DebugCRT.DLL (так как это был один из каталогов, которые искали согласно sxstrace) также не помогло, но вывод sxstrace изменился на

INFO: Begin assembly probing.
INFO: Did not find the assembly in WinSxS.
INFO: Attempt to probe manifest at G:\Windows\assembly\GAC_32\Microsoft.VC90.DebugCRT\9.0.21022.8__1fc8b3b9a1e18e3b\Microsoft.VC90.DebugCRT.DLL.
INFO: Attempt to probe manifest at D:\Projects\GTS new\bld\Debug\Microsoft.VC90.DebugCRT.DLL.
INFO: End assembly probing.
ERROR: Activation Context generation failed.

(он прекращает поиск и может разрешить ссылку, но создание контекста по-прежнему не удается)

Единственное, что работает, - это отключение генерации встроенного манифеста. Есть ли другой способ решить эту проблему?


person atarck    schedule 29.05.2011    source источник
comment
Создает ли VS манифест для DebugCRT в режиме отладки, а не в выпуске?   -  person abatishchev    schedule 03.08.2012
comment
Также ознакомьтесь с MSDN.   -  person abatishchev    schedule 03.08.2012


Ответы (1)


На рабочем компьютере заглянем в папку:

C: \ Program Files (x86) \ Microsoft Visual Studio 9.0 \ VC \ redist \ Debug_NonRedist \ x86 \ Microsoft.VC90.DebugCRT

Здесь находятся DLL-библиотеки времени выполнения, необходимые для запуска. Там же есть файл манифеста. Вы можете посмотреть в средстве просмотра событий (eventvwr.exe), какую версию DLL ищет exe, а затем вы можете изменить файл манифеста (скорее, изменить копию, которую вы помещаете в исполняемый каталог с DLL) поэтому он будет идентифицировать включенные файлы как эту версию.

person Mozzis    schedule 03.08.2012