2010-04-22 3 views
2

Я компилирую проект, который использует несколько DLL и компилирует с VS2008. После недавних обновлений Windows DLL, скомпилированные на моем компьютере, перестали работать на других компьютерах.Обновление Windows ломает DLL?

После некоторого исследования выяснилось, что она обновила распространяемые библиотеки CRT, который я компиляцию с версии от «9.0.21022.8» до версии «9.0.30729.4148»

Это видно из манифеста файла из EXE я компилирую. он содержит следующее:

<dependency> 
    <dependentAssembly> 
     <assemblyIdentity type="win32" name="Microsoft.VC90.CRT" version="9.0.21022.8" processorArchitecture="amd64" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity> 
    </dependentAssembly> 
    </dependency> 
    <dependency> 
    <dependentAssembly> 
     <assemblyIdentity type="win32" name="Microsoft.VC90.CRT" version="9.0.30729.4148" processorArchitecture="amd64" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity> 
    </dependentAssembly> 
    </dependency> 

Это означает, что он хочет использовать две разные версии ЭЛТ одновременно. Вторая версия нужна коду, который я компилирую прямо сейчас, и первая версия нужна старым dll, которые были скомпилированы несколько недель назад.

В компьютерах, где развертывается приложение, это становится проблемой, так как они получают свою DLL CRT из локальной папки с именем Microsoft.VC90.CRT, а не из WinSXS. Эта папка не может содержать две разные версии dll.

Есть ли известное решение этой проблемы или мне нужно начать компиляцию всех других DLL с помощью нового CRT?

+0

Я думаю, что я заметил ту же самую проблему на прошлой неделе. После обновления Windows проект, который был построен отлично в предыдущий день, больше не строился. Фактически это вызвало крах ICE в компиляторе VS2008. Все это исправлено. Я никогда не определял точной причины, но для меня это не такая уж большая проблема, как мы еще не отправили. – demoncodemonkey

ответ

0

Это одна из многих головных болей, вызванных сборочными сборками. В любое время, когда есть обновление для Visual Studio, вам действительно нужно перекомпилировать весь ваш код. Поскольку в CRT произошла смена версии, часть вашего кода использует одну DLL, а остальная часть - другая.

Кроме того, при распространении вам действительно необходимо распределить CRT через слияние модулей или appropriate installation set вместо копирования DLL в папку приложения. Это позволит программе искать подходящую рабочую среду (ы) через WinSxS.

Наконец, если вы хотите вообще устранить проблему, как я, вы можете изменить все свои проекты до link statically with the CRT и перекомпилировать все. Это полностью устранит зависимость от DLL runtime - по крайней мере, с вашим собственным кодом. Не стоит больше беспокоиться о WinSxS.