Как мне исправить зависимость CRT, вызывающую исключение FileLoadException с моей библиотекой DLL смешанного режима vc2005 в XP?
-
11-10-2019 - |
Вопрос
У меня есть библиотека DLL смешанного режима, встроенная в Visual Studio 2005.В dependency walker моя библиотека DLL показывает зависимость от следующих CRT-библиотек DLL.Обратите внимание, что это на моем компьютере для разработки Windows 7.
c:\windows\winsxs\x86_microsoft.vc80.crt_1fc8b3b9a1e18e3b_8.0.50727.4927_none_d08a205e442db5b5\MSVCP80.DLL
"\MSVCR80.DLL
"\MSVCM80.DLL
8.0.50727.4927
На моем компьютере для разработчиков Windows 7, использующем Visual Studio 2005, это компилируется и работает просто отлично.проблема в том, что он не будет запускаться на моем тестовом компьютере с Windows XP с установленной последней версией CRT.
Когда я перетаскиваю библиотеку DLL в depenency walker на компьютере XP, кажется, что она ищет библиотеки DLL в \System32...(Я перешел к показу полного пути, но там не было путей для них, только желтый восклицательный знак)
Проблема в том, что эта версия (сборка 4927) crt в WinSxS не установлена на тестовой машине XP.в нем установлена Visual Studio 2005 с последней версией CRT (sp1?).
8.0.50727.4053 это последняя версия, которую я смог найти в MSDN.
Я понимаю, что это не самый волнующий вопрос, опубликованный на SO, но кто-нибудь знает, что происходит с этой средой выполнения 4927?
* Редактировать *
Манифест, сгенерированный MT.exe:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<dependency>
<dependentAssembly>
<assemblyIdentity type="win32" name="Microsoft.VC80.CRT" version="8.0.50727.4053" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
</dependentAssembly>
</dependency>
<dependency>
<dependentAssembly>
<assemblyIdentity type="win32" name="Microsoft.VC80.CRT" version="8.0.50727.762" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
</dependentAssembly>
</dependency>
<dependency>
<dependentAssembly>
<assemblyIdentity type="win32" name="Microsoft.VC90.CRT" version="9.0.21022.8" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
</dependentAssembly>
</dependency>
</assembly>
Итак, существует 3 различные версии, на которые он нацелен...
Решение
Редакция 4927 - это специфичная для Windows 7 версия, вероятно, используемая двоичными файлами Microsoft.Ваша сборка не должна создавать зависимость от нее, 4053 является последней для VS2005.Не устраняйте это с помощью depends.exe кстати, он не очень хорош для отслеживания зависимостей winsxs.
Начните устранять неполадки, дважды проверив, какую зависимость генерирует ваша сборка.Сначала посмотрите в vc\include\crtassem.h, макрос _CRT_ASSEMBLY_VERSION генерирует запись манифеста.Далее необходимо проверить манифест, встроенный в ваш исполняемый файл.Каталог выпуска вашего проекта содержит файл .embed.manifest, который был внедрен.И File + Open + Файл в вашем исполняемом файле позволяет вам заглянуть в фактический встроенный ресурс RT_MANIFEST.