Как подсказывает @Alejandro в комментариях, возможный обходной путь - создать класс.Я построил это решение:
class DelegateAdapter<T> : MarshalByRefObject
{
Action<T> localHandler;
public DelegateAdapter(Action<T> localHandler)
{
this.localHandler = localHandler;
}
public void RemoteHandler(T value) => localHandler(value);
}
И его можно использовать так:
[Serializable]
delegate void MyCustomDelegate(SomeType arg);
MyCustomDelegate dlg = new DelegateAdapter<SomeType>(arg => { ... }).RemoteHandler;
Делегат является сериализуемым.Его цель - MarshalByRefObject
в вызывающем процессе, который может делать все, что вы захотите.