Почему-то я предположил, что делегаты, переданные другому AppDomain, превратятся в прокси, как если бы это был объект, производный от MarshalByRefObject
. К сожалению, кажется, что нет.
Скажем, в моем коде у меня есть класс MyClass
вот так:
[Serializable]
public sealed class MyClass
{
public Func<Input, Output> SomeDelegate;
}
[Serializable]
public sealed class Input { ... }
[Serializable]
public sealed class Output { ... }
Теперь мне нужно передать экземпляр MyClass
в другой домен приложения.
Проблема в том, что делегат, хранящийся в SomeDelegate
, может содержать ссылку практически на любой метод, включая потенциально метод экземпляра типа, который не является ни [Serializable]
, ни производным от MarshalByRefObject
.
Ради этого вопроса предположим, что я не могу изменить код, который создает делегат, и не могу сделать MyClass
MarshalByRefObject
. Однако это [Serializable]
.
(Обратите внимание, что если MyClass
содержит поле типа, производного от MarshalByRefObject
, объект, хранящийся в этом поле, будет преобразован в прокси, а остальная часть класса будет сериализована.)
Есть ли что-то, что я могу сделать, что позволит мне передать класс как сериализованный, но с делегатом, превращенным в прокси, как если бы это был MarshalByRefObject
? (Предпочтительно в настройке AppDomain, чтобы мне не нужно было менять MyClass
, но предложения, связанные с изменением класса, также приветствуются, если мне не нужно менять код, создающий делегат.)