在Windows服务中托管时无法访问远程处理对象成员

时间:2010-05-10 19:18:25

标签: c# .net remoting

我认为这是一个简单的.NET Remoting客户端/服务器(代码如下)...在托管应用程序中托管/运行时它可以正常工作,但是当托管在Windows服务中时,所有对代理成员的调用从Activator.GetObject返回的结果是NullReferenceException。

为了简化操作,我将所有这些放在一个控制台中,它工作正常...创建了一个基本的Windows服务并在OnStart方法上放置了相同的代码,一旦我访问“TheString”属性,我得到一个NullReferenceException。 / p>

我可以确认没有其他例外,端口可用,服务以管理员身份运行。另外,我的解决方案需要一个单例,这就是我使用它的原因。

目前这是托管在Windows 7上的,这可能是一个因素。如果我可以学习如何看到更多潜在错误可能导致这种情况,我或许能够弄明白......我怎样才能看到下面可能发生的事情(例如,sink,formatter等等)?

服务器代码:

var provider = new BinaryServerFormatterSinkProvider
{
    TypeFilterLevel = TypeFilterLevel.Full
};

IDictionary properties = new Hashtable();
properties["port"] = 20001;
properties["exclusiveAddressUse"] = false;

_channel = new TcpChannel(properties, null, provider);

ChannelServices.RegisterChannel(_channel, false);

RemotingConfiguration.RegisterWellKnownServiceType(typeof(HostClass), "TheHost", WellKnownObjectMode.Singleton);

客户代码:

var retInstance = (HostClass)Activator.GetObject(typeof(HostClass),
    string.Format("tcp://{0}:{1}/TheHost", "MyHostName", 20001));

string host = retInstance.TheString; //This is where the NullReference is experienced

远程处理对象:

public class HostClass : MarshalByRefObject, IHostClass
{
    public HostClass()
    {
      TheString = "Hello World";
    }

    public override object InitializeLifetimeService()
    {
        return null;
    }

    public string TheString { get; set; }
}

任何想法都会受到赞赏。

1 个答案:

答案 0 :(得分:0)

事实证明,限制涉及远程处理引擎无法序列化和代理接口类型,虽然这不是我的样本(对不起)的一部分,但最终是问题的根源。