Эта статья является зеркальной статьёй машинного перевода, пожалуйста, нажмите здесь, чтобы перейти к оригиналу.

Вид: 59779|Ответ: 9

[Источник] «Динамическая замена» для .NET плагинов

[Скопировать ссылку]
Опубликовано 2021-8-15 21:55:14 | | |
Представьте ситуацию, когда наша сервисная система предоставляет ряд функциональных сервисов, и в будущем будут добавлены новые функциональные сервисы, и функциональные сервисы могут потребоваться изменения или удаление. Распространённым базовым требованием к такой сервисной системе является нельзя остановить работу сервисной системы при добавлении/удалении/обновлении функциональных сервисов. Обычно «плагины горячей замены» можно реализовать очень просто, инкапсулируя каждый сервис в DLL плагинов, но «горячая замена» («динамическая замена») плагинов становится проблемой. Причина в том, что когда мы удаляем плагин Dll из сервисной системы, сервисная система всё ещё сохраняет базовую ссылку на DLL, и если вы попытаетесь удалить или перезаписать DLL, Windows появляется сообщение вроде «используется DLL».

Так как же решить эту проблему? Думаю, есть как минимум два варианта:

(1) Используйте AppDomain. Загрузка плагинов в новый AppDomain и удаление AppDomain чисто удаляет DLL плагина из сервисной системы. Недостаток такого подхода в том, что нужно управлять множеством AppDomains (потому что у вас очень много функциональных сервисов), а коммуникация между AppDomains происходит удалённо, что добавляет множество ненужных головных болей в нашу систему. Если интересно, можете попробовать и этот вариант, а я предпочитаю второй.

(2) Скопировать плагин Dll в память, а затем загрузить его в память. Таким образом, DLL-файлы на жёстком диске могут быть перезаписаны или удалены по желанию. Ранее мы загружали плагин Dll прямо с жёсткого диска, вот так:

Теперь нам нужно повернуть за новый угол:


Это решает проблему «динамической замены» плагинов.





Предыдущий:Spring Cloud записывает все логи интерфейса запросов в MongoDB
Следующий:.NET/C# преобразует подчеркнутые имена полей в крупные формы горба
Опубликовано 15.08.2021 23:11:28 |
Такой большой проект, лучше перезапустить сервер ночью...
Опубликовано 17.08.2021 14:43:41 |
Спасибо, что поделились!~'
Опубликовано 2021-9-16 18:25:58 |
Ответы тестов
Опубликовано 2021-9-17 21:39:18 |
Учитесь
Опубликовано 18.09.2021 19:05:29 |
Последний раз этот пост был отредактирован fyxh66 18.09.2021, 19:07

System.BadImageFormatException:“未能加载文件或程序集“12505088 bytes loaded from 3.3hook, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null”或它的某一个依赖项。试图加载格式不正确的程序。”IL 格式不正确。
  • var dll = Assembly.Load(addinStream);
86 тоже пытался, но не @小slag У босса есть время помочь осмотреть
 Хозяин| Опубликовано 18.09.2021 22:08:32 |
fyxh66 опубликовано 2021-9-18 19:05
System.BadImageFormatException:“未能加载文件或程序集“12505088 bytes loaded from 3.3hook, Version=1 ...

С такой проблемой не сталкивался.

Существует две ситуации, когда возникает исключение System.BadImageFormatException: целевая платформа программы несогласована> системная платформа опорного dll-файла несогласована.

Проверьте: Являются ли .NET-версии основной программы и плагин-dlls последовательны, а целевая платформа — последовательными, или DLL-файлы не разработаны на .net?
Опубликовано 2021-9-19 16:17:56 |
Опубликовано 2021-9-18 22:08
С такой проблемой не сталкивался.

Существует две ситуации, когда возникает исключение System.BadImageFormatException: целевая платформа программы несогласована > эталонной dll ...

Да, c++ dll...
 Хозяин| Опубликовано 2021-9-19 17:01:33 |

Это определённо плохо, динамический плагин здесь может загружать только .NET DLL, а DLL, вызывающие C++, не настраиваются таким образом
Опубликовано 2021-9-19 18:54:53 |
Сяочжа Опубликовано 2021-9-19 17:01
Это определённо плохо, динамический плагин здесь может загружать только .net DLL, а DLL, вызывающие C++, не настроены так...

Есть ли способ вызвать dll в C++, используя напрямую байт байта[] dll для вызова методов внутри?
Отказ:
Всё программное обеспечение, программные материалы или статьи, публикуемые Code Farmer Network, предназначены исключительно для учебных и исследовательских целей; Вышеуказанный контент не должен использоваться в коммерческих или незаконных целях, иначе пользователи несут все последствия. Информация на этом сайте взята из Интернета, и споры по авторским правам не имеют отношения к этому сайту. Вы должны полностью удалить вышеуказанный контент с компьютера в течение 24 часов после загрузки. Если вам нравится программа, пожалуйста, поддержите подлинное программное обеспечение, купите регистрацию и получите лучшие подлинные услуги. Если есть нарушение, пожалуйста, свяжитесь с нами по электронной почте.

Mail To:help@itsvse.com