台灣是獨立國家
在第一篇中,我們使用的範例是作個pxy專案,裡面放一些Class(ex. SrvPxy)來轉呼叫Server專案產生的dll,在本文中,以Interface來取代pxy內的Class。
1. 建立4個專案分別為
client(本範例out type選Console Application),
proxy(out type:Class Library),
server(out type:Class Library)
serverUI(本範例out type選Console Application),
proxy用來對應client和server端,所以2端都要放置; 程式運作是Interface被server端的Class實作,client藉由通道抓取server端實作出的Class建立Interface實體
而serverUI只是為了架設並啟動server用而已
2. 幫專案加參考:serverUI加入參考System.Runtime.Remoting
client參考proxy; server參考proxy; serverUI參考server,proxy
3. 在proxy專案加入一個Interface:
public interface ISrvPxy
{ int GetCount(); }
4. 在server專案加入一個給值用的class:
public class SrvCount : MarshalByRefObject, ISrvPxy
{
private static int i = 1000;
public int GetCount()
{ return ++SrvCount.i; }
}
5. 在serverUI專案修改Program.cs內的Main方法,以便啟動server:
static void Main()
{
try
{
ChannelServices.RegisterChannel(new TcpChannel(7777), false);
RemotingConfiguration.RegisterWellKnownServiceType(
typeof(SrvCount), "SrvName", WellKnownObjectMode.SingleCall);
}
catch (Exception e)
{ Console.WriteLine(e.Message); }
Console.ReadLine();
}
6. 在client專案修改Program.cs內的Main,以便呼叫server:
(本範例採用Tcp,也可改為http,只要將所有Tcp字眼為為Http即可,但須與server設定一致)
static void Main()
{
try
{
string url = "Tcp://localhost:7777/SrvName";//建議寫在config
ISrvPxy tt = (ISrvPxy)Activator.GetObject(typeof(ISrvPxy), url);//建議寫成泛型Method
Console.WriteLine(tt.GetCount().ToString());
}
catch (Exception e)
{ Console.WriteLine(e.Message); }
Console.ReadLine();
}
7. 整個方案編譯後, 先執行serverUI.exe(位置在serverUI專案目錄的bin/debug下),將server啟動;再執行client.exe(位置在client專案目錄的bin/debug下),若有成功呼叫到server,會每次執行都遞增
此方法有一個蠻不方便的缺點,就是無法直接在同一個解決方案內從client端debug到server端,則是一定要先啟動server程式,拆2個解決方案來Debug,好處就是不用再寫一個class轉呼叫server端程式~
Taiwan is a country. 臺灣是我的國家