Есть ли лучшая практика загрузки DLL из другой DLL?

Мне нужно загрузить DLL из другой DLL. Соблазн состоит в том, чтобы загрузить его в DllMain, но уже есть убедительная документация, в которой говорится, что это «плохая идея».

На риск задать вопрос, который не очень конкретен: есть ли лучшая практика загрузки DLL из другой DLL?

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

2

Решение

Это зависит от вашей DLL.
По сути, у вас есть эти варианты:

  1. Ссылка на эту библиотеку DLL, чтобы загрузить ее автоматически
  2. Загрузите другую DLL, когда ваша библиотека загружена, выгрузите до того, как она будет выгружена
  3. Загрузите другую DLL перед использованием, затем выгрузите

Если вы выберете 1, вы получите действительно странные сообщения, если DLL2 отсутствует при попытке загрузить DLL1, что-то вроде «Не удалось загрузить DLL1». И клиент никогда не узнает, что это из-за отсутствия DLL2. Поэтому я не люблю использовать это решение, если вы не уверены на 100%, что DLL2 установлена ​​правильно.

Однако, когда вы загружаете DLL2 вручную (LoadLibrary), вы получаете возможность представить содержательное сообщение.

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

Вы можете выбрать 3, если это не приводит к частой загрузке / выгрузке.

Кроме того, вам не нужно хранить только один дескриптор для DLL2. Вы можете вызывать LoadLibrary / FreeLibrary несколько раз, и это подсистема, которая делает подсчет ссылок.

Итак, если позволяет ваша ситуация, вы можете выбрать одно из этих 3 решений. Вам придется использовать исходное решение, только если у вас нет четкой точки входа и вы слишком часто вызываете функцию, для которой требуется DLL2.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]