Microsoft® .NET Remoting 提供了一种允许对象通过应用程序域与另一对象进行交互的框架。这种框架提供了多种服务,包括激活和生存期支持,以及负责与远程应用程序进行消息传输的通讯通道。格式化程序用于在消息通过通道传输之前,对其进行编码和解码。应用程序可以在注重性能的场合使用二进制编码,在需要与其他远程处理框架进行交互的场合使用 XML 编码。在从一个应用程序域向另一个应用程序域传输消息时,所有的 XML 编码都使用 SOAP 协议。出于安全性方面的考虑,远程处理提供了大量挂钩,使得在消息流通过通道进行传输之前,安全接收器能够访问消息和序列化流。
using
System;
using
System.Collections.Generic;
using
System.Text;

namespace
Inovout.Remoting.RemotingObject

{

/**//// <summary>
/// 算术运算
/// </summary>
public class Calculator : MarshalByRefObject

{

/**//// <summary>
/// 加法
/// </summary>
/// <param name="addend">加数</param>
/// <param name="augend">被加数</param>
/// <returns>加法结果</returns>
public double Addition(double addend, double augend)

{
return addend + augend;
}


/**//// <summary>
/// 减法
/// </summary>
/// <param name="subtrahend">减数</param>
/// <param name="minuend">被减数</param>
/// <returns>减法结果</returns>
public double Subtration(double subtrahend, double minuend)

{
return subtrahend - minuend;
}


/**//// <summary>
/// 乘法
/// </summary>
/// <param name="multiplicator">乘数</param>
/// <param name="faciend"><被乘法/param>
/// <returns>乘法结果</returns>
public double Multiplication(double multiplicator, double faciend)

{
return multiplicator * faciend;
}


/**//// <summary>
/// 除法
/// </summary>
/// <param name="divisor">除数</param>
/// <param name="dividend">被除数</param>
/// <returns>除法结果</returns>
public double Division(double divisor, double dividend)

{
return divisor / dividend;
}
}
}
//
创建信道
processResultTextBox.Text
+=
"
开始创建信道。
"
+
Environment.NewLine;
TcpChannel serverChannel
=
new
TcpChannel(
8891
);
processResultTextBox.Text
+=
"
创建信道成功。
"
+
Environment.NewLine;

//
注册信道
processResultTextBox.Text
+=
"
开始注册信道。
"
+
Environment.NewLine;
ChannelServices.RegisterChannel(serverChannel,
true
);
processResultTextBox.Text
+=
"
注册信道成功。
"
+
Environment.NewLine;
//
注册远程对象
processResultTextBox.Text
+=
"
开始创建远程对象。
"
+
Environment.NewLine;
RemotingConfiguration.RegisterWellKnownServiceType(
typeof
(Calculator),
"
CalculatorService
"
, WellKnownObjectMode.Singleton);
processResultTextBox.Text
+=
"
创建远程对象成功。
"
+
Environment.NewLine;
//
创建信道
processResultTextBox.Text
+=
"
开始创建信道。
"
+
Environment.NewLine;
TcpChannel clientChannel
=
new
TcpChannel();
processResultTextBox.Text
+=
"
创建信道成功。
"
+
Environment.NewLine;

//
注册信道
processResultTextBox.Text
+=
"
开始注册信道。
"
+
Environment.NewLine;
ChannelServices.RegisterChannel(clientChannel,
true
);
processResultTextBox.Text
+=
"
注册信道成功。
"
+
Environment.NewLine;
//
获取远程对象
processResultTextBox.Text
+=
"
开始获取远程对象。
"
+
Environment.NewLine;
Calculator calculator
=
(Calculator)Activator.GetObject(
typeof
(Calculator),
"
tcp://localhost:8891/CalculatorService
"
);
processResultTextBox.Text
+=
"
获取远程对象成功
"
+
Environment.NewLine;

//
使用对象
processResultTextBox.Text
+=
"
开始使用远程对象。
"
+
Environment.NewLine;
double
firstNumber
=
double
.Parse(firstNumberTextBox.Text.Trim());
double
secondNumber
=
double
.Parse(secondNumberTextBox.Text.Trim());
double
result
=
0
;
switch
(functorComboBox.SelectedIndex)

{
case 0:
result = calculator.Addition(firstNumber,secondNumber);
break;
case 1:
result = calculator.Division(firstNumber,secondNumber);
break;
case 2:
result = calculator.Multiplication(firstNumber,secondNumber);
break;
case 3:
result = calculator.Addition(firstNumber,secondNumber);
break;
}
processResultTextBox.Text
+=
"
远程对象完成计算。
"
+
Environment.NewLine;
resultTextBox.Text
=
result.ToString();
processResultTextBox.Text
+=
"
远程对象计算已经输出成功。
"
+
Environment.NewLine;

//
注销信道
processResultTextBox.Text
+=
"
开始注销信道。
"
+
Environment.NewLine;
ChannelServices.UnregisterChannel(clientChannel);
processResultTextBox.Text
+=
"
注销信道成功。
"
+
Environment.NewLine;
通常,如果没有底层框架的支持,管理远程对象的生存期会非常麻烦。.NET Remoting 提供了许多可供选择的生存期模型,这些模型分为两个类别:
- 客户端激活对象
客户端激活对象受基于租用的生存期管理器的控制,这种管理器确保了租用期满时对象可被回收。
- 服务器激活对象
对于服务器激活对象,开发人员则可以选择“单一调用”模式或“单一元素”模式。
案例介绍:
客户端调用在服务器注册的远程对象Calculate,获得对象后,使用Calulate方法。
- 远程对象









































































- 服务器端















- 客户端













































