Необходимо загрузить пользовательский сценарий или любой внешний сторонний плагин в другом домене приложения, чтобы можно было безопасно выгружать домен в случае возникновения неисправимой ошибки.
Необходимо создать другой AppDomain
поскольку вы не можете выгрузить сборку из загруженного домена и не хотите завершать работу основного домена приложения.
Вы создаете новый домен приложения, например:
var scriptDomain = AppDomain.CreateDomain("User Scripts");
ВыЗатем можно загрузить любой тип из сборки, которую вам нужно создать.Вы должны быть уверены, что загружаемый вами объект наследуется от MarshalByRefObject
.
Я предполагаю, что ваш пользовательский скрипт заключен в объект, определенный следующим образом:
public abstract UserScriptBase : MarshaByRefObject
{
public abstract void Execute();
}
Вы можетепоэтому загрузите любой пользовательский скрипт, подобный следующему:
object script = domain.CreateInstanceFromAndUnwrap(type.Location, type.FullName);
После всего этого вы можете подписаться на scriptDomain.UnhandledException
и отслеживать любую неисправимую ошибку.
Использовать другой домен приложения не просто ивы, скорее всего, столкнетесь с некоторой проблемой загрузки / выгрузки (на DLL ссылаются оба домена).
Я рекомендую вам некоторый учебник , который вы можете найти в Интернете.