Вызов методов из DLL - PullRequest
       2

Вызов методов из DLL

0 голосов
/ 12 ноября 2011

В моем проекте у нас есть набор существующих библиотек, которые я хотел бы использовать как есть. Но это создаст каскадные вызовы через несколько DLL. Ниже будет поток вызовов:

  1. First.dll вызовет Second.dll для получения информации в уже созданном блоке памяти. (указатель блока памяти будет передан второму dll для получения выходных данных.)
  2. Second.dll вызовет Third.dll и передаст указатель передачи блока памяти (изначально созданного First.dll)

С какими проблемами сталкивается мое приложение? Пожалуйста, расскажите мне о преимуществах и недостатках этого предложения.

Примечание: First.dll и Second.dll будут заново разработаны. Third.dll - это существующая dll, которая будет использоваться повторно. Даже в будущем у нас может быть сценарий, когда Third.dll может быть заново разработана. Я хочу знать, есть ли какая-либо проблема, с которой приложение может столкнуться с каскадными вызовами между несколькими DLL?

Ответы [ 2 ]

0 голосов
/ 12 ноября 2011

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

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

Вот очень грубое представление о том, как выглядит обычный вызов для члена класса:

push 0                   ; a parameter
push 1                   ; another parameter
push eax                 ; pointer to the class instance
call Program.SomeMethod  ; direct call to the method

Это очень быстро. Когда вы включаете DLL, вы должны выполнить вызов через IAT. Это увеличивает время выполнения. Опять же, это грубое упрощение:

push 0
push 1
push eax
call <Program.IAT_1>
...
Program.IAT_1:
  jmp DLL1.SomeCall
...
DLL1.SomeCall:
  ; more code here
  call <DLL1.IAT_1>
...
DLL1.IAT_1:
  jmp DLL2.SomeOtherCall
...
DLL2.SomeOtherCall
  ; actual code here
  ret

Поскольку вы вызываете через модули, это вызовет значительные издержки, если вы будете часто вызывать эту функцию.

Существует также множество вопросов, связанных с обслуживанием и развертыванием, которые делают еще более разумным не разделять вещи, когда в этом нет необходимости.

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

0 голосов
/ 12 ноября 2011

«Если это работает, не исправляйте это» Это означает, что если они работают «как есть», тогда все в порядке. Я так понимаю, эти библиотеки уже существуют? Таким образом, уже разработаны и проверены для совместной работы? Если это так, они также будут работать на вас. Приветствия.

Однако, если вы планируете создавать их самостоятельно или имеете альтернативный набор библиотек DLL, я бы предложил использовать более простую архитектуру без каскадных библиотек DLL. Проще отлаживать и разрабатывать, когда вокруг меньше DLL или уровней DLL. Тем не менее, не утруждайте себя, если у вас есть проверенная установка под рукой.

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