2016-01-04 6 views
-1

В моем текущем проекте есть зависимости от COM-компонентов, которые используют side by side manifests. Манифеста при условии, мне содержит file элементы без каких-либо comClass суб-элементов, как например .:Имеет ли смысл иметь пустой элемент файла в файле манифеста SxS

<file name="fred.dll"> 
</file> 

Есть ли в этом смысл, или может это быть удалены безопасно? В некотором дополнительном контексте манифесты генерировались автоматически в прошлом. И указанные пустые записи, предположительно, вызвали проблемы в переданном, мне объяснили, что происходят странные вещи, если процесс зависит от двух разных компонентов COM, которые имеют манифест, содержащий один и тот же пустой элемент file. Кроме того, имя dll в пустом элементе - это прямые C dll, которые не содержат никаких COM-объектов.

Я просмотрел доступный documentation, а xsd, предоставленный Microsoft, говорит мне, что синтаксически правильно иметь пустой элемент file. Однако я не нашел ответа на вопрос, имеет ли смысл добавить file элементов манифеста, которые не описывают никаких COM-объектов.

+0

Никогда не пробовал, но должен. Клиент все еще зависит от реестра для создания объекта, но вместо зарегистрированной DLL он загрузит любую копию, присутствующую в папке EXE. Решает DLL Hell, когда автор модифицировал компонент, но не изменил указатели, стандартное преступление. Просто попробуйте, используйте отладчик, чтобы узнать, откуда идет DLL. –

+0

@HansPassant: Я обновил вопрос, dll's являются прямыми C dll's, это имеет смысл тогда? DLL будет загружен из PATH, и в этом случае dll будет загружаться из папки EXE в любом случае. –

ответ

1

в DLL файлы прямые C DLL файлы

Это быстро перерасти в территорию марки, нет смысла. Технически все еще полезно, если DLL развернута в подкаталог с тем же именем, что и имя <assemblyIdentity> зависимого объекта. ОС не будет выглядеть в подкаталогах для DLL, если это не будет сказано манифестом. Альтернатива для параллельного развертывания в кеше WinSxS вместо локального развертывания. Обратите внимание, что имя подкаталога имеет решающее значение, оно должно соответствовать атрибуту «name» элемента assemblyIdentity, наилучшему способу распознавания использования.

Jochen Kalmbach привел пример такого использования в this blog post. Полезно в те дни, когда Microsoft развернула CRT в WinSxS (VS2005 и VS2008), которая вызвала широко распространенный хаос. Обратите внимание на элемент <file> во вложенном файле Microsoft.VC90.CRT.manifest.

Является ли это использование совпадением с тем, что вы нашли, является неопровержимым. Очень странно скрывать детали в вопросе SO. Самый простой способ узнать, нужно ли это просто удалить его и посмотреть, что попадает в вентилятор. Мы не можем вам помочь.