Плагин работает в отдельном контексте домена приложения. Когда вы выбрасываете исключение, оно затем передается в SandboxExecutionWorkerProcess, который выполняется в другом домене приложения, чем ваш плагин, и вы не знаете, какой у вас тип исключения. Поэтому независимо от того, как вы сериализуете исключение, тип должен быть десериализуемым с другой стороны.
Я бы порекомендовал следующий подход (упаковка исключений):
public abstract class BasePlugin : IPlugin {
protected abstract DoExecute(IServiceProvider serviceProvider);
public void Execute(IServiceProvider serviceProvider) {
try {
this.DoExecute(serviceProvider);
} catch (Exception e) {
throw new InvalidPluginExecutionException(e.ToString());
}
}
}
Если у вас есть фиксированный набор пользовательских типов исключений, вы можете улучшить этот код для обработки только тех. Также имейте в виду, что, делая это, вы предоставляете трассировку стека пользователям CRM - хорошо, если вы разрабатываете плагин только для своей компании, но если вы являетесь независимым разработчиком ПО, вам следует подумать о его скрытии.