Обновления безопасности Visual Studio 2005 и версии DLL CRT в манифесте

Последние обновления безопасности Visual Studio 2005 могут вызывать у нас проблемы.

Мы создаем и распространяем SDK, написанные на C ++ внутри компании. Эти SDK представляют собой набор только файлов заголовков и статических библиотек. После установки обновлений безопасности наши SDK теперь зависят от более новых версий библиотек DLL MSVC CRT. Эти SDK используются в проектах, которые создают EXE-файлы.

Если один из этих EXE-файлов создан с использованием набора SDK (некоторые из них были созданы до обновлений безопасности, некоторые - после), то созданный EXE-файл ссылается на два набора динамических DLL MSVC. Например:

<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="amd64" publicKeyToken="1fc8b3b9a1e18e3b">
            </assemblyIdentity>
        </dependentAssembly>
    </dependency>
    <dependency>
        <dependentAssembly>
            <assemblyIdentity type="win32" name="Microsoft.VC80.CRT" version="8.0.50727.762" processorArchitecture="amd64" publicKeyToken="1fc8b3b9a1e18e3b">
            </assemblyIdentity>
        </dependentAssembly>
    </dependency>
</assembly>

Означает ли это, что во время выполнения этот EXE-файл будет использовать обе версии DLL? Означает ли это, что мы должны распространять обе версии DLL среды выполнения MSVC с этим EXE?

Есть ли простой способ избежать этой проблемы, не заставляя все SDK собираться с установленными исправлениями безопасности Visual Studio 2005? (Это было бы нежелательно для некоторых старых и довольно стабильных SDK, которые мы не хотим перестраивать без надобности)

Можно ли просто переписать файл манифеста либо в SDK, либо в окончательном EXE-файле, чтобы упоминалась только одна версия DLL MSVC CRT?


Насколько я понимаю, соответствующие обновления заключаются в следующем:

Обновление безопасности для Microsoft Visual Studio 2005 с пакетом обновления 1: KB971090

http://go.microsoft.com/fwlink/?LinkId=155934

Обновление безопасности для Microsoft Visual Studio 2008 с пакетом обновления 1: KB971092

http://go.microsoft.com/fwlink/?LinkID=155933


Я обнаружил еще два похожих вопроса:

VC ++: KB971090 и выбор зависимостей DLL среды выполнения Visual C

Последняя версия Visual Studio 2005 Обновление безопасности вызывает проблемы с библиотекой времени выполнения C при оперативном исправлении сайтов клиентов


person Community    schedule 12.08.2009    source источник
comment
почему это было перенесено в вики сообщества?   -  person Jamie Cook    schedule 01.09.2009


Ответы (2)


1) Да, это означает, что среда выполнения использует обе версии - чего вы никогда не хотите. Он должен ссылаться только на одну версию DLL.

2) Существует метод, который я разработал, чтобы заставить версию быть версией SP1 (без обновления безопасности). Я обрисовал это здесь

3) Вы можете полностью отключить манифесты и выполнять их вручную, но я не рекомендую этого делать, так как поддерживать разные манифесты для отладки и выпуска - проблема, а также способ решения проблемы, подверженный ошибкам. Было бы лучше использовать обходной путь, упомянутый выше в (2).

person Community    schedule 16.08.2009

Как говорит Тед, во время выполнения ваш исполняемый файл будет пытаться использовать обе версии DLL. Вероятно, это связано с тем, что вы не полностью перекомпилировали весь проект (или вы используете внешние библиотеки, которые были скомпилированы в зависимости от среды выполнения .762).

Хорошая новость заключается в том, что если обе эти библиотеки установлены в ваших клиентских системах, то политика параллельного перенаправления будет означать, что загружается только самая последняя. Безусловно, более опасный побочный эффект, который вы заметите, - это когда установлен только один (вероятно .762), приложение не сможет запуститься со старым сообщением об ошибке «приложение не настроено правильно, переустановка может решить эту проблему».

Означает ли это, что мы должны распространять обе версии библиотек времени выполнения MSVC с этим EXE-файлом?

Самым простым решением для вас, вероятно, было бы просто отправить последнюю версию распространяемого пакета Visual C ++ runtime, которую вы можете получить по следующей ссылке.

http://download.microsoft.com/download/6/B/B/6BB661D6-A8AE-4819-B79F-236472F6070C/vcredist_x86.exe

Это может быть немного неудобно, потому что пользователя просят нажать «Я согласен» на странице EULA и требуются привилегии администратора, но по общему мнению, это лучший вариант, если вы можете заставить пользователя установить его.

person Community    schedule 31.08.2009