0

可能重复:
In 和 Out 属性在 .NET 中如何工作?

我正在使用 .Net Remoting(是的,我知道......这很旧)来实现一些托管在 Windows 服务中的服务类。

我在服务上调用一个方法DoOperation(Person[] people)来更改Person类中的某些属性,就像下面的代码一样:

Person p = new Person();
p.SomeProperty = "This value should be changed by the service";

RemoveSvc svc = (RemoveSvc)Activator.GetObject(
    typeof(RemoveSvc),
    "tcp://localhost:6100/RemoteService.rem");

svc.DoOperation(new Person[]{ p });

// This writes the old value not the one changed by the service.
Console.WriteLine(p.SomeProperty); 

DoOperation方法代码如下所示:

public void DoOperation(Person[] people) {
    foreach(var o in people)
        p.SomeProperty = "New Value";
}

这里的问题是,当方法返回时Person.SomeProperty,客户端代码中的值没有更新。

我已经仔细检查了Person该类是可序列化的;

svc变量的类型为TranparentProxy;

RemoteSvc继承MarshalByRefObject

我正在使用 .net Framework 4(不,我不能迁移到 WCF)

我究竟做错了什么?这是.net Remoting 的预期行为吗?如果是,有办法改变吗?

Tks

4

2 回答 2

2

服务不是这样工作的。服务不是内存中的操作。当您使用在本地计算机上编写的类执行您所展示的操作时,您自然会看到Person对象的更改,因为您正在调用者和方法之间传递内存引用。当然,它是完全相同的 person 对象

但是,当您使用服务或远程处理时,它不再是同一个人。实际上,您在问题中说明了这一点。您对人进行序列化,然后通过网络将其发送出去。在同一个共享内存寄存器中不是同一个人。因此,Person服务器上的更改将不会在客户端中看到。

为了得到你想要的,这是你的函数签名。

public Person[] DoOperation(Person[] people);

您可以更改签名以保留参考。然后对象将在客户端的服务器之间保持同步。有关更多信息,请参阅本文

public void DoOperation(ref Person[] people);
于 2012-10-30T18:40:36.053 回答
0

Jarrett 是正确的,但这可能只是解决方案的一部分。问题是即使您传递了对数组的引用,您仍然复制了Person数组中的 s。因此远程更改其中之一不会影响本地副本。您可能需要通过数组而不是使用本地引用来引用它们。

我会尝试类似的东西:

var temp = new Person[]{ p }
svc.DoOperation(temp);

// This writes the old value not the one changed by the service.
Console.WriteLine(temp[0].SomeProperty); 

这可能使用远程调用创建的代理Person从远程位置获取,而不是使用本地引用。

于 2012-10-30T20:13:58.297 回答