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

StackOverflow https://stackoverflow.com/questions/824912

Вопрос

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

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

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

Это было полезно?

Решение

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

Поведение, которое вы описываете, называется «marshal-by-bleed», среда выполнения использует его для маршалинга строк (иногда) и маршала System.Threading.Thread ВСЕГДА.

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

Другие советы

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top