Как мне организовать сторонние библиотеки DLL Windows во вложенную папку в папке приложения?

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

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

--> Application Folder
    --> Application.exe
    --> MyDLL1.dll
    --> MyDLL2.dll
    --> Third Party 1 DLL folder
        --> Third Party 1 DLL 1.dll
        --> Third Party 1 DLL 2.dll
        --> Third Party 1 DLL 3.dll
    --> Third Party 2 DLL folder
        --> Third Party 2 DLL 1.dll
        --> Third Party 2 DLL 2.dll
        --> Third Party 2 DLL 3.dll

Мой вопрос в том, как заставить динамический компоновщик находить их и загружать?

Мы могли бы сделать это вручную с помощью LoadLibrary () и GetProcAddress (), однако это очень утомительно. Похоже, что мы могли бы сделать это с помощью манифестов и «зондирования», но это похоже только на Windows 7 (нам нужно работать на XP и выше).

Обновление

В конце концов, мы использовали манифесты (спасибо @Chris) - нам пришлось перепрыгнуть через пару других обручей на случай, если кто-то ищет решение!

Во-первых, наша «сборка» на самом деле имеет несколько библиотек DLL, одну из которых мы связываем, а затем связываем с другими. Всем этим библиотекам DLL потребуется добавление зависимостей сборки в их манифесты (для этого можно использовать mt.exe, не имея доступа к исходному коду этих DLL).

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

Вот наш окончательный макет:

--> Application Folder
    --> Application.exe
    --> Plugins folder
        --> MyDLL1.dll
        --> Third Party 1
            --> Third Party 1.manifest
            --> A.dll
            --> B.dll
            --> C.dll

Если MyDLL1. dll - это плагин, который ссылается на A.dll, а A.dll - на B.dll и C.dll, тогда:

  1. «Сторонний 1.manifest» должен включать все A.dll, B.dll и C. . dll в виде сборки
  2. "MyDLL1.dll" требуется запись зависимости в своем манифесте для "Третьей стороны 1", иначе динамический компоновщик не найдет A.dll
  3. A.dll требуется запись зависимости в своем манифесте для «Третья сторона 1» или динамический компоновщик не найдет B.dll и C.dll
  4. Папка «Третья сторона 1» должна находиться рядом с «MyDLL1.dll», а не рядом с «Application.exe»

Меня (3) немного раздражает. Можно подумать, что компоновщик будет искать в сборке зависимые библиотеки DLL.

5
задан Bids 12 November 2010 в 12:11
поделиться