.NET имеет вещь, названную дистанционной работой, куда можно раздать объекты между отдельным appdomains или даже реальными машинами. Я не полностью понимаю, как волшебство сделано, следовательно этот вопрос.
В дистанционной работе существует два основных способа раздать объекты - любой, который они могут быть сериализированы (преобразованный в набор байтов и восстановленного в другом конце), или они могут наследоваться MarshalByRefObject, в этом случае.NET делает некоторые прозрачные прокси, и все вызовы метода передаются назад исходному экземпляру.
Это довольно прохладно и работает как волшебство. И мне не нравится волшебство в программировании. Взгляд на MarshalByRefObject
с Отражателем я не вижу ничего, что установило бы его кроме любого другого типичного объекта. Даже странный внутренний атрибут или что-либо. Таким образом, как целая прозрачная вещь прокси организована? Я могу сделать такой механизм сам? Я могу сделать альтернативу MyMarshalByRefObject
который не наследовался бы MarshalByRefObject
но все еще действовал бы то же? Или MarshalByRefObject
получение некоторого специального режима самим механизмом.NET и целым подвигом дистанционной работы является non-duplicatable простыми смертными?
Магия, похоже, заключена в специальном классе TransparentProxy
- среда выполнения .NET обрабатывает его особым образом.
Я думаю, что MarshalByRefObject
может содержать некоторую дополнительную внутреннюю информацию, которая может быть полезна для этого механизма, но я не особо разбирался в этом.
Я считаю, что в MarshalByRefObject нет ничего особенного. Я считаю, что вся причина его существования кроется в управлении временем его существования и в том, как он собирает мусор на сервере. Есть несколько хороших комментариев по этому поводу в документации класса LifetimeServices .
Насколько я понимаю, настоящая магия удаленного взаимодействия выполняется самой инфраструктурой удаленного взаимодействия, когда вы настраиваете хосты. MarshalByRefObject не выполняет реальной работы по маршаллингу материалов между доменами приложений.