1

我是 .NET 远程处理和 C# 的新手。我需要一个客户端/服务器应用程序并希望使用 .NET Remoting 来处理这个问题。我为远程处理对象 EchoServer 类编写了一个类库,并带有一些测试方法。

我在 Visual Studio 中添加到我的服务器项目的类库。我也添加了程序集“System.Runtime.Remoting”。

以下是我的服务器的代码:

        using System;
        using System.Collections.Generic;
        using System.ComponentModel;
        using System.Data;
        using System.Drawing;
        using System.Linq;
        using System.Text;
        using System.Windows.Forms;
        using System.Runtime.Remoting;
        using System.Runtime.Remoting.Channels;
        using System.Runtime.Remoting.Channels.Tcp;
        using Remoting; //Namespace Lib

        namespace Server
         {
         public partial class Server : Form
{
    public Server()
    {
        InitializeComponent();

        TcpChannel serverChannel = null;

        try
        {
            serverChannel = new TcpChannel(9998);
            lvStatus.Items.Add("Server is listening on port 8089...");

            string strIn = "";

            ChannelServices.RegisterChannel(serverChannel, true);

            RemotingConfiguration.RegisterWellKnownServiceType(Type.GetType("Remoting.EchoServer, remoting_dll"), "Echo", WellKnownObjectMode.SingleCall);
        }
        catch (Exception ex)
        {
            ChannelServices.UnregisterChannel(serverChannel);
            MessageBox.Show(ex.Message.ToString());
        }
    }
}

}

如果我启动服务器,我会得到一个异常:

该值不能为 NULL 参数名称:类型

我已经尝试了教程的其他代码,但是如果远程对象的类被实现为类库或者直接在我的项目中作为类,我将得到相同的异常。

4

1 回答 1

0

您可以发布远程处理的实施吗?我认为你的错误是下一个:

“Remoting.EchoServer,remoting_dll”

因此,您应该正确使用 Type.GetType。

工作代码示例:

static void Main(string[] args)
{
    Server();
}

static void Server()
{
    Console.WriteLine("Server started...");
    var httpChannel = new HttpChannel(9998);
    ChannelServices.RegisterChannel(httpChannel);
    RemotingConfiguration.RegisterWellKnownServiceType(Type.GetType("Server.Program+SomeClass"), "SomeClass", WellKnownObjectMode.SingleCall);
    Console.WriteLine("Press ENTER to quit");
    Console.ReadLine();
}

public interface ISomeInterface
{
    string GetString();
}

public class SomeClass : MarshalByRefObject, ISomeInterface
{
    public string GetString()
    {
        const string tempString = "ServerString";
        Console.WriteLine("Server string is sended: {0}", tempString);
        return tempString;
    }
}
于 2013-01-11T11:29:20.217 回答