创建远程对象类
此过程创建一个简单的远程对象类。它提供了一个名为 Add 的简单方法,用于将两个数字加在一起并返回结果。
1、启动 Visual Studio .NET 并创建一个新的名为 RemoteObject 的 Visual C# 类库项目。
2、使用解决方案资源管理器将 class1.cs 重命名为 Calculator.cs。
3、在 Calculator.cs 中,将 Class1 重命名为 Calculator,并相应地重命名默认的构造函数。
4、从 MarshalByRefObject 派生 Calculator 类,以便使此类成为远程的类。
5、public class Calculator : MarshalByRefObject
6、将下列公共方法添加到 Calculator 类中。
public int Add( int operand1, int operand2 )
{return operand1 + operand2;}
创建一个 Windows 服务宿主应用程序
此过程创建一个 Windows 服务应用程序,用于承载远程对象。当服务启动时,它将配置 TCP 远程信道来侦听客户端请求。
注 此过程使用一个 Installer 类和 Installutil.exe 命令行实用工具来安装 Windows 服务。要卸载此服务,请运行带有 /u 开关的 Installutil.exe。还有另一种方法,可以使用“安装和部署项目”来帮助安装和卸载 Windows 服务。
1、向当前解决方案中添加一个新的名为 RemotingHost 的 Visual C# Windows 服务项目。
2、使用解决方案资源管理器将 Service1.cs.cs 重命名为 RemotingHost.cs。
3、在 RemotingHost.cs 中,将 Service1 类重命名为 HostService,并相应地重命名默认构造函数。
4、在文件顶部,将下列 using 语句添加到现有的 using 语句下。
using System.Runtime.Remoting;
5、定位到 Main 方法,并用下列代码替换初始化 ServicesToRun 变量的现有代码行。
ServicesToRun = new System.ServiceProcess.ServiceBase[] { new HostService() };
7、定位到 InitializeComponent 方法,并将 ServiceName 属性设置为 RemotingHost。
this.ServiceName = "RemotingHost";
8、定位到 OnStart 方法,并添加下列代码行来配置远程处理。到配置文件的完全限定路径将作为启动参数传递给服务。
RemotingConfiguration.Configure(args[0]);
9、将一个新的 C# 类文件添加到此项目,并将其命名为 HostServiceInstaller。
10、添加一个对 System.Configuration.Install.dll 程序集的程序集引用。
11、将下列 using 语句添加到 HostServiceInstaller 顶部现有 using 语句的下面。
using System.ComponentModel;
using System.ServiceProcess;
using System.Configuration.Install;
12、从 Installer 类派生 HostServiceInstaller 类。
public class HostServiceInstaller : Installer
13、在类级添加 RunInstaller 属性,如下所示:
[RunInstaller(true)]
public class HostServiceInstaller : Installer
14、将下列两个私有成员变量添加到 HostServiceInstaller 类。当安装此服务时将使用这些对象。
private ServiceInstaller HostInstaller;
private ServiceProcessInstaller HostProcessInstaller;
15、将下列代码添加到 HostServiceInstaller 类的构造函数。
HostInstaller = new ServiceInstaller();
HostInstaller.StartType = System.ServiceProcess.ServiceStartMode.Manual;
HostInstaller.ServiceName = "RemotingHost";
HostInstaller.DisplayName = "Calculator Host Service";
Installers.Add(HostInstaller);
HostProcessInstaller = new ServiceProcessInstaller();
HostProcessInstaller.Account = ServiceAccount.User;
Installers.Add(HostProcessInstaller);
16、在解决方案管理器内,右
击
RemotingHost
,
添加
app.config
。
<
configuration
>
<
system.runtime.remoting
>
<applicationname="RemoteHostService">
<service>
<wellknowntype="RemoteObject.Calculator, RemoteObject"
objectUri
="RemoteObject.Calculator"
mode
="Singleton"
/>
</service>
<channels>
<channelref="tcp"port="8085">
<serverProviders>
<formatterref="binary"/>
</serverProviders>
</channel>
</channels>
</application>
</
system.runtime.remoting
>
</
configuration
>
创建一个
Windows
帐户来运行服务
1,
创建一个新的名为
RemotingAccount
的本地用户帐户。输入密码并选择
Password never expires
(密码永不过期
)
复选框。
2,
在
Administrative Tools(管理工具
)
程序
组
中,
单击
Local Security Policy(本地安全策略
)
。
(
注:在
windows
命令
输
入
“secpol.msc”
)
3,
使用
Local Security Policy(本地安全策略
)
工具
为
此新
帐户
授予
Log on as a service
(作为服务登录
)
特
权
。
安装
Windows
服务
1,
打开一个命令窗口,并将目录更改到
RemotingHost
项目文件夹下的
Bin/Debug
目录。
运行
installutil.exe
实用工具来安装此服务。
installutil.exe remotinghost.exe
2,
在
Set Service Login
对话框中,输入此前在前一个过程中创建的帐户的用户名和密码,然后单击
OK
。
3,
将
RemoteObject.dll
程序集复制到
RemotingHost
项目输出目录(即
RemotingHost/Bin/Debug
)。
4,
从
Administrative Tools
(管理工具
)
程序组中,启动
Services(服务
) MMC
管理单元。
5,
在
Services (服务
)
列表中,右击
Calculator Host Service(Calculator 宿主服务
)
,然后单击
Properties
。
6,
将到服务的配置文件(
remotinghost.exe.config
)的完整路径输入到
Start parameters
字段。
7,
单击
Start
启动服务。确认服务状态更改为
Started
。
创建一个测试客户端应用程序
将一个名为
RemotingClient
的新
Visual C#
控制台应用程序添加到当前解决方案。
在解决方案资源管理器中,右击
RemotingClient
,然后单击
Set as StartUp Project
。
添加对
System.Runtime.Remoting.dll
程序集的引用。
添加一个对
RemoteObject
项目的项目引用。
将下列
using
语句添加到
class1.cs
顶部的现有
using
语句下。
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;
using RemoteObject;
将下列测试代码添加到
Main
方法中来调用
Windows
服务承载的
Calculator
对象。
TcpChannel chan = new TcpChannel();
ChannelServices.RegisterChannel(chan);
Calculator calc = (Calculator)Activator.GetObject(typeof(RemoteObject.Calculator),
"tcp://localhost:8085/RemoteObject.Calculator");
if (calc == null)
System.Console.WriteLine("Could not locate server");
Else
Console.WriteLine("21 + 21 is : " + calc.Add(21,21) );
运行此客户端应用程序,并确认在控制台输出窗口中显示了正确的结果。