1、 建立一個遠程對象(DLL):建立一個解決方案(類庫),命名為RemoteObject
建立一個類 RemoteTest,代碼如下
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Data.SqlClient;
namespace RemoteObject
{
public class RemoteTest : System.MarshalByRefObject//這是不能少的
{
SqlConnection con;
DataSet ds;
SqlDataAdapter da;
string conStr = "data source=HEYU\\SQLEXPRESS;initial catalog=schooldatabase;integrated security=SSPI;persist security info=False;packet size=4096";
string queryStr = "select * from book";
public DataTable datable()
{
using (con = new SqlConnection(conStr))
{
using (da = new SqlDataAdapter(queryStr, con))
{
ds = new DataSet();
da.Fill(ds, "Categories");
return ds.Tables["Categories"];
}
}
}
}
}
2、建立伺服器端程式,建立一個解決方案,命名為Sever,添加引用上面編譯好的DLL
代碼如下:
using System;
using System.Windows.Forms;
using System.Runtime.Remoting;//這個要添加引用
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;
//也可以改用HTTP傳輸實現
namespace Sever
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
//注意第二個參數要和用戶端的一致,可以為TRUE也可以為FALSE
ChannelServices.RegisterChannel(new TcpServerChannel(9999), true);
RemotingConfiguration.RegisterWellKnownServiceType(
typeof(RemoteObject.RemoteTest), "heyu", WellKnownObjectMode.Singleton);
}
}
}
3、建立伺服器端程式,建立一個解決方案,命名為Client,添加引用上面編譯好的DLL
代碼如下:
using System;
using System.Windows.Forms;
using System.Runtime;
using System.Runtime.Remoting; //這個要添加引用
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;
namespace Client
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
ChannelServices.RegisterChannel(new TcpClientChannel(),true);
RemoteObject.RemoteTest obj = (RemoteObject.RemoteTest)Activator.GetObject(typeof(RemoteObject.RemoteTest), "tcp://192.168.1.103:9999/heyu");
this.dataGridView1.DataSource = obj.datable();
}
}
}
以上的程式可以說是不能夠再簡單的了,只適合於初學者!因為建立這樣的程式存在很多的缺點:
1、沒有使用設定檔,使得更改伺服器時要重新編譯器。
2、建立出來的遠程物件服務器端和用戶端的是一樣,為了代碼的安全性,且降低用戶端對遠程對象中繼資料的相關性,我們有必要對這種方式進行改動。即在伺服器端實現遠程對象,而在用戶端則刪除這些實現的中繼資料。更好的解決辦法是配合反射來處理。註冊遠程對象時,我們不要註冊類,通過定義介面,而實現過程的類又繼承這一個介面,通過類名去反射建立這一個類對象(注意是object不是class),然後通過強制類型轉換,把這個object賦給介面,這樣就可以完全的分離了!做成代理工廠。