Подтвердить что ты не робот

Могу ли я сообщить CLR для маршалирования неизменяемых объектов между AppDomains по ссылке?

При маршалировании объектов между AppDomains в .NET CLR будет либо сериализовать объект (если он имеет атрибут Serializable), либо он будет генерировать прокси (если он наследует от MarshalByRef)

С помощью строк, однако, CLR просто передаст ссылку на объект string в новый AppDomain. CLR по-прежнему обеспечивает целостность, так как строки .NET неизменяемы, и любое изменение второго AppDomain в строке не будет влиять на исходный объект.

Это подводит меня к моему вопросу: есть ли способ сообщить CLR, что мой пользовательский тип неизменен и при использовании в удалении он должен просто передать ссылку на объект так же, как и со строковым классом?

4b9b3361

Ответ 1

Маршаллинг на самом деле довольно сложный.

Поведение, которое вы описываете, называется "marshal-by-bleed", среда выполнения использует его для маршалирования строк (иногда) и маршала System.Threading.Thread ALLWAYS.

Насколько я могу судить, вы не контролируете это (упомянутое в статье, что вы можете определить собственное поведение сортировки, но я не могу найти на нем никакой документации), вы могли бы потенциально передать IntPtr вокруг и использовать небезопасный код чтобы имитировать это, но он пахнет огромным взломом.

Ответ 2

Я так не думаю, нет. Я считаю, что это, подобно примитивам, обрабатывается непосредственно средой выполнения.

Ответ 3

У вас есть только две семантики маршалинга в .NET Remoting: маршал по значению (SerializableAttribute) и маршал по ссылке (MarshalByRef).

Как вы указали, строки маршалируются по значению, так как System.String украшена атрибутом SerializableAttribute.

Если вы хотите передать свой объект между доменами приложения, и вы хотите просто копию (никакие изменения в объекте в удаленном домене приложения не влияют на объект в локальном домене приложения), то вы хотите использовать SerializableAttribute на ваш класс.

Надеюсь, что это поможет.