.NET Remoting
Summary
.NET remoting enables client applications to use objects in other processes on the same computer or on any other computer available on its network. You can also use .NET remoting to communicate with other application domains in the same process. .NET remoting provides an abstract approach to interprocess communication that separates the remotable object from a specific server and client process and from a specific mechanism of communication. As a result, it is flexible and easily customizable.
Application Domain
Application domains provide a unit of isolation for the common language runtime. They are created and run inside a process. Application domains are usually created by a runtime host, which is an application responsible for loading the runtime into a process and executing user code within an application domain. The runtime host creates a process and a default application domain, and runs managed code inside it. Runtime hosts include NET, Microsoft Internet Explorer, and the Windows shell.
See also:
.NET Remoting
- Набор сервисов, позволяющих взаимодействовать приложениям,
- Находящимся на одном PC
- Находящимся на разных PC одной LAN
- Находящимся в самых разных уголках мира, разных сетях и разных средах
- Обеспечивают взаимодействие между различными объектами из разных
AppDomains
или процессах, поддерживая
- Разные транспортные протоколы
- Разные форматы сериализации
- Различные жизненные циклы объектов
- Различные режимы создания объектов
CLR host
- Common Language Runtime (CLR) является средой с такими сервисами как garbage collection, security, language-neutrality...
- Исполняемый файл .NET нуждается во вспомогательном коде, который стартует CLR
- exe stub, Service, NET ISAPI, IE 5.01+, Yukon
- Чтобы запустить managed code, CLR Host должен получить указатель на т.н. Application Domain (AppDomain?)
- Обычно такой
AppDomain
создается по умолчанию
-
AppDomains
могут создаваться из кода
Изоляция
- Managed code должен пройти проверку перед тем, как исполняться в CLR
- Код, прошедший такой тест, считается type-safe
- Наличие type-safe кода позволяет CLR обеспечить уровень изоляции аналогичный изоляции процессов, но более эффективный
- CLR обеспечивает изоляцию запрещая прямые вызовы между объектами из разных
AppDomains
- .NET Remoting является набором сервисов для взаимодействия между доменами
Marshalling
- Marshal by value
- Экземпляр объекта создается на клиенте и наполняется данными, приходящими от сервера
- Состояние объекта передается
- Marshal by reference
- Объект постоянно находится на сервере
- Все вызовы к объекту происходят удаленно
- Входные и возвращаемые параметры передаются по сети
Marshal By Reference
Remote Components
- Наследуются от
System.MarshalByRefObject
- Public методы
- Работа с
serializable
классами
- Выбор Application Host-а
- IIS, NT service, custom app
- Публикация remote components
Приготовления на стороне клиента
- Необходима метаинформация об удаленном объекте
- Регистрация канала взаимодействовия
- Регистрация удаленного типа как well-known типа
- Сообщает CLR о том, что тип удален
- JIT компилятор преобразует локальные вызовы в удаленные «на лету»
- Все происходит прозрачно
- Объекты создаются оператором
new
или методами GetObject
, CreateInstance
Активация объекта
- Server-activated objects (Удаленными объектами управляет сервер. Например, такие объекты активируются не раньше вызова их методов)
-
SingleCall
(при каждом вызове создается отдельный экземпляр объекта)
-
Singleton
(состояние сохраняется между вызовами)
- Client-activated object (CAO) (Управление объектом делегировано клиенту и состояние между вызовами сохраняется в рамках работы одного клиента)
Примеры создания и использования
Клиент
TcpChannel chan = new TcpChannel(8085);
ChannelServices.RegisterChannel(chan);
RemotingConfiguration.RegisterWellKnownServiceType
(Type.GetType("CSRemotingSamples.HelloServer,object"),
"SayHello", WellKnownObjectMode.SingleCall);
Сервер
TcpChannel chan = new TcpChannel();
ChannelServices.RegisterChannel(chan);
WellKnownClientTypeEntry remotetype = new
WellKnownClientTypeEntry(typeof(HelloServer),
"tcp://localhost:8085/SayHello");
RemotingConfiguration.RegisterWellKnownClientType(remotetype);
HelloServer obj = new HelloServer();
Использование файла настроек
Необходимый код (server.cs)
RemotingConfiguration.Configure( "server.exe.config" );
Файл настроек (server.exe.config)
<configuration>
<system.runtime.remoting>
<application name="server">
<service>
<wellknown mode="Singleton"
type="CSRemotingSamples.HelloServer, object"
objectUri="SayHello" />
</service>
<channels>
<channel ref="tcp" port="1234" />
</channels>
</application>
</system.runtime.remoting>
</configuration>
Сборки
See also:
Links
--
AndreyUstyuzhanin - 06 Apr 2004