1. 新创建一个c#类库(如:ContextBoundType)。这将创建一个我们的.NET Remote客户端和服务器端用来通讯的“共享命令集”。
2. 我们可以在刚创建的类库里将类名该成ContextBoundType,并对该对串行化([Serializable]),以便能作为被远程调用的.NET Remote对象的返回类型,原因是该对象将被转换为通过网络传输的原始数据,然后在网络的另一端再被装配成一个对象。
3. 添加一个要处里的引用DLL,然后完成服务器端数据库操作全部完成所需要的所有工作。(如做了一个对数据库的操作方法:GetData(string DataType))等。
4. 完成所有需要完成的调用。然后编译生成一个动态库DLL。
第二步:创建Server对象
1. 新创建一个c#的控制台应用程序(如:SuperServer)
2. 再添加对刚才在第一步中所创建的DLL文件的应用,该应用程序才能正确地运行。
3. TcpServerChannel channel = new TcpServerChannel(8080); TcpServerChannel是.NET remoting支持的二种信道类型中的一种,它将设置我们希望我们的对象对来自哪一个端口的请求进行回应,然后ChannelServices.RegisterChannel(channel); ChannelServices.RegisterChannel将把该端口号与操作系统中的TCP/IP栈绑定。
4. RemotingConfiguration.RegisterWellKnownServiceType(typeof(ContextBoundType),
"ContextBoundType", WellKnownObjectMode.SingleCall);解释:这行代码设置了服务中的一些参数和把欲使用的对象名字与远程对象进行绑定,第一个参数是绑定的对象,第二个参数是TCP或HTTP信道中远程对象名字的字符串,第三个参数让容器知道,当有对对象的请求传来时,应该如何处理对象。尽管WellKnownObjectMode.Single对所有的调用者使用一个对象的实例,但它为每个客户生成这个对象的一个实例。
5. 完整代码如下:
using System.Runtime;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;
using System.Data.SqlClient;
using DotNetRemoteTest;
namespace ServerServer
{
public class SuperServer
{
public static void Main(String[] args)
{
TcpServerChannel channel = new TcpServerChannel(8080);
ChannelServices.RegisterChannel(channel);
RemotingConfiguration.RegisterWellKnownServiceType(typeof(ContextBoundType),
" ContextBoundType ", WellKnownObjectMode.SingleCall);
System.Console.WriteLine("Press Any Key");
System.Console.ReadLine();
}
}
}
6. 检查没有错误后编译该程序,生成一个EXE文件。并注意该EXE文件的位置
第三步:创建Remote客户端程序
1.该程序是我们为对在上面创建的SuperServer远程对象进行测试而创建的,新建一个工程,该工程类型不限,这里就创建一个WINFORM ,并像第二步一样将第一步生成的DLL引用进来。
2. 下面的代码中有二行对于.NET remoting而言是特别重要的。第一行创建了一个TCP客户端信道,该信道并不是绑定在一个端口上的;第二行获取了一个对远程的ContextBoundType对象的引用。Activator.GetObject方法返回一个对象类型的值,我们随后会将它返回的值赋予ContextBoundType。我们传给它的参数与在服务器工程中传递给RemotingConfiguration的参数非常地相似,第一个参数是对象类型的,第二个参数是远程对象的URI。该地址有个端口号,此端口号是第二步服务器注册的端口号, localhost代表本机,如果是网络测试则应该是应行第二步生成的EXE文件的主机名称,ContextBoundType代表第二步RegisterWellKnownServiceType的第二个参数也就是TCP或HTTP信道中远程对象名字的字符串,
ChannelServices.RegisterChannel(new TcpClientChannel());
ContextBoundType loader = (ContextBoundType)Activator.GetObject(
typeof(ContextBoundType), "tcp://localhost:8080/ContextBoundType");
3.然后再根据实际情况对ContextBoundType拥有的方法进行调用。
4.一切工完成后编译测试,先执行第二步作的EXE文件进行测试。