Как контролировать SxS для msvcr90d.dll/msvcp90d.dll

После долгого изучения / исследования я нашел

Мое приложение должно использовать msvcr90d.dll/msvcp90d.dll - 9.0.21022.8 Но когда я отлаживаю его с vs2008, оно всегда использует msvcr90d.dll - 9.0.30729.6161

Я думаю, что это должно быть основной причиной сбоя моего приложения за стандартное векторное исключение STL (из сторонних DLL). Я успешно запускаю приложение на своей машине с vs2008. Должно быть, другое приложение повлияло на мое приложение.

Я даже переустанавливаю vs2008 (снова и снова) и настраиваю параметры Manifest для своего приложения, ничего не изменилось. Я разбился... вместе с моим приложением. (Приложение упало как раз перед тем, как я собираюсь показать его своему боссу...)

У меня vs2010, vs2012 на моей машине тоже. Но приложение когда-либо работало, когда они уже существуют. Единственное, что я помню до падения приложения, - это удаленный доступ к своему компьютеру с помощью TeamViewer... На следующий день начались злые дни.

Как управлять SxS для моего приложения?

1 ответ

Решение

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

Единственное, в чем вы можете быть абсолютно уверены, это то, что проблема связана не с версией DLL, а с той версией, которую запрашивает эта сторонняя DLL-библиотека, с такими же правилами перенаправления версий. Легко проверить, кстати, посмотрите в окне Debug + Windows + Modules и найдите msvcr90d.dll. Вы увидите, загружено ли больше одного, и увидите номер версии. И остерегайтесь msvcr90.dll, версии Release, когда их загрузка в процесс действительно плохая. Скорее всего, это произойдет, если вы перейдете по ссылке на сборку Release библиотеки DLL.

Одно стандартное несоответствие, вызывающее сбой, - _HAS_ITERATOR_DEBUGGING #define. Отладка итератора изменяет размер объектов класса коллекции C++. Это идет не так, когда DLL предоставляет такой объект через экспортированную функцию и была скомпилирована с другим параметром для этого #define. Выставляемый объект имеет неправильную компоновку. Вы должны убедиться, что вы используете те же настройки, которые использовались сторонними разработчиками при компиляции DLL. Он включен по умолчанию для сборок Debug, поэтому некоторая вероятность того, что установка #define в 0 для вашего проекта будет быстрым решением. Обратитесь к поставщику, если вы не знаете или хотите, чтобы они изменили свои настройки. Возможно, это также хорошее время, чтобы указать, что показ объектов C++ через границу DLL - плохая идея.

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