Как обновить развернутую библиотеку классов (DLL)?

#c# #windows-installer #class-library #dll-injection

#c# #windows-установщик #class-library #dll-внедрение

Вопрос:

В настоящее время у меня есть решение на C #, которое содержит библиотеку классов, установщик и проекты настройки. Проект установки генерирует MSI для установки моей библиотеки классов (dll), зарегистрированной vsdrfCOM, на которую ссылается стороннее приложение после установки на клиенте конечных пользователей. У меня нет никакого контроля над сторонним приложением. Все это работает, как ожидалось, и на мою библиотеку классов ссылаются без проблем, и ее можно установить / переустановить через развернутый MSI.

К сожалению, проблема, которую я пытаюсь решить, заключается в том, как применить обновления к библиотеке классов (dll), не ожидая, что конечный пользователь удалит через MSI, загрузит новый MSI и запустит его. Кроме того, есть созданные папки / файлы состояния пользователя, которые я хотел бы поддерживать. По сути, просто перезапишите библиотеку классов (dll). То, к чему я изначально стремился, заключалось в инициализации библиотеки, переходе в удаленное местоположение, проверке версии и загрузке новой библиотеки dll, если это необходимо. Затем сообщите пользователю, что ему необходимо перезапустить стороннее приложение.

  1. Простая загрузка новой библиотеки dll и сохранение старой, похоже, не работает, даже если поддерживаются CLSID, поскольку, похоже, реестру что-то не нравится. Вдохновленный проектом автоматического обновления, расположенным здесь,http://www.codeproject.com/KB/vb/Auto_Update_Revisited.aspx

  2. ClickOnce, похоже, не работает с библиотеками классов, если у вас нет привязанного к нему приложения Forms / Console.

  3. Не уверен, что новый MSI можно загрузить и запустить поверх старого пассивно, не перезаписывая файлы состояния пользователя, упомянутые выше.

Итак, есть ли способ обновить DLL, которая была установлена с MSI, при вышеуказанных условиях?

Спасибо.

Ответ №1:

Что, если ваша библиотека классов состоит из двух .dll, скажем, библиотеки A и B.

Библиотека A предоставляет интерфейс стороннему приложению, но переносит фактическую логику в библиотеку B. Каждый раз, когда загружается библиотека A, она загружает библиотеку B, сначала проверяя наличие более новой версии онлайн и загружая ее, если она доступна. Ваш MSI теоретически может установить только библиотеку A и рассчитывать на загрузку библиотеки B во время выполнения. (Хотя, вероятно, хорошей идеей будет включить и то, и другое на случай отключения подключения к Интернету)

Комментарии:

1. Думаю, я понял концепцию. В моей ситуации взаимодействие может быть обширным, но я могу попробовать ограниченный тест на некоторых методах и посмотреть, получу ли я ожидаемые результаты.