Служба WCF с использованием именованных каналов .Сейчас я делаю это для связи между поверхностью разработки некоторых видов деятельности WF4 и визуальным студийным расширением.
Это очень просто сделать.Я не могу показать весь код, так как некоторые из него обернуты в помощники, которые управляют открытием и закрытием канала, но определение довольно простое и сделано все в коде.
Вам просто нужно определитьпривязка
var binding = new NetNamedPipeBinding(NetNamedPipeSecurityMode.Transport);
binding.ReceiveTimeout = TimeSpan.FromMinutes(1);
создайте свой канал
var channelFactory = new ChannelFactory<IServiceInterface>(binding, endpointAddress);
, и вы должны убедиться, что адрес конечной точки гарантированно будет одинаковым как на клиенте, так и на сервере, которые оба совместно используют один и тот жепроцесс, но существуют в разных доменах приложений.Простой способ сделать это состоит в том, чтобы охватить адрес идентификатором процесса ...
private const string AddressFormatString =
"net.pipe://localhost/Company/App/HostType/{0}";
private static string _hostAddress;
public static string HostAddress()
{
if (_hostAddress == null)
_hostAddress = string.Format(
AddressFormatString,
Process.GetCurrentProcess().Id);
return _hostAddress;
}
У вас будет две фактические копии этого (одна в клиентском домене приложения, другая в домене приложения аддина), нотак как они оба находятся в одном и том же процессе, адрес хоста гарантированно будет одинаковым в обоих, и вы не столкнетесь с проблемами, когда у вас одновременно будет загружено несколько экземпляров VS (без суеты Running Object Table, спасибо).
Я храню этот код адреса в базовом классе хоста.Открыть канал хоста также довольно просто:
Host = new ServiceHost(this, new Uri(HostAddress()));
var binding = new NetNamedPipeBinding(NetNamedPipeSecurityMode.Transport);
Host.AddServiceEndpoint(typeof(IServiceInterface), binding, HostAddress());
Host.Open();