Динамически загружать класс из библиотеки и использовать его после закрытия библиотеки

TL; DR: Можно ли загрузить объект класса из библиотеки во время выполнения, закрыть библиотеку и затем использовать объект как "нормальный" объект (после закрытия)?

Я пытаюсь внедрить подключаемую систему с какой-то функцией "горячей замены". Предположим, что моя программа ожидает от своих плагинов функции doSomething(). Моей идеей было бы сканировать файловую систему для любых libs в определенной папке, извлекать функции и затем закрывать lib (перед использованием функций!). Таким образом, поток монитора может просто отслеживать изменения в файловой системе и reset указателя функции в случае, если что-то изменилось, и, таким образом, плагины могут быть "горячими".

Я считаю, что указатель функции станет недействительным, как только я закрою библиотеку (это так?). Поэтому моя идея - позволить библиотеке вернуть копию объекта, который выполняет желаемую функциональность. В этом случае я бы назвал lib для создания объекта перед его закрытием и сохранил копию объекта в моей программе. Однако, поскольку объект может использовать другие объекты/функции библиотеки, я не уверен, будет ли это работать, поскольку эти объекты/функции не будут доступны, не так ли?

2 ответа

  • Вы не можете скопировать объект и закрыть библиотеку, поскольку копируются только данные, но не код этих объектов. Вместо этого OS загружает код библиотеки в память, и все указатели на функции указывают на эту область памяти. Что будет, если ОС выгрузит библиотеку?

  • Вы можете реализовать что-то вроде этого. У вас может быть объект Proxy, содержащий указатель на текущую загруженную реализацию. Если обнаружена новая библиотека, вы можете загрузить новую библиотеку, создать экземпляр новой реализации, удалить старый экземпляр реализации, закрыть старую библиотеку. Таким образом, вы реализуете механизм "горячей замены" и избегаете проблем с кодом разделяемых библиотек.

  • Если вы выбрали способ, описанный в пункте 2, остерегайтесь проблем concurrency (что, если другой поток назначен при удалении старой реализации, но до изменения указателя?).


Объект - это данные, а не код. Копия объекта - это копия данных, но она по-прежнему относится к исходному коду. Как только вы выгрузите динамическую библиотеку, ее код исчезнет из памяти, и любые объекты, все еще ссылающиеся на этот код (например, тип, предоставляемый библиотекой), будут в затруднении, как только их попросят выполнить функцию-член (например, как деструктор).

Нет, невозможно выгрузить библиотеку и продолжать использовать ее код.

licensed under cc by-sa 3.0 with attribution.