Онлайн обновление приложения DLL - PullRequest
1 голос
/ 05 июля 2011

У меня есть подключаемое приложение, которое представляет собой C ++ DLL, работающую внутри (чужого) хоста C ++.Я хочу разрешить онлайн-обновления плагина.Как я могу это сделать?

Один из возможных способов состоит в том, чтобы отделить DLL от DLL-оболочки и DLL-библиотеки содержимого и переходить на новую DLL-библиотеку содержимого при каждом обновлении.

Есть ли что-нибудь лучше?способ достичь этого?

Спасибо

Ответы [ 3 ]

0 голосов
/ 05 июля 2011

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

В Windows (предполагается, что Windows, так как вы сказали DLL), вывозникли проблемы, поскольку вы не можете заменить исполняемый образ (включая DLL) другим, пока он загружен в память.В POSIX это не будет проблемой (и даже надежно работает без каких-либо побочных эффектов!), Но Windows заблокирует образ для монопольного доступа.

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

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

0 голосов
/ 05 июля 2011

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

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

0 голосов
/ 05 июля 2011

Если у вас нет контроля над хостом, то вы должны выполнять динамическую загрузку / выгрузку самостоятельно. Как вы правильно заметили, для этого вам понадобятся две библиотеки DLL. Это, вероятно, самый простой способ, но вы должны убедиться, что хост не может причинить вреда во время обмена DLL. Самое простое решение, вероятно, состоит в том, чтобы загрузить обе библиотеки DLL и затем выполнить атомарное переключение между ними перед выгрузкой старого кода.

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