Является ли MarshalByRefObject особенным?
У .NET есть вещь, называемая удалением, где вы можете передавать объекты между отдельными приложениями или даже физическими машинами. Я не совсем понимаю, как это делается, поэтому этот вопрос.
В удалении есть два основных способа передачи объектов: либо они могут быть сериализованы (преобразованы в кучу байтов и перестроены на другом конце), либо они могут наследовать от MarshalByRefObject, и в этом случае .NET делает некоторые прозрачные прокси, а все вызовы методов отправляются обратно в исходный экземпляр.
Это довольно круто и работает как волшебство. И я не люблю магию в программировании. Глядя на MarshalByRefObject
с помощью Reflector, я не вижу ничего, что бы отличить его от любого другого типичного объекта. Даже не странный внутренний атрибут или что-то еще. Итак, как организована вся прозрачная доверенность? Могу ли я сам создать такой механизм? Могу ли я сделать альтернативный MyMarshalByRefObject
, который не наследует от MarshalByRefObject
, но все равно будет действовать одинаково? Или MarshalByRefObject
получает специальное лечение от самого .NET-движка, и весь удаленный ум не дублируется простым смертным?
Ответы
Ответ 1
Магия, кажется, находится в специальном классе TransparentProxy
-.NET Runtime обрабатывает ее особым образом.
Я думаю, что MarshalByRefObject
может содержать некоторую дополнительную внутреннюю информацию, которая может быть полезна для этого механизма, но я не очень много думал об этом.
Ответ 2
Я считаю, что MarshalByRefObject не так уж особенный. Я считаю, что вся его причина существования заключается в его управлении жизненным циклом и том, как он собирает мусор на сервере. Есть несколько хороших комментариев относительно того, что это касается в LifetimeServices.
AFAIK, реальная магия дистанции осуществляется самой удаленной инфраструктурой при настройке хостов. MarshalByRefObject не выполняет никакой реальной работы по сортировке файлов через AppDomains.