因为c1不是MarshalByRefObject,也不是Serializable。在“远程访问”中,方法调用都要通过消息传递来完成的。因此,要实现远程传递,要么一个类可以转化为字节流(Serializable)被传递,要么一个类是可以被代理的(MarshalByRefObject)。t1是MarshalByRefObject,因此t1只是一个代理,实际实例生存在远程端,因此t1.C1也实际上生存在远程端。你要得到t1.C1,就要求t1.C1可以被远程传递回来,但由于你的实现中c1不是MarshalByRefObject,也不是Serializable,因此行不通。

解决方案 »

  1.   

    谢谢楼上的回答,不过C1是Serializable,上面的代码中忘记写了,但是还是不能访问C1的成员。如果我必须要访问c1的成员,怎么办呢?我有个MarshalByRefObject,里面定义了很多类似于C1这种实例,各种类中有很多方法,我需在客户端通过MarshalByRefObject来访问这些类的方法,所以我尝试了那么做,开始c1确实不是Serializable,执行出错,提示需要序列号这些类,我都写了[Serializable]了,还是不行。希望楼上朋友能够帮帮忙。如果要在MarshalByRefObject中重写一些方法来代替各个类中的方法,虽然可行,但是工作量太大了。
      

  2.   

    远程c1这些类,我加了[Serializable]后,在客户端还是不能通过tr1.C1.c1_m1()的方式来访问,编译不通过,提示需要在客户端项目中加入c1这些类的引用,我加了以后,编译通过了,但是通过tr1.C1.c1_m1()来执行代码时(tr1是MarshalByRefObject代理),实际上执行的是本地c1这个类里面的代码(本地并没有实例化c1),并不是执行远程的c1_m1()这个函数,我怎么都想不通。
      

  3.   

    可以考虑将C1封装到一个对COM可见的类库中,在客户端通过COM组件进行交互
    http://hi.baidu.com/linjone09/item/4945bb38a8d4544e023edc7a
      

  4.   

    谢谢楼上,我试试啊,我c1确实DLL中,但是没选“使程序集COM可见”,我选了试试看。
      

  5.   

    http://hi.baidu.com/linjone09/item/4945bb38a8d4544e023edc7a 
      

  6.   

     webservice ,rdp client ,nat+穿网 等等都可以进行远程连接
      

  7.   

    这个帖子先结贴吧,我新开了一个帖子,遇到了新的问题,欢迎各位去指教。http://bbs.csdn.net/topics/390647392