Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 无法在C中通过.NET远程处理检索int属性#_C#_.net_.net Remoting - Fatal编程技术网

C# 无法在C中通过.NET远程处理检索int属性#

C# 无法在C中通过.NET远程处理检索int属性#,c#,.net,.net-remoting,C#,.net,.net Remoting,我在通过.NET远程处理频道读取属性时遇到问题。这是我课程的开始: [Serializable] public class MachineID { private string mySystemDeviceSerial = null; /// <summary> /// Returns the hard drive serial that Windows is installed on. /// </summary> public

我在通过.NET远程处理频道读取属性时遇到问题。这是我课程的开始:

[Serializable]
public class MachineID
{
    private string mySystemDeviceSerial = null;
    /// <summary>
    /// Returns the hard drive serial that Windows is installed on.
    /// </summary>
    public string SystemDeviceSerial
    {
        get { return mySystemDeviceSerial; }
    }

    private string mySystemName = null;
    /// <summary>
    /// Returns the current name of the system.
    /// </summary>
    public string SystemName
    {
        get { return mySystemName; }
    }

    private string myLastError = string.Empty;
    /// <summary>
    /// Returns the last error that occurred. Returns string.Empty if no error has occurred.
    /// </summary>
    public string LastError
    {
        get { return myLastError; }
    }

    private int myPort = -2;
    public int Port
    {
       get { return this.myPort; }
       set { this.myPort = value; }
    }
[可序列化]
公共类机器ID
{
私有字符串mySystemDeviceSerial=null;
/// 
///返回安装Windows的硬盘驱动器序列号。
/// 
公共字符串SystemDeviceSerial
{
获取{return mySystemDeviceSerial;}
}
私有字符串mySystemName=null;
/// 
///返回系统的当前名称。
/// 
公共字符串系统名
{
获取{return mySystemName;}
}
私有字符串mylastror=string.Empty;
/// 
///返回上次发生的错误。如果未发生错误,则返回字符串。为空。
/// 
公共字符串错误
{
获取{return mylastror;}
}
私有int myPort=-2;
公共int端口
{
获取{返回this.myPort;}
设置{this.myPort=value;}
}
所有属性在本地计算机上都可以很好地访问。但是,当我试图通过.NET远程处理通道从客户端读取端口属性时,我没有得到分配给myPort的值,而是得到初始值-2。我对此感到困惑,因为所有字符串属性都可以很好地读取。有什么想法吗?我知道吗没有正确序列化这个类

值得注意的是,我为使这个类和成员可序列化所做的只是在类的顶部添加[serializable]属性。我不确定这样做是否正确,所以这可能是问题的一部分?

我猜(我强调这只是一个猜测)是您的顺序错了-您是错的

  • 从远程处理主机检索项目
  • 更新它(在主机上),然后
  • 希望客户端中的值更新为您在主机上更改的值

  • 当您使用
    [Serializable]
    ,您将对象转换为字节流,通过线路将其传输到远程处理客户端,然后在客户端上将其重新配置为新对象。这意味着客户端副本与服务器副本完全断开连接。如果希望客户端副本始终显示来自服务器的更新值(不重新传输整个对象),使其像@Hans Passant建议的那样从MarshallByRefObject继承。这使客户端复制一个透明代理,每当您访问服务器的某个属性时,该代理都会查询该服务器。

    两台计算机是否都有包含此类的完全相同的程序集?这是唯一一个具有setter的属性。它将按值进行封送处理。因此不知怎么的,er的对象副本没有得到更新。从MarshallByrefobect派生可能是一个快速修复方法。仅供参考,你知道远程处理已经被弃用,取而代之的是WCF吗?@JohnSaunders:我知道,但是更新到WCF的决定并不落在我的肩上,尽管我已经推动了一段时间。我们有一个“如果它没有坏,就不要修理它“尽管我们有很多理由可以从中受益,但我们还是要保持这种心态WCF@PeterRitchie是的,在这一点上,他们是这样做的,但随着我们发布更新,这并不总是这样。我会尝试一下,让你知道它是如何进行的,但myPort变量是在任何客户端能够连接到服务器之前设置的。