Мне нужно загрузить DLL из другой DLL. Соблазн состоит в том, чтобы загрузить его в DllMain, но уже есть убедительная документация, в которой говорится, что это «плохая идея».
На риск задать вопрос, который не очень конкретен: есть ли лучшая практика загрузки DLL из другой DLL?
В нашем текущем проекте у нашей основной DLL есть класс. Я загружаю вторую DLL из конструктора этого класса. Однако, поскольку этот класс может быть создан несколько раз в DLL, я сохраняю переменную, которая указывает, была ли DLL загружена ранее, чтобы не вызывать LoadLibrary снова. Это почему-то не кажется хорошим решением, отсюда и мой вопрос.
Это зависит от вашей DLL.
По сути, у вас есть эти варианты:
Если вы выберете 1, вы получите действительно странные сообщения, если DLL2 отсутствует при попытке загрузить DLL1, что-то вроде «Не удалось загрузить DLL1». И клиент никогда не узнает, что это из-за отсутствия DLL2. Поэтому я не люблю использовать это решение, если вы не уверены на 100%, что DLL2 установлена правильно.
Однако, когда вы загружаете DLL2 вручную (LoadLibrary), вы получаете возможность представить содержательное сообщение.
Вы можете выбрать 2, если у вас есть четкие точки входа и выхода в вашей DLL. Это тот случай, если ваша DLL экспортирует одну или очень мало функций, то есть функцию для создания фабрики для других объектов. Затем вы можете загрузить / разгрузить с завода.
Вы можете выбрать 3, если это не приводит к частой загрузке / выгрузке.
Кроме того, вам не нужно хранить только один дескриптор для DLL2. Вы можете вызывать LoadLibrary / FreeLibrary несколько раз, и это подсистема, которая делает подсчет ссылок.
Итак, если позволяет ваша ситуация, вы можете выбрать одно из этих 3 решений. Вам придется использовать исходное решение, только если у вас нет четкой точки входа и вы слишком часто вызываете функцию, для которой требуется DLL2.
Других решений пока нет …