Microsoft Remoting 初步研究笔记二三事(针对.NET2.0)

来源:互联网 发布:mac版千牛怎么打单 编辑:程序博客网 时间:2024/04/30 16:25

(一)Remoting的签名反射问题:


制作一个简单的Remoting案例,只要客户端和服务端的签名相同就可以反射获得成员。

程序通过反射机制进行获得对应的值。

1)但是成员必须是公用的public的,而且成员同样也不能是静态,否则。

    An exception occured: 权限被拒绝: 无法远程调用非公共或静态方法。错误。

2)为了Remoting可以反射,客户端的远程类,可以是内部internal的,服务端也可以是Internal的,但是签名的格式必须相同,可见性可以不同。但是服务端一定要public的。

例如:

客户端的:

namespace RemoteOBJ{    internal class ServerObject : ContextBoundObject    {              internal int Add()        {            return 0;        }       public ServerObject()       {           ;       }       public ServerObject(string name, int age)       {           ;       }       public override string ToString()       {           return base.ToString();       }    }}
服务端的:

namespace RemoteOBJ{    internal class ServerObject :ContextBoundObject    {        private int count=0;        internal delegate void AddHandler();        internal event AddHandler OnAdd;        public int Add()        {            this.count+=1000;            return count;        }        public ServerObject()        {        }        private string _name;        private int _age;        public ServerObject(string name,int age)        {            this._name = name;            this._age = age;        }        public override string ToString()        {            return String.Format("Name:{0},Age:{1}", _name, _age);        }    }}

以上的Add是可以使用的,其他的我没有试过。

最低的可见性也得Internal,不可能是private,protected的,因为根本就无法访问嘛。不说也罢。


(二)Remoting事件处理问题

关于Remoting编写事件的时候,和普通的差别有这样四条,而且经常让我们望而生畏的就是出现BUG,但是为什么呢,其实和委托的本质有关,所以C#规定了使用Remoting事件的4个原则,而且我们出错的最多的就是第四个问题(红色部分)。

●   服务器中的远程对象必须声明一个带有方法签名的外部函数(委托),以便客户端在处理程序
中实现这些外部函数。 
●   由于与处理程序函数一起传递给客户端的参数必须是可编组的,因此发送给客户端的所有
数据必须是序列化的。 
●   远程对象也必须声明一个委托函数的实例,委托函数可以通过event关键字更改。客户端将
使用该实例注册处理程序。
●   客户端必须创建一个带有处理程序方法的接收器对象,其中的处理程序方法必须与委托定
义的接受器对象有一样的签名。此外,客户端必须注册接收器对象,这个接收器对象带有
远程对象中的事件。

原理如图:


记住事件基于由于委托属于另外的类,使用EventSink接收器是必须的,要不就会报错。

可以参看:http://www.cnblogs.com/wayfarer/articles/75213.html

后记:设置visio 的构造型(衍类)