1。到apache官网下载Thrift源码, http://thrift.apache.org/download,我这里下载的是thrift-0.10.0
2。到apach官网下载thrift.exe, http://thrift.apache.org/download, 这里下载的是thrift-0.10.0.exe
3。将下载下来的thrift-0.10.0.exe放到thrift-0.10.0/tutorial/目录下去
4。在windows命令行运行如下这两条命令:
thrift-0.10.0.exe --gen csharp tutorial.thrift
thrift-0.10.0.exe --gen csharp shared.thrift
运行完以后就会在当前目录下生成一个名为gen-csharp的目录,到时候需要把这下面的源码文件添加到项目中去
5。用vs打开thrift-0.10.0/lib/csharp/src/Thrift.sln解决方案,并编译得到Thrift.dll
6。用vs新建自己的项目,将之前生成的源码添加进来,并引入Thrift.dll库。
下面就是Client端的代码
using System;using Thrift;using Thrift.Protocol;using Thrift.Server;using Thrift.Transport;namespace CSharpTutorial{ public class CSharpClient { public static void Main() { try { TTransport transport = new TSocket("localhost", 9090); TProtocol protocol = new TBinaryProtocol(transport); Calculator.Client client = new Calculator.Client(protocol); transport.Open(); try { client.ping(); Console.WriteLine("ping()"); int sum = client.add(1, 1); Console.WriteLine("1+1={0}", sum); Work work = new Work(); work.Op = Operation.DIVIDE; work.Num1 = 1; work.Num2 = 0; try { int quotient = client.calculate(1, work); Console.WriteLine("Whoa we can divide by 0"); } catch (InvalidOperation io) { Console.WriteLine("Invalid operation: " + io.Why); } work.Op = Operation.SUBTRACT; work.Num1 = 15; work.Num2 = 10; try { int diff = client.calculate(1, work); Console.WriteLine("15-10={0}", diff); } catch (InvalidOperation io) { Console.WriteLine("Invalid operation: " + io.Why); } SharedStruct log = client.getStruct(1); Console.WriteLine("Check log: {0}", log.Value); } finally { transport.Close(); } } catch (TApplicationException x) { Console.WriteLine(x.StackTrace); } } }}
下面是Server端代码
using System;using System.Collections.Generic;using Thrift.Server;using Thrift.Transport;namespace CSharpTutorial{ public class CalculatorHandler : Calculator.Iface { Dictionarylog; public CalculatorHandler() { log = new Dictionary (); } public void ping() { Console.WriteLine("ping()"); } public int add(int n1, int n2) { Console.WriteLine("add({0},{1})", n1, n2); return n1 + n2; } public int calculate(int logid, Work work) { Console.WriteLine("calculate({0}, [{1},{2},{3}])", logid, work.Op, work.Num1, work.Num2); int val = 0; switch (work.Op) { case Operation.ADD: val = work.Num1 + work.Num2; break; case Operation.SUBTRACT: val = work.Num1 - work.Num2; break; case Operation.MULTIPLY: val = work.Num1 * work.Num2; break; case Operation.DIVIDE: if (work.Num2 == 0) { InvalidOperation io = new InvalidOperation(); io.WhatOp = (int)work.Op; io.Why = "Cannot divide by 0"; throw io; } val = work.Num1 / work.Num2; break; default: { InvalidOperation io = new InvalidOperation(); io.WhatOp = (int)work.Op; io.Why = "Unknown operation"; throw io; } } SharedStruct entry = new SharedStruct(); entry.Key = logid; entry.Value = val.ToString(); log[logid] = entry; return val; } public SharedStruct getStruct(int key) { Console.WriteLine("getStruct({0})", key); return log[key]; } public void zip() { Console.WriteLine("zip()"); } } public class CSharpServer { public static void Main() { try { CalculatorHandler handler = new CalculatorHandler(); Calculator.Processor processor = new Calculator.Processor(handler); TServerTransport serverTransport = new TServerSocket(9090); TServer server = new TSimpleServer(processor, serverTransport); // Use this for a multithreaded server // server = new TThreadPoolServer(processor, serverTransport); Console.WriteLine("Starting the server..."); server.Serve(); } catch (Exception x) { Console.WriteLine(x.StackTrace); } Console.WriteLine("done."); } }}