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

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

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

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

Ответы [ 3 ]

7 голосов
/ 06 мая 2009

Marshalling на самом деле довольно сложно .

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

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

1 голос
/ 05 мая 2009

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

0 голосов
/ 06 мая 2009

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

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

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

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

...