Обновление 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.

Другие вопросы по тегам