2010-10-29 1 views
4

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

Чтобы попытаться управлять этим, мы хотели бы поместить группы сторонних 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 и выше).

Update

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

Во-первых, наша сборка фактически имеет несколько 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. манифест» должна включать в себя все файлы 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.

ответ

6

Вы можете сделать это с помощью манифестов без зондирования. Создайте «поддельные» сборки - определяя .manifests, содержащие DLL. (Никаких изменений в dll для этого не требуется) Поскольку поддержка сборки была добавлена ​​в NT 5.1 (Windows XP), загрузчик окон сначала ищет сборки, просматривая папку с именем сборок.

Так, например, если вам нужно распространять Microsoft Visual выполнения C для Visual C 2008 с приложением, вы можете создать структуру папок, которая выглядит следующим образом:

--> Application Folder 
    --> Application.exe 
    --> MyDll1.dll 
    --> MyDll2.dll 
    --> Microsoft.VC90.CRT 
    --> Microsoft.VC90.CRT.manifest 
    --> msvcr90.dll 
    --> msvcp90.dll 
    --> msvcm90.dll 

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

манифеста файлы, описывающие узлы нуждаются в assemblyIdentity, и узел файл на DLL:

<assembly manifestVersion="1.0"> 
    <assemblyIdentity type="Win32" name="Assembly Name" version="1.0.0.0" processorArchitecture="x86" /> 
    <file name="dll1.dll" /> 
    <file name="dll2.dll" /> 
</assembly> 

и ваше приложение, и DLLs построены с MS Visual Studio 2005 или более поздней версии, следующая директива прагма бы ваше приложение ищет DLL в сборках:

#pragma comment(linker, "/manifestDependency:\"name='Assembly Name' processorArchitecture='*' version='1.0.0.0' type='win32' \"") 
+0

Мы использовали этот ответ в конце - там было несколько других обручей, которые нам пришлось перепрыгнуть, если кто-то ищет решение! – Bids

+1

id интересно узнать, что такое обручи? я пытался охватить все соответствующие базы :) –

1

Вы можете использовать функцию SetDLLDirectory, чтобы указать пути (ы) для своих DLL. Альтернативно читайте информацию об использовании application-specific paths.

Смежные вопросы