我在类的构造函数中加了一个MessageBox,在服务器端会显示两遍

解决方案 »

  1.   

    只有SingleCall对象才有这个问题。
    由于Remoting采用的是Lazy Object Activation,只有到了Client第一次请求调用对象方法的时候Server才实际创建对象。所以第一次的Remoting调用可以分为两部分:
    1) Client向Server请求对象的描述ObjRef,并且生成相关的PRoxy(RealProxy和TransparentProxy)。
    2) 通过Proxy实际调用远程对象的方法。而对Server来说,在第一次请求的时候才实际的创建一个ObjRef,并返回给Client,查查MSDN就可以知道,要创建一个ObjRef的唯一方法是先创建一个Remote Object(从MarshalByRefObject继承),然后通过RemotingServices.Marshal()方法创建ObjRef。由于SingleCall,所以在第二次通信的时候Server有会建立一个新的Remote Object来完成Client的请求,所以一共就有两个对象的创建过程了。
    实际上第一个对象对SingleCall类型应该是临时的,但Server确Hold了一个Reference,导致这个对象只有在注销Remote Object的时候才会被清除。这一点可以用Finalize方法检查。