Чтобы добавить и без того отличные ответы, у вас есть еще пара вариантов:
Предпочтительное решение этой проблемы, поддерживаемое начиная с Windows XP, заключается в том, чтобы превратить ваши dll в сборку win32 (они не обязательно должны быть .NET, но документация по созданию сборок win32 со строгими именами ужасно легка так что легко запутаться и подумать, что это только технология .NET).
Сборка отмечается более сложной, чем папка (с именем сборки), содержащая dll и .manifest (с именем сборки), который содержит элемент assemblyIdentiy, и количество файловых узлов для каждой dll в сборке.
Поиск на основе ассемблера работает даже тогда, когда библиотеки статически связаны!
- Самый простой вариант - создать неверсионные сборки и сохранить их в той же папке, что и ваши файлы .exe (при условии, что все ваши исполняемые файлы находятся в одной папке).
Если исполняемые файлы находятся в разных папках, то есть два способа доступа к общим сборкам:
Вы можете хранить свои сборки в частном альтернативном месте, если ожидаете, что ваше приложение будет использоваться в Windows 7 и выше. Создайте файл app.exe.config для каждого из ваших exe-файлов и укажите элемент probing privatePath в общей папке, где вы храните сборки.
Если вы согласны с требованием административного доступа для выполнения установки (через MSI), тогда вы можете справиться с ужасно плохой документацией (ну, например, отсутствующей документацией), которая имеет дело с присвоением вашим сборкам строгого имени, а затем сохранить сборка в WinSxS.
Если вы не можете или не хотите связывать ваши dll как сборки, эта страница описывает порядок поиска dll
Использование таких функций, как SetDllDirectory поможет только для динамически загружаемых библиотек во время выполнения (через LoadLibrary).
Dll порядок поиска используется быть:
- Каталог, содержащий процесс exe
- Текущий каталог
- различные папки Windows
- PATH
Что вы могли бы использовать в своих интересах - запускайте каждый exe, устанавливая «текущий» каталог в папку, содержащую библиотеки OSS.
С появлением SafeDllSearchMode порядок поиска теперь:
- Каталог, содержащий процесс exe
- различные папки Windows
- Текущий каталог
- PATH
Это означает, что теперь у вас меньше контроля, чем когда-либо :( - Он работает еще быстрее для "ненадежных" папок c: \ windows & System32.
Опять же, если исходная dll загружается через LoadLibrary, и ее зависимые dll являются проблемой, то LoadLibraryEx с флагом LOAD_WITH_ALTERED_SEARCH_PATH вызовет следующий порядок поиска (при условии, что вы передали полный путь к LoadLibraryEx): -
- Часть каталога пути Dll, переданная в LoadLibraryEx
- различные папки Windows
- Текущий каталог
- PATH