У .NET есть вещь, называемая удалением, где вы можете передавать объекты вокруг отдельных областей приложения или даже физических машин. Я не совсем понимаю, как делается магия, поэтому этот вопрос.Является ли MarshalByRefObject особенным?
В удаленных объектах существуют два основных способа передачи объектов: либо они могут быть сериализованы (преобразованы в кучу байтов и перестроены на другом конце), либо они могут наследовать от MarshalByRefObject, и в этом случае .NET делает некоторые прозрачные прокси и все вызовы методов отправляются обратно в исходный экземпляр.
Это очень круто и работает как волшебство. И я не люблю магию в программировании. Глядя на MarshalByRefObject
с отражателем, я не вижу ничего, что бы отличить его от любого другого типичного объекта. Даже не странный внутренний атрибут или что-то еще. Итак, как организована вся прозрачная доверенность? Могу ли я сам создать такой механизм? Могу ли я сделать альтернативный MyMarshalByRefObject
, который не наследовал бы от MarshalByRefObject
, но все равно будет действовать одинаково? Или MarshalByRefObject
получает особое лечение от самого .NET-движка, и весь удаленный подвиг не дублируется простым смертным?
Если .NET Remoting обрабатывает все классы, которые наследуют от MarshalByRefObject особым образом, значит ли это право на «MarshalByRefObject специальная»? Используйте Reflector на .NET Remoting и найдите волшебство. BTW, .NET Remoting устарел, наряду с MarshalByRefObject. Его можно использовать, конечно, но WCF является в настоящее время преобладающей «удаленной архитектурой» в .NET. –
WCF по-прежнему поддерживает MarshalByRefObject – Schneider
Магия находится в дрожании, она относится к классам MBRO специальными. Он больше не имеет прямого доступа к полям в классе, но вместо этого генерирует код для использования вспомогательного метода CLR. Что известно, что объект удален, поэтому он знает, когда нужно создать прокси-вызов. –