Подтвердить что ты не робот

Является ли MarshalByRefObject особенным?

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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