Обновление Windows ломает DLL? - PullRequest
2 голосов
/ 22 апреля 2010

Я компилирую проект, который использует несколько DLL и компилируется с VS2008.После недавнего обновления 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>

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

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

Есть ли известное решение этой проблемы или мне нужно начать компилировать все остальные библиотеки DLL с новым CRT?

1 Ответ

0 голосов
/ 06 августа 2011

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

Кроме того, при распространении вам действительно нужно распространять ЭЛТ через модули слияния или соответствующий установочный набор вместо копирования DLL в папку приложения. Это позволит программе искать соответствующие среды выполнения через WinSxS.

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

...