轉載自:[http://user.qzone.QQ.com/51566219]
一、實用類:
1、System.MarshalByRefObject :
系統中遠程調用的對象必須是從MarshalByRefObject對象中派生出來的;
2、System.Runtime.Remoting.Channels.Tcp.TcpServerChannel :
服務器端的Tcp信道;
3、System.Runtime.Remoting.Channels.Http.HttpServerChannel :
服務器端的Http信道;
4、System.Runtime.Remoting.Channels.ChannelServices :
注冊信道,使之可用於遠程對象;
5、System.Runtime.Remoting.RemotingConfiguration.RegisterWellKnowServiceType :
指定遠程對象中類的類的類型,客戶機使用的URI和模式;
6、System.Runtime.Remoting.Channels.Tcp.TcpClIEntChannel :
客戶端的Tcp信道;
7、System.Runtime.Remoting.Channels.Http.HttpClIEntChannel :
客戶端的Http信道。
二、簡單的示例
1、創建遠程對象,在這裡創建一個dll程序集,這個dll在服務器和客戶機代碼中都會用到。
創建名為RemoteHello.dll的程序集
using System;
using System.Collections.Generic;
using System.Text;
namespace RemoteHello
{
public class Hello:System.MarshalByRefObject
{
public Hello()
{
Console.WriteLine("Constructor called");
}
~Hello()
{
Console.WriteLine("Destructor called");
}
public string HelloWorld(string name)
{
Console.WriteLine("Hello World!");
return "Hi,
" + name;
}
}
}
2、創建服務器。需要引用System.Runtime.Remoting程序集和之前創建的RemoteHello.dll程序集。在此創建名為HelloServer的Console Application。
名字空間是對象所需要的。請記住,如果得到System.Runtime.Remoting.Channels.Tcp名字空間不存在的信息,請檢查是否添加了對System.Runtime.Remoting.dll的引用。
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;
using RemoteHello;
namespace HelloService
{
class HelloServer
{
static void Main(string[] args)
{
TcpServerChannel channel = new TcpServerChannel(6666);
//ChannelServices.RegisterChannel(channel);
ChannelServices.RegisterChannel(channel,false);
RemotingConfiguration.RegisterWellKnownServiceType(typeof(Hello), "HelloWorld", WellKnownObjectMode.SingleCall);
System.Console.WriteLine("Press Any Key to Exit ! ");
System.Console.ReadLine();
}
}
}
上面代碼中可以用
ChannelServices.RegisterChannel(channel);
ChannelServices.RegisterChannel(channel,false);
但是在.Net Framework 2.0中編譯時會提示
''System.Runtime.Remoting.Channels.ChannelServices.RegisterChannel(System.Runtime.Remoting.Channels.IChannel)'' is obsolete: ''Use System.Runtime.Remoting.ChannelServices.RegisterChannel(IChannel chnl, bool ensureSecurity) instead.''
原因是是.Net Framework 2.0新增的函數
System.Runtime.Remoting.C
hannelServices.RegisterChannel(IChannel chnl, bool ensureSecurity)
其中參數:ensureSecurity
如果啟用了安全,則為 true;否則為 false。將該值設置為 false 將不會使在 TCP 或 IPC 信道上所做的安全設置無效。
此外MSDN中注釋:對於 TcpServerChannel,將 esureSecurity 設置為 true 將在 Win98 上引發異常(因為 Wi9x 上不支持安全 tcp 信道);對於 Http 服務器信道,這樣會在所有平台上引發異常(如果想要安全的 http 信道,用戶需要在 IIS 中承載服務)。
3、創建客戶機。需要引用System.Runtime.Remoting程序集和之前創建的RemoteHello.dll程序集
在此創建名為HelloClIEnt的Console Application
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;
using RemoteHello;
namespace HelloClIEnt
{
class HelloClIEnt
{
static void Main(string[] args)
{
ChannelServices.RegisterChannel(new TcpClIEntChannel(), false);
Hello obj = (Hello)Activator.GetObject(typeof(Hello), "tcp://localhost:8085/Hi");
");
if (obj == null)
{
Console.WriteLine("False to Link Server.");
return;
}
for (int i = 0; i < 6; i++)
{
Console.WriteLine(obj.HelloWorld("MadRam.neo"));
}
}
}
}
注:
1、本實例在客戶端運行HelloClIEnt,但是要在服務器上遠程對象注冊之後,使服務器上的HelloClIEnt服務一直處於運行狀態,直到按任意鍵為止,否則會出錯!
2、將代碼中的“tcp://localhost:8085/Hi"”換成其他網址就可以運行在網絡上,比如換成:tcp://192.168.3.235:8085/Hi"。
3、能作為遠程服務的只能是dll,exe可不行;