.NET Remoting客户端配置创建本地对象,而不是远程

时间:2010-02-24 17:48:29

标签: c# .net remoting

我正在使用.NET远程客户端的客户端配置文件和

RemotingConfiguration.Configure() 

呼叫成功完成。我已经引用了在我的客户端中定义远程对象的库。

我遇到的问题是在配置之后,当我尝试使用new()创建远程对象时,它只是从引用的DLL创建一个本地对象。我做错了什么?

谢谢,

3 个答案:

答案 0 :(得分:3)

在客户端网站上,您需要致电

IYourRemoteObjectInterface remoteObj = 
(IYourRemoteObjectInterface)Activator.GetObject(typeof(IYourRemoteObjectInterface),
 "tcp://remotehost:1002/Test");

从服务器检索远程代理对象,配置如下:

<configuration>
 <system.runtime.remoting>
  <application name="server">
   <service>
    <activated type="remote.ServiceClass, serviceclassassembly"/>
   </service>
   <channels>
    <channel ref="tcp" port="1002">
     <serverProviders>
      <formatter ref="binary" typeFilterLevel="Full"/>
     </serverProviders>
     <clientProviders>
      <formatter ref="binary"/>
     </clientProviders>
    </channel>
   </channels>
  </application>
 </system.runtime.remoting>
</configuration>

也许你应该阅读一些tutorials来进行.net远程处理,以便了解客户端和服务器激活对象之间以及单个和单例实例之间的区别。

答案 1 :(得分:1)

配置文件中有问题。 很可能你的装配错了。例如,如果您的配置文件如下所示:

<configuration>
  <system.runtime.remoting>
    <application>
      <client>
        <wellknown
          type="Foo.MyService, WRONGASSEMBLY"
          url="tcp://localhost:33000/MyServiceUri" />
      </client>
    </application>
  </system.runtime.remoting>
</configuration>

所有内容都将编译并运行,但您将使用该对象的本地副本而不是远程副本。配置文件中的程序集应该是对象所在的程序集。因此,如果将对象放在公共程序集中并引用它,则通用程序集将是所需的程序集。

如果您不想创建一个通用程序集,您甚至可以在两个项目中包含包含您的对象的源文件,但是,这是令人惊讶的一点,您在配置文件中放置的程序集将是您的 CLIENT 程序集(不是服务器)。

换句话说,配置文件中提到的程序集告诉.NET应该将代码中的哪个对象重定向到远程位置,它不是对象所在的位置(这就是“url”的用途)。 “namespace.typename,assembly”完全描述了对象,因此远程处理可以将对象的新调用切换为代理。

这里有一些很好的例子: http://www.codeproject.com/KB/WCF/net_remoting.aspx

答案 2 :(得分:0)

if(!typeof(MarshallByRefObject).IsAssignableFrom(typeof(MyRemoteObject))
  throw new InvalidOperationException(@"If a type doesn't extend MBRO, it is
  marshalled by value.  Make sure MyRemoteObject extends MBRO.");