日期:2014-05-17  浏览次数:20739 次

关于C# 用MarshalByRefObject 实现远程访问的问题

       public class c1
    {
        public c1()
        {

        }
        public void c1_m1()
        {

        }
        public void c1_m2()
        {

        }
    }

    public class testRemoteAccess : MarshalByRefObject
    {
        public void M1()
        {

        }
        public void M2()
        {


        }

        public c1 C1 = new c1();

    }


上面第二个类提供远程服务,并定义一个属性C1(第一个累c1的实例)

现在问题是,在本地程序中创建了MarshalByRefObject的实例,假设为tr1,我用tr1.M1()或tr1.M2()来执行远程的2个方法都没有问题,但是用想用tr1.C1.c1_m1()和tr1.C1.c1_m2()来访问在远程创建c1的对象的方法就不行,谁知道这是怎么回事?

------解决方案--------------------
因为c1不是MarshalByRefObject,也不是Serializable。

在“远程访问”中,方法调用都要通过消息传递来完成的。因此,要实现远程传递,要么一个类可以转化为字节流(Serializable)被传递,要么一个类是可以被代理的(MarshalByRefObject)。

t1是MarshalByRefObject,因此t1只是一个代理,实际实例生存在远程端,因此t1.C1也实际上生存在远程端。你要得到t1.C1,就要求t1.C1可以被远程传递回来,但由于你的实现中c1不是MarshalByRefObject,也不是Serializable,因此行不通。
------解决方案--------------------
可以考虑将C1封装到一个对COM可见的类库中,在客户端通过COM组件进行交互
http://hi.baidu.com/linjone09/item/4945bb38a8d4544e023edc7a
------解决方案--------------------
http://hi.baidu.com/linjone09/item/4945bb38a8d4544e023edc7a 
------解决方案--------------------
 webservice ,rdp client ,nat+穿网 等等都可以进行远程连接