У меня есть собственная библиотека C ++, которую я создаю с помощью Visual Studio 2005, которая является частью более крупного проекта.
Этот проект обычно содержит несколько других dll, включая библиотеки распространяемого пакета Microft C ++ (например, msvcr80.dll). Таким образом, мы можем развернуть наш проект, не заставляя пользователя устанавливать распространяемый пакет Microsoft Visual C ++ 2005.
Проблема в том, что всякий раз, когда я помещаю свою библиотеку в этот более крупный проект, я получаю следующую ошибку:
This application has failed to start because the application configuration is incorrect. Reinstalling application may fix this problem.
Чтобы решить эту проблему, я просмотрел, какую версию Visual Studio CRT использовала моя dll и какую ее версию использовал более крупный проект, и, как оказалось, они разные.
Ниже приведен манифест для более крупного проекта:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<noInheritable></noInheritable>
<assemblyIdentity type="win32" name="Microsoft.VC80.CRT" version="8.0.50727.4053" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
</assembly>
И вот что я получил из своей библиотеки:
<dependency>
<dependentAssembly>
<assemblyIdentity type="win32" name="Microsoft.VC80.CRT" version="8.0.50727.6195" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
</dependentAssembly>
</dependency>
Затем я провел небольшое исследование в Интернете и обнаружил как минимум два способа вручную изменить CRT-версию моей dll.
Первый - установить в моем проекте следующий макрос:
#define _CRT_ASSEMBLY_VERSION "8.0.50727.4053"
А второй подробно описан в этом сообщении.
Я пробовал их оба, но ни один из них не работал.
Что касается первого, я добавил _CRT_ASSEMBLY_VERSION в один из файлов заголовков моего проекта, но не изменил его версию CRT. Также, если у меня более одного проекта, нужно ли мне добавлять этот макрос ко всем из них?
Что касается второго, я изменил манифест моей библиотеки на:
<?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' />
</dependentAssembly>
</dependency>
</assembly>
Но теперь моя библиотека создается без тега внутри.
Наконец, обратите внимание, что я очень предпочитаю, если бы я мог использовать первый метод, поскольку он проще и что-то, что входит прямо в код, поэтому мне не нужно постоянно помнить о необходимости поддерживать отдельный файл манифеста для моих проектов.