前言
第一次接触remoting,尝试了使用代码进行注册通道、注册远程对象、获取远程对象之后,尝试用配置文件方式完成相同的操作,万万没想到,一直不成功,而原因竟然是……
气死我了,上才(dai)艺(ma)!
远程对象
创建了一个空白解决方案,再新建了三个项目,这里是一个类库,用于存放远程对象
创建了一个名为RemoteObj的类,代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace RemoteObject
{
public class RemoteObj:MarshalByRefObject
{
public RemoteObj()
{
Console.WriteLine("RemoteObj构造函数被调用");
}
public string Hello()
{
Console.WriteLine("Hello Server!");
return "Hello,Client!";
}
}
}
服务端
这里是一个控制台应用程序,再在里面新建一个应用程序配置文件,也就是App.config
记得把远程对象这个类库添加引用到服务端哦!
Program.cs代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.Remoting;
namespace Server
{
class Program
{
static void Main(string[] args)
{
RemotingConfiguration.Configure("Server.exe.config", false);
Console.ReadKey();
}
}
}
App.config配置文件如下:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.runtime.remoting>
<application>
<service>
<wellknown mode="SingleCall" type="RemoteObject.RemoteObj,RemoteObject" objectUri="RemoteObj"/>
</service>
<channels>
<channel ref="tcp" port="8090"/>
</channels>
</application>
</system.runtime.remoting>
</configuration>
客户端
这里也是一个控制台应用程序,再在里面新建一个应用程序配置文件,也就是App.config
记得也要把远程对象这个类库添加引用到服务端哦!
Program.cs代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;
using RemoteObject;
namespace Client
{
class Program
{
static void Main(string[] args)
{
try
{
RemotingConfiguration.Configure("Client.exe.config", false);
RemoteObj obj = new RemoteObj();
Console.WriteLine(obj.Hello());
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
Console.ReadKey();
}
}
}
App.config配置文件如下:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.runtime.remoting>
<application >
<client>
<wellknown type="RemoteObject.RemoteObj,RemoteObject" url="tcp://localhost:8090/RemoteObj"/>
</client>
</application>
</system.runtime.remoting>
</configuration>
运行结果
一直不成功的原因
主要是因为配置文件中的wellknown,所谓的知名对象
<wellknown type=“RemoteObject.RemoteObj,RemoteObject” url=“tcp://localhost:8090/RemoteObj”/>
在wellknown中,type的组成是 命名空间.实现类名称,程序集名称,而url中最后的名称也是实现类名称
多唠叨一下……
命名空间,就是远程对象里的那个 namespace后面,就是命名空间,本文中就是RemoteObject。
实现类名称,就是命名空间里的class后面,就是实现类名称,本文中就是RemoteObj。
程序集名称,就是生成dll后的那个名称,再啥都没改的情况下,基本就是跟命名空间、项目名称都是一样的,本文中就是RemoteObject。
另外,贴一下学习来源~