Могу ли я указать CLR маршалировать неизменяемые объекты между доменами приложений по ссылке?
Вопрос
При маршалинге объектов между доменами приложений в .NET CLR либо сериализует объект (если он имеет атрибут Serializable
), либо генерирует прокси (если он наследуется от MarshalByRef код>)
Однако со строками CLR просто передаст ссылку на строковый объект в новый домен приложений. CLR по-прежнему обеспечивает целостность, поскольку строки .NET являются неизменяемыми, и любое изменение вторым AppDomain строки не повлияет на исходный объект.
Что подводит меня к моему вопросу: есть ли способ сообщить CLR, что мой пользовательский тип является неизменяемым, и при использовании в удаленном взаимодействии он должен просто передавать ссылку на объект, как это происходит с классом строки?
Решение
Маршаллинг на самом деле довольно хитрый . Р>
Поведение, которое вы описываете, называется «marshal-by-bleed», среда выполнения использует его для маршалинга строк (иногда) и маршала System.Threading.Thread ВСЕГДА. Р>
Насколько я могу судить, вы не можете контролировать это (в статье упоминается, что вы можете определить пользовательское поведение маршаллинга, но я не могу найти какую-либо документацию по нему), вы могли бы потенциально передать IntPtr и использовать небезопасный код. чтобы имитировать это, но это пахнет как огромный взлом для меня. Р>
Другие советы
Я так не думаю, нет. Я считаю, что это, как и примитивы, обрабатывается непосредственно средой выполнения.
У вас есть только две семантики маршалинга в .NET Remoting: маршал по значению (SerializableAttribute) и маршал по ссылке (MarshalByRef).
Как вы уже упоминали, строки сортируются по значению, поскольку System.String имеет атрибут SerializableAttribute.
Если вы хотите передать свой объект между доменами приложения и хотите получить только копию (никакие изменения в объекте в удаленном домене приложения не влияют на объект в локальном домене приложения), то вам нужно использовать атрибут SerializableAttribute для ваш класс.
Надеюсь, это поможет.