Windows DLL неожиданно загружается более одного раза в одном приложении - PullRequest
0 голосов
/ 07 сентября 2011

Программа, которую я написал (на C #), обращается через библиотеку оболочки C ++ / CLI к собственной (c ++) библиотеке, которую я тоже написал.

Я заметил, что метод DllMain в нативной библиотеке вызывается более одного раза, и отладчик считает, что к некоторым вызовам библиотеки подключено несколько ячеек памяти. Из того, что я вижу, библиотека инициализируется (и выделяется память) более одного раза.

Учитывая, что мой код не использует такие функции, как LoadLibrary, и используется dll, включая файлы библиотеки .h и .lib, почему он инициализируется более одного раза, и что я могу сделать, чтобы избежать его?

Ответы [ 2 ]

1 голос
/ 07 сентября 2011

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

Также я не совсем понимаю, что вы подразумеваете под " отладчик думает, чтонесколько ячеек памяти подключены к некоторым вызовам библиотеки".Один импортированный символ (функция или адрес переменной) заполняется только одним адресом во время связывания DLL.

Я полагаю, у вас есть одно из следующего:

  • Вы можете загрузить одновременно нескольковерсии одной и той же библиотеки (несколько файлов DLL).Типичная ошибка заключается в одновременной загрузке отладочной и выпускной версий DLL.
  • Ваш DllMain вызывается несколько раз, но это не означает, что он загружается несколько раз.Вы проверяете параметры, подаваемые на DllMain?Это DLL_PROCESS_ATTACH или, может быть, просто DLL_THREAD_ATTACH/DLL_THREAD_DETACH?
1 голос
/ 07 сентября 2011

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

Если это вызывает проблемы в вашей DLLMain, тогда вам нужно проверьте причину ввода DLL и обработайте соответствующим образом.

...