Вы когда нибудь пользовались созданием дополнительных
доменов? Если да опишите вкратце зачем это Вам понадобилось и что из этого получилось.
Здравствуйте, igor-booch, Вы писали:
IB>Вы когда нибудь пользовались созданием дополнительных доменов? Если да опишите вкратце зачем это Вам понадобилось и что из этого получилось.
Пользовался. Пришлось использовать домен для загрузки плагинов.
Дело в том, что если загружать сборки в основной домен, то выгрузить их потом уже нельзя.
Поэтому создавался второй домен, туда грузились сборки, а по завершении убивался весь домен.
Здравствуйте, igor-booch, Вы писали:
IB>Вы когда нибудь пользовались созданием дополнительных доменов? Если да опишите вкратце зачем это Вам понадобилось и что из этого получилось.
Использовали для реализации скриптового языка в нашей программе.
Результат скармливался типам из System.CodeDom.Compiler (давно было, не помню точно) и в итоге у нас получался динамически созданный код, который можно было выполнять.
И тут две проблемы:
1) Когда скрипт выполнен (допустим, после набора очередной строчки кода) сгенерированные классы больше не нужны — всё это добро нужно выгрузить из памяти. Решение: выгружаем домен.
2) Мы не хотим, чтобы пользователь (или злоумышленник подсунуть ему) мог написать код форматирования диска или вызвать какие-то сторонние нативные компоненты и т.п. — эти и другие ограничения (много их было, все не помню) мы и можем задать для конкретного домена.
Грабли:
1) Иногда не удавалось выгрузить домен, код падал с ошибкой. Не помню почему, но вроде решил эту проблему. А может и проблемы такой не было.
2) С обработкой/пробросом исключений были проблемы — но решение, кажется, было стандартное.
3) Нужно заморачиваться с "маршалингом типов" или как это называется между доменами.
В общем как-то так.
Здравствуйте, igor-booch, Вы писали:
IB>Если да опишите вкратце зачем это Вам понадобилось и что из этого получилось.
Есть такая штука —
NServiceBus. У нее есть проблема — она рассчитана одновременно только на один вид транспорта. Т.е. в рамках одного процесса можно посылать/получать сообщения либо только по MSMQ, либо только по RabbitMQ etc. Это все потому, что все настройки, а также сам экземпляр шины — статические переменные.
Иногда нужно переложить сообщения из RabbitMQ, например, в Azure Queue.
Вот тогда приходится поднимать отдельный инстанс шины в отдельном AppDomain-е и маршализовать туда сообщения.
Получилось