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