Могу ли я сообщить CLR для маршалирования неизменяемых объектов между AppDomains по ссылке?
При маршалировании объектов между AppDomains в .NET CLR будет либо сериализовать объект (если он имеет атрибут Serializable
), либо он будет генерировать прокси (если он наследует от MarshalByRef
)
С помощью строк, однако, CLR просто передаст ссылку на объект string в новый AppDomain. CLR по-прежнему обеспечивает целостность, так как строки .NET неизменяемы, и любое изменение второго AppDomain в строке не будет влиять на исходный объект.
Это подводит меня к моему вопросу: есть ли способ сообщить CLR, что мой пользовательский тип неизменен и при использовании в удалении он должен просто передать ссылку на объект так же, как и со строковым классом?
Ответы
Ответ 1
Маршаллинг на самом деле довольно сложный.
Поведение, которое вы описываете, называется "marshal-by-bleed", среда выполнения использует его для маршалирования строк (иногда) и маршала System.Threading.Thread ALLWAYS.
Насколько я могу судить, вы не контролируете это (упомянутое в статье, что вы можете определить собственное поведение сортировки, но я не могу найти на нем никакой документации), вы могли бы потенциально передать IntPtr вокруг и использовать небезопасный код чтобы имитировать это, но он пахнет огромным взломом.
Ответ 2
Я так не думаю, нет. Я считаю, что это, подобно примитивам, обрабатывается непосредственно средой выполнения.
Ответ 3
У вас есть только две семантики маршалинга в .NET Remoting: маршал по значению (SerializableAttribute) и маршал по ссылке (MarshalByRef).
Как вы указали, строки маршалируются по значению, так как System.String украшена атрибутом SerializableAttribute.
Если вы хотите передать свой объект между доменами приложения, и вы хотите просто копию (никакие изменения в объекте в удаленном домене приложения не влияют на объект в локальном домене приложения), то вы хотите использовать SerializableAttribute на ваш класс.
Надеюсь, что это поможет.