关于远程调用(Remoting)中的调用构造函数参数的问题,及远程调用中怎样向客户端传递事件的问题

kfzdp 2003-04-17 09:19:10
大侠:
我现在用Remoting类作了一个远程调用的Demo,是想把以前公司现有的基于DCOM的软件升级到.NET下。现在碰到了两个问题。
一、我服务器端的类的构造函数有参数,但我在客户用obj=(CallOut.ICallOut) Activator.GetObject(typeof(CallOut.ICallOut),"tcp://LocalHost:8085/SayHello");
这样的方式创建类的实例却不能把构造函数中的参数传进去。请问大侠们我应该怎么写才能传递构造函数的参数?
二、我的服务器端还想往客户端传递事件,请问这在Remoting框架下可以实现吗?如果可以实现我应该怎么作?最好有个例子。
三、客户端激活和服务器端激活具体有什么区别,我不是说概念上的。我想问的是
具体服务器端怎么设置才能设成客户端激活的。
四、Activator.CreateInstance()后面的参数具体该怎么填呢。能不能给个例子。
它的参数是(TypeName,object[] Args),我不知道object[] Args该传什么
值。Args是不是就是传到构造函数里的参数。

我是初学者,可能提问的有些不清楚,请各位大虾原谅。

多谢。

...全文
87 点赞 收藏 5
写回复
5 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
fa2002 2003-04-18
补充:只有可以序列化的对象才可以传送。通过设置自定义属性可以确定对象的生存期。
回复
kfzdp 2003-04-18
gbl777(荷西) ( ) 的答案是错的。微软的文档上也说构造函数可以传参数的。

qqchen79(知秋一叶 [MS MVP]) ( )的回答完整的的解决了我的问题。

多谢各位的帮助,过一阵子就给分
回复
qqchen79 2003-04-17
1. 一是可以用上面说的客户激活;另外也可以使用FactoryPattern来做。
2. 普通.NET的时间模型在Remoting环境下同样适用(delegate/event),但要注意这种回调对于防火墙后面的客户无效。
3. .NET有自带的例子。
4. 简单情况下(构造函数参数里面没有ref/out),只要把这些参数按顺序放到一个Object[]里面就可以了。
回复
gbl777 2003-04-17
远程对象的构造函数不可以有参数!

你可以用事件来传递参数!!

给你贴点源代码希望对你有用!

using System;
using System.Collections ;
using PersonInfoDLL;

namespace ServerDLL
{
/// <summary>
/// Class1 的摘要说明。
/// </summary>
public class Server:System.MarshalByRefObject
{
private ArrayList personList;
//自定义人员信息类
private PersonInfoDLL.PersonInfo personInfo;

public Server()
{
//
// TODO: 在此处添加构造函数逻辑
//
personList = new ArrayList ();
}

//注册用户
public void Register(string name,string passWord)
{
personInfo = new PersonInfo (name,passWord);

personList.Add (personInfo);


}

public ArrayList GetDataList
{
get
{
return personList;
}
}

}

}

using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.Runtime ;
using System.Runtime .Remoting ;
using System.Runtime .Remoting .Channels ;
using System.Runtime .Remoting .Channels .Tcp ;
using ServerDLL;
using PersonInfoDLL;

namespace OicqClient
{
/// <summary>
/// Form1 的摘要说明。
/// </summary>
public class clientForm : System.Windows.Forms.Form
{
private System.Windows.Forms.Label label1;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.TextBox textBoxName;
private System.Windows.Forms.TextBox textBoxPwd;
private System.Windows.Forms.Button buttonRegister;


/// <summary>
/// 必需的设计器变量。
/// </summary>
private System.ComponentModel.Container components = null;

private ServerDLL.Server theServer;
private TcpChannel clientChannel;


public clientForm()
{
//
// Windows 窗体设计器支持所必需的
//
InitializeComponent();

//
// TODO: 在 InitializeComponent 调用后添加任何构造函数代码
//

clientChannel = new TcpChannel (0);
ChannelServices.RegisterChannel (clientChannel);

try
{
theServer = (Server)Activator.GetObject (typeof(Server),"tcp://localhost:8090/PublishSubscribe");
}
catch(Exception ex)
{
MessageBox.Show ("zheli出现异常"+ex.Message );
}



}

/// <summary>
/// 清理所有正在使用的资源。
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}

#region Windows Form Designer generated code
/// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
/// </summary>
private void InitializeComponent()
{
this.label1 = new System.Windows.Forms.Label();
this.label2 = new System.Windows.Forms.Label();
this.textBoxName = new System.Windows.Forms.TextBox();
this.textBoxPwd = new System.Windows.Forms.TextBox();
this.buttonRegister = new System.Windows.Forms.Button();
this.SuspendLayout();
//
// label1
//
this.label1.Location = new System.Drawing.Point(24, 32);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(48, 23);
this.label1.TabIndex = 0;
this.label1.Text = "姓名";
//
// label2
//
this.label2.Location = new System.Drawing.Point(24, 80);
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(48, 23);
this.label2.TabIndex = 1;
this.label2.Text = "密码";
//
// textBoxName
//
this.textBoxName.Location = new System.Drawing.Point(88, 32);
this.textBoxName.Name = "textBoxName";
this.textBoxName.TabIndex = 2;
this.textBoxName.Text = "";
//
// textBoxPwd
//
this.textBoxPwd.Location = new System.Drawing.Point(88, 80);
this.textBoxPwd.Name = "textBoxPwd";
this.textBoxPwd.TabIndex = 3;
this.textBoxPwd.Text = "";
//
// buttonRegister
//
this.buttonRegister.Location = new System.Drawing.Point(88, 152);
this.buttonRegister.Name = "buttonRegister";
this.buttonRegister.TabIndex = 4;
this.buttonRegister.Text = "注册";
this.buttonRegister.Click += new System.EventHandler(this.buttonRegister_Click);
//
// clientForm
//
this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);
this.ClientSize = new System.Drawing.Size(292, 273);
this.Controls.AddRange(new System.Windows.Forms.Control[] {
this.buttonRegister,
this.textBoxPwd,
this.textBoxName,
this.label2,
this.label1});
this.Name = "clientForm";
this.Text = "Form1";
this.ResumeLayout(false);

}
#endregion

/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main()
{
Application.Run(new clientForm());
}

private void buttonRegister_Click(object sender, System.EventArgs e)
{
if(theServer!=null)
{
theServer.Register (textBoxName.Text ,textBoxPwd.Text);
}


}


}
}
回复
bryanscn 2003-04-17
1.只能通过客户端激活的才能用有参的构造函数
就是在配置文件里用<activated>
2.可以实现,你可以试下代理与事件,具体文章可以在www.csdn.net里搜索remoting来看
微软社区里也有这方面的文章.
3.在配置文件里用<activated>
4.gz,没怎么看懂
回复
相关推荐
发帖
C#
创建于2007-09-28

10.6w+

社区成员

.NET技术 C#
申请成为版主
帖子事件
创建了帖子
2003-04-17 09:19
社区公告

让您成为最强悍的C#开发者