Я пишу архитектуру плагина для планировщика автоматизации, который должен быть надежным, поэтому я пытаюсь выполнить ASP.NET/IIS-стиль AppDomains - то есть каждый AppDomain является действительно рассматривается как свое собственное приложение без общих объектов между ними.Полная изоляция сборки AppDomain в ASP.NET
Я устанавливаю ApplicationBase
, ConfigurationFile
и ShadowCopyFiles
в AppDomainSetup
.
В планировщике автоматизации есть одна общая сборка, которую я загружаю для каждого плагина - он обрабатывает основную сборку плагина, захватывает неперехваченные исключения и регистрирует. Есть несколько недостатков этого подхода, который я идентифицировал:
Устанавливая
ApplicationBase
где плагин хранится, все зависимости от общей сборки (который находится в другом пути) не будет больше не решены , Я как-то взломал это на работу, подключив событиеAssemblyResolve
, но это приводит к другим проблемам.Возможно, что как общая сборка, так и плагин ссылаются на свои собственные копии одноименной сборки - возможно, каждая из них имеет другую версию. Или, может быть, сборка с тем же именем, но совершенно другое содержимое. Переопределяя
AssemblyResolve
, копия плагина всегда будет загружена первой.Не очень беспокоиться об этом, но с точки зрения безопасности. Я понимаю, что плагин может переопределить зависимость планировщика, заставляя его делать что-то нехорошее или отражать общую сборку и получать внутренности.
Так что я решил, что, пожалуй, единственный способ сделать это правильно, это просто не сделать это - заставить четкое разделение, а не загружать любые сборки в AppDomain. Я не совсем уверен, что лучший способ сделать это, или даже если это лучший подход.
Как вы думаете?