public void Open() { _factory = new ChannelFactory<T>(_binding, _address); _factory.Open(); } public void Close() { if (_factory != null) _factory.Close(); } private T GetTransitObject() { return factory.CreateChannel(); } } 使用: var svc = new Service<ITransitObject>(); var obj = svc.GetTransitObject(); obj.Get_Str("");
上面稍微修改下:_factory改为非static的。using(var svc = new Service<ITransitObject>()) { svc.Open(); var obj = svc.GetTransitObject(); obj.Get_Str(""); svc.Close(); }
namespace MyApp
{
//服务器对象
public class TransitObject : MarshalByRefObject, ITransitObject
{ public string Get_Str(string sValue)
{
return System.AppDomain.CurrentDomain.BaseDirectory ;
} public DateTime Get_Date(DateTime dValue)
{
return dValue;
}
}
//接口
public interface ITransitObject
{
string Get_Str(string sValue); DateTime Get_Date(DateTime dValue);
}
}//在另一个服务器方法中实例化TransitObject,并传回proxy对象至用户端
public class MyService : MarshalByRefObject
{
public ITransitObject GetTransitObject()
{
return new TransitObject();
}
}
客户端方法:
[STAThread]
static void Main(string[] args)
{
RemotingConfiguration.Configure(“MyApp.exe.config"); MyService myService = new MyService();
Console.Readine(); //这里返回的tranObject就是proxy对象了
ITransitObject tranObject = myService.GetTransitObject();
Console.WriteLine(tranObject.Get_Str(""));
Console.Readine();
}
TcpServerChannel channel = new TcpServerChannel(Convert.ToInt32(sTCPIP));
ChannelServices.RegisterChannel(channel, false);
RemotingConfiguration.CustomErrorsMode = CustomErrorsModes.Off;
RemotingConfiguration.RegisterWellKnownServiceType(typeof(BaseInterface.BaseActive), "BaseActive", WellKnownObjectMode.SingleCall);
//客户端
RemotingConfiguration.CustomErrorsMode = CustomErrorsModes.Off;
RemotingConfiguration.RegisterWellKnownClientType(typeof(BaseInterface.BaseActive), "tcp://192.168.13.111:8098/BaseActive");
对着改吧。
// 自己实现IDisposable
public class Service<T> : IDisposable
{
private static NetTcpBinding _binding;
private static string _address;
private static ChannelFactory<T> _factory;
static Service()
{
//静态初始化,初始化binding和address
}
public void Open()
{
_factory = new ChannelFactory<T>(_binding, _address);
_factory.Open();
}
public void Close()
{
if (_factory != null)
_factory.Close();
}
private T GetTransitObject()
{
return factory.CreateChannel();
}
}
使用:
var svc = new Service<ITransitObject>();
var obj = svc.GetTransitObject();
obj.Get_Str("");
{
svc.Open();
var obj = svc.GetTransitObject();
obj.Get_Str("");
svc.Close();
}