Где установить общие библиотеки DLL в Windows - PullRequest
6 голосов
/ 20 апреля 2010

У меня есть драйвер, который можно установить в Windows (XP / Vista / 7). Доступ к нему осуществляется через собственную C ++ DLL, на которую ссылаются сторонние приложения, и которая также является поставщиком Winsock (WSP). Раньше он устанавливался под System32, но, послушав совета, я изменил его на установку под ProgramFiles.

Теперь проблема в том, что людям приходится либо копировать их обратно в System32, либо копировать в каталог приложений, когда они хотят использовать его в своих собственных приложениях, потому что Windows не будет искать каталог установки в ProgramFiles, когда приложение пытается загрузить DLL.

Мне не удалось найти какую-либо документацию Microsoft, обсуждающую эту проблему, поэтому, если System32 не следует использовать, то где следует устанавливать общие библиотеки DLL?

Ответы [ 5 ]

7 голосов
/ 20 апреля 2010

Кэш-память Windows рядом. Справочная информация здесь , техническая справка здесь .

Я еще никого не видел, кроме Microsoft. Примечательно, что MSFT отказалась от развертывания winsxs для DLL-библиотек CT C / C ++ CRT и MFC для VS2010, это вызывало слишком много проблем. Они вернулись в c: \ windows \ system32. Управляемый эквивалент этого (GAC) становится все же сильным. Лучшая поддержка инструмента, вероятно.

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

5 голосов
/ 20 апреля 2010

Поскольку это DLL-библиотека, связанная с вашим драйвером, возможно, это не такая уж и проблема, но я бы с осторожностью попытался поделиться этой DLL-библиотекой и вместо этого попытался бы заставить всех разработчиков клиентских приложений сохранить свою собственную версию DLL в папки их приложений. Мне было слишком весело в DLL Hell, чтобы хотеть больше странных ошибок, потому что AppX перезаписал DLL старой версией, которая ломает AppY и т. Д.

2 голосов
/ 20 апреля 2010

Фиксированное расположение файловой системы

Одна из возможностей - установить их в подкаталог Program Files, как это уже предложено @Martin Beckett.

Переменная расположение файловой системы, фиксированная запись в реестре

Если вы не хотите устанавливать их в определенном месте, вы также можете сохранить их местоположение в реестре Windows. Вы должны установить некоторые ключи в HKEY_LOCAL_MACHINE\SOFTWARE, которые ваши приложения могли бы прочитать, чтобы узнать, где находятся библиотеки DLL. Затем библиотеки DLL могут быть загружены во время выполнения.

P.S .: Предотвращение потерянных DLL

Вы можете пойти еще дальше и использовать реестр или другое хранилище (скажем, файл) для хранения информации о том, какое из ваших приложений использует какую из ваших DLL. Например:

FooCommon.dll <- FooApp1, FooApp2, FooApp3
FooBar.dll    <- FooApp1, FooApp3
FooBaz.dll    <- FooApp2, FooApp3

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

2 голосов
/ 20 апреля 2010

В любом месте пути будет работать.
Если это будет использоваться только с вашим набором приложений (например, Qt4.dll), то в корне «c: \ program files \ my company» будет хорошо, или под ним будет «общая» папка.

Если это будет использоваться другими приложениями, о которых вы не знаете (например, видеокодек), тогда system32 имеет смысл (вам понадобятся права администратора при установке)

1 голос
/ 20 апреля 2010

Собственные библиотеки DLL могут храниться как параллельные сборки. См. эту ссылку для получения дополнительной информации. Это отдельный от .NET Global Assembly Cache, но он использует аналогичные концепции. Это сообщение в блоге также содержит довольно много полезных деталей о том, как библиотеки DLL разрешаются как параллельные сборки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...