Обновление Windows ломает DLL?
Я компилирую проект, который использует несколько DLL и компилируется с VS2008. После недавнего обновления Windows библиотеки DLL, скомпилированные на моем компьютере, перестали работать на других компьютерах.
После некоторого расследования выяснилось, что она обновила распространяемую библиотеку CRT, которую я компилирую, с версии "9.0.21022.8" до версии "9.0.30729.4148".
Это видно из файла Manifest 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>
Это означает, что он хочет использовать две разные версии CRT одновременно. вторая версия необходима для кода, который я сейчас компилирую, а первая версия нужна для старых библиотек, которые были скомпилированы несколько недель назад.
На компьютерах, на которых развернуто приложение, это становится проблемой, поскольку они получают свои библиотеки CRT из локальной папки с именем Microsoft.VC90.CRT
а не из WinSXS. Эта папка не может содержать две разные версии DLL.
Есть известное решение этой проблемы, или мне нужно начать компилировать все остальные библиотеки DLL с новым CRT?
1 ответ
Это одна из многих головных болей, вызванных параллельными сборками. Каждый раз, когда происходит обновление для Visual Studio, вам действительно нужно перекомпилировать весь ваш код. Поскольку в CRT произошла смена версии, часть вашего кода использует одну DLL, а другая - другую.
Кроме того, при распространении вам действительно нужно распространять CRT с помощью модулей слияния или соответствующего установочного набора, а не копировать библиотеки DLL в папку приложения. Это позволит программе искать подходящую среду выполнения через WinSxS.
Наконец, если вы хотите полностью устранить проблему, как я, вы можете изменить все свои проекты, чтобы они статически связывались с CRT и перекомпилировали все. Это полностью удалит зависимость от библиотеки DLL времени выполнения - по крайней мере, с вашим собственным кодом. Больше не нужно беспокоиться о WinSxS.