Зависимость msvcr90.dll в проекте VS 2005 C ++ - PullRequest
7 голосов
/ 02 декабря 2008

Я создал проект DLL в VS 2005 для собственного Win32 / неуправляемого C ++, назовите его myProj.dll. Это зависит от сторонней коммерческой DLL, которая, в свою очередь, зависит от msvcr90.dll (я предполагаю, что она была построена из проекта VS 2008). Я назову это ThirdParty.dll.

Мой проект DLL прекрасно собирается в VS2005. Я создал тестовое приложение (опять же VS 2005 Win32 C ++), которое ссылается на myProj.lib. (Помимо этого, судя по небольшому размеру .lib и тому факту, что во время выполнения приложение должно найти myProj.dll, я предполагаю, что .lib - это просто оболочка для вызова loadLibrary (), который загружает фактическую DLL; это близко?)

Моя проблема заключается в том, что во время выполнения тестовое приложение не может обнаружить msvcr90.dll (ни msvcp90.dll), зависимость от которой связана с ThirdParty.dll.

Я установил Microsoft Redist-пакет и все библиотеки std (9.0) C ++ в c: \ WINDOWS \ WinSxS \ x86_Microsoft.VC90.CRT _.... Более того, если я укажу обходчику зависимостей на thirdParty.dll, он с радостью разрешит ссылки на это местоположение.

Но, если я укажу figure.exe на моем тестовом приложении (.exe) или myProj.dll, msvcr90.dll и msvcp90.dll не найдены.

Я предполагаю, что в VS2005 нужно что-то настроить, чтобы .exe или myProj.dll знали о расположении 9.0 версий библиотек std C ++ (предположительно, где пакет redist установил их в C: \ WINDOWS \ WinSxS), но я не могу понять, что это такое. Я на правильном пути?

Замечу, что если я просто скопирую файлы msvc * 90.dll в каталог своего приложения, то зависимость разрешится, но я получаю ошибку во время выполнения о неправильной загрузке библиотек DLL std c ++ и т. Д.

Огромное спасибо заранее.

Ответы [ 4 ]

6 голосов
/ 02 декабря 2008

Это похоже на "Параллельные сборки" для меня.

Из того, что я могу сказать, Microsoft, пытаясь остановить проблемы DLL Hell прошлых лет, представила концепцию "Параллельные сборки".

В скорлупе ореха это означает, что вашему приложению нужно сообщить Windows , с какой версией CRT оно было разработано для работы. Когда приложение установлено, Windows позаботится о том, чтобы ваше приложение получило свою собственную копию этих файлов DLL.

Чтобы все это заработало, вам нужно встроить зависимости DLL приложения в файл Manifest и присоединить его к проекту с помощью Manifest Tool , Input and Output раздел настроек проекта приложения.

В качестве примера приведу манифест, который я использую для Zeus для Windows IDE:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
  <assemblyIdentity
      name="Xidicone.Windows.Zeus for Windows"
      version="3.9.6.69"
      processorArchitecture="X86"
      type="win32" />

  <description>Zeus for Windows</description>

  <dependency>
    <dependentAssembly>
      <assemblyIdentity
            type="win32"
            name="Microsoft.VC80.CRT"
            version="8.0.50608.0"
            processorArchitecture="x86"
            publicKeyToken="1fc8b3b9a1e18e3b" />
    </dependentAssembly>
  </dependency>

  <dependency>
    <dependentAssembly>
      <assemblyIdentity
          type="win32"
          name="Microsoft.Windows.Common-Controls"
          version="6.0.0.0"
          processorArchitecture="X86"
          publicKeyToken="6595b64144ccf1df"
          language="*" />
    </dependentAssembly>
  </dependency>
</assembly>

Наконец, если вы планируете создать установщик, вам необходимо добавить те же версии этих файлов DLL в установщик приложения или, в качестве альтернативы, запустить установщик распространяемого установщика Microsoft CRT.

FWIW Я узнал об этом только тогда, когда пользователь сообщил, что Zeus больше не работает в Windows XP из-за отсутствия файла DLL времени выполнения MSVCRT, но Zeus работал нормально для более 10 лет, ни разу не доставляя файл DLL времени выполнения MSVCRT.

2 голосов
/ 02 декабря 2008

Установили ли вы SP1 версию из MSVC 2008 Redist?

Это не проблема, есливи зависимости.exe не может найти msvcr90.dll, если вы используете установщик Microsoft, он автоматически устанавливается в правильном месте и будет найден, если ваше приложение запущено. Это не поможет, если вы копируете DLL в каталог вашего приложения, если вы не создаете манифест.

Но можете ли вы сообщить точное сообщение об ошибке, которое вы получили?

Вы также можете посмотреть здесь и здесь относительно манифеста.

1 голос
/ 02 декабря 2008

Я бы спросил об этом у сторонних dll людей.

0 голосов
/ 25 ноября 2011

У меня такая же проблема несколько дней назад. myProj.dll зависит от ThirdParty.dll, которая использует msvcr90. Если я создаю test.exe, используя непосредственно myProj.dll, это нормально. Но если я использую loadLibrary (myProj.dll) в test.exe, вызов просто не удастся. То же самое произойдет, если я попробую loadLibrary (myProj.dll) в программе на Java.

После некоторых исследований в Интернете, следующие шаги решили мою проблему.

  1. Убедитесь, что в PATH НЕТ msvcr90. Вы можете использовать обозреватель процессов (procxp.exe из SystemInternals), чтобы узнать все msvcr90, загруженные в настоящее время в вашей среде. На самом деле, начиная с VC 2005, библиотеки времени выполнения C следует устанавливать только в глобальный кэш сборок (\ winsxs ....), даже не под windows или windows \ system32.

  2. встроить манифест DLL в myProj.dll. После того, как cl.exe и link.exe выдают myProj.dll, также создается соответствующий манифест. Затем используйте mt.exe -inputresource myProj.dll.manifest -out myProj.dll; 2

Вышесказанное решает мою проблему, надеюсь, что она может вам чем-нибудь помочь. Кстати, я использую VC 2008 под Windows 2008 R

...