2010-04-27 3 views
47

У .NET есть вещь, называемая удалением, где вы можете передавать объекты вокруг отдельных областей приложения или даже физических машин. Я не совсем понимаю, как делается магия, поэтому этот вопрос.Является ли MarshalByRefObject особенным?

В удаленных объектах существуют два основных способа передачи объектов: либо они могут быть сериализованы (преобразованы в кучу байтов и перестроены на другом конце), либо они могут наследовать от MarshalByRefObject, и в этом случае .NET делает некоторые прозрачные прокси и все вызовы методов отправляются обратно в исходный экземпляр.

Это очень круто и работает как волшебство. И я не люблю магию в программировании. Глядя на MarshalByRefObject с отражателем, я не вижу ничего, что бы отличить его от любого другого типичного объекта. Даже не странный внутренний атрибут или что-то еще. Итак, как организована вся прозрачная доверенность? Могу ли я сам создать такой механизм? Могу ли я сделать альтернативный MyMarshalByRefObject, который не наследовал бы от MarshalByRefObject, но все равно будет действовать одинаково? Или MarshalByRefObject получает особое лечение от самого .NET-движка, и весь удаленный подвиг не дублируется простым смертным?

+1

Если .NET Remoting обрабатывает все классы, которые наследуют от MarshalByRefObject особым образом, значит ли это право на «MarshalByRefObject специальная»? Используйте Reflector на .NET Remoting и найдите волшебство. BTW, .NET Remoting устарел, наряду с MarshalByRefObject. Его можно использовать, конечно, но WCF является в настоящее время преобладающей «удаленной архитектурой» в .NET. –

+1

WCF по-прежнему поддерживает MarshalByRefObject – Schneider

+7

Магия находится в дрожании, она относится к классам MBRO специальными. Он больше не имеет прямого доступа к полям в классе, но вместо этого генерирует код для использования вспомогательного метода CLR. Что известно, что объект удален, поэтому он знает, когда нужно создать прокси-вызов. –

ответ

17

Магия, кажется, в специальном TransparentProxy классе - для .NET время выполнения обрабатывает его особым образом.

Я думаю, что MarshalByRefObject может содержать некоторую дополнительную внутреннюю информацию, которая может оказаться полезной для этого механизма, но я не очень вникал в это.

+0

Статья о RealProxy нарушена (или, по крайней мере, * закрыта *) –

+1

Спасибо за информацию, так же выглядит для меня :-(К сожалению, я не могу найти ее на web.archive.org. Возможно, попробую связаться с автором @ thomas-danecker лично мог бы каким-то образом помочь – akavel

+0

Чтобы быть понятным, MarshalByRefObject и классы, полученные из ARE, особенно похожи на то, что ValueTypes являются особенными: JIT меняет часть своего генерации кода при работе с MarshalByRefObject и отключает определенные оптимизации Когда у вас есть ссылка на любой объект «x», который происходит из MarshalByRefObject, JIT всегда должен учитывать возможность того, что x является TransparentProxy удаленному объекту. Например, встраивание может быть отключено или защищено с помощью проверки, чтобы проверить, «x» является локальным или удаленным первым. – Qwertie

4

Я считаю MarshalByRefObject не все, что особенное. Я считаю, что вся его причина существования заключается в его управлении жизненным циклом и о том, как собирать мусор на сервере. Есть несколько хороших комментариев относительно того, что это касается в документации класса LifetimeServices.

AFAIK, настоящая магия Remoting делается инфраструктуру удаленного взаимодействия самостоятельно при настройке хозяев. MarshalByRefObject не выполняет никакой реальной работы по сортировке файлов через AppDomains.

+1

В моем случае мне нужно только общаться через границы AppDomain (и это только потому, что мне нужно выгрузить управляемый .DLL). Это делает Remoting привлекательным, потому что он настолько прост в использовании. –

+0

ОК, в любом случае, если MarshalByRefObject не является ключевым для всего процесса, что это такое? Что именно создает мистические прокси и т. Д.? –

+0

Взгляните на RemotingConfiguration.RegisterWellKnownServiceType().Мне пришлось искать его, потому что я забыл все о Remoting, потому что я перешел на WCF 2 года назад. WCF может делать все, что вы хотите. Вы также найдете больше ресурсов для этого. Я чувствую себя старым китайцем из «Гремлинов», который предупреждает ребёнка о его решении, но ребенок идет вперед и кормит вещь в любом случае ... –

Смежные вопросы