【发布时间】:2015-09-27 06:03:54
【问题描述】:
我正在用 .net remoting 做一些测试,发现在使用委托时它有问题。
我有一个既是服务器又是客户端的应用程序。当用户第一次从资源管理器运行应用程序时,它作为服务器运行并作为客户端启动一个新进程。两者都工作正常。现在,当用户在服务器和客户端进程仍在运行时再次运行它时,它假设成为客户端并向服务器发送有关新进程启动的消息,然后自行终止。
除了委托在服务器进程中执行之外,一切正常 客户。
这里是代码。
const string PIPE_NAME = "testPipeName33";
const string OBJECT_NAME = "test";
static RemoteObject remoteObject;
static void RegisterClient()
{
IpcClientChannel chan = new IpcClientChannel();
ChannelServices.RegisterChannel(chan, false);
remoteObject = (RemoteObject)Activator.GetObject(typeof(RemoteObject),
string.Format("ipc://{0}/{1}", PIPE_NAME, OBJECT_NAME));
}
static void RegisterServer()
{
BinaryServerFormatterSinkProvider serverProvider = new BinaryServerFormatterSinkProvider();
serverProvider.TypeFilterLevel = TypeFilterLevel.Full;
IpcServerChannel chan = new IpcServerChannel("", PIPE_NAME, serverProvider);
ChannelServices.RegisterChannel(chan, false);
RemotingServices.Marshal(new RemoteObject(), OBJECT_NAME);
}
[STAThread]
static void Main(string[] args)
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
if ((args.Length == 0 || args[0] == "s"))
{
try
{
RegisterServer();
}
catch (RemotingException)
{
// try to register it with the pipe name. If it fails, means server is already running.
//bad idea, I know, but it's just for barebone quick test
RegisterClient();
remoteObject.OnNewProcessStarted("test");
Application.Exit();
return;
}
Process.Start(Application.ExecutablePath, "c");
Application.Run(new Form1("Server"));
}
else
{
IsClient = true;
RegisterClient();
remoteObject.SetOnNewProcessStarted(OnNewProcessStarted);
Application.Run(new Form1("Client"));
}
}
static bool IsClient = false;
static bool OnNewProcessStarted(string commandLine)
{
MessageBox.Show("Is Client : " + IsClient);//problem here, IsClient should be true
return true;
}
RemoteObject 类。
public delegate bool OnNewProcessStartedDelegate(string text);
internal class RemoteObject : MarshalByRefObject
{
public OnNewProcessStartedDelegate OnNewProcessStartedHandler;
public bool OnNewProcessStarted(string commandLine)
{
if (OnNewProcessStartedHandler != null)
return OnNewProcessStartedHandler(commandLine);
return false;
}
public void SetOnNewProcessStarted(OnNewProcessStartedDelegate onNewProcessStarted)
{
OnNewProcessStartedHandler = onNewProcessStarted;
}
public override object InitializeLifetimeService()
{
return null;
}
}
PS : 只能有一台服务器和一台客户端。
【问题讨论】:
-
这种情况正确吗? "如果 ((args.Length == 0 || args[0] == "s"))"
-
条件表示如果没有参数或者如果第一个参数是s那么它将执行服务器。您是否验证了参数不止一个且第一个参数不是“s”?
-
是的,参数和条件都是正确的。
-
您能否发布第二次调用应用程序时传递的参数是什么?
-
全部代码已经贴出来了,大家看看吧。
标签: c# .net .net-remoting