2013-03-11 3 views
0

После долгого времени исследования/исследования я нашелКак контролировать SxS для msvcr90d.dll/msvcp90d.dll

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

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

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

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

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

ответ

1

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

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

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

+0

Я нашел msvcr80.dll и msvcr90d.dll, проверяя, кто является ... Это кажется плохой ... – Raymond

+0

Я нашел это еще одна DLL-библиотека третьей части. – Raymond

+0

Я нашел ошибку, это еще одна логическая ошибка DLL третьей части. Проверка msvcr90d.dll/msvcr90.dll - хорошее начало. Благодарю. – Raymond