在WPF应用程序中托管NamedPipe不会创建管道

时间:2013-01-29 00:15:03

标签: c# wpf wcf named-pipes wcf-hosting

我在.NET 3.5上我有两个WPF项目,它们应该以两种方式相互通信。我认为命名管道可以通过WCF完成工作,使双工模式变得非常容易。 但是,我在一个应用程序中启动一个名为管道主机的WCF,但在另一个应用程序中无法看到它。还

pipelist.exe | findstr "MainApplication"

如果MainApplication是管道名称,则不返回任何内容(pipelist.exe是来自SysInternals的实用程序)。

我有以下app.config:

<?xml version="1.0"?>
<configuration>
  <system.serviceModel>
    <services>
      <service name="MainApplication" behaviorConfiguration="Default">
        <endpoint address="" binding="netNamedPipeBinding" name="MainApplication" contract="IMainApplication" />
        <endpoint address="mex" binding="mexNamedPipeBinding" contract="IMetadataExchange" />
        <host>
          <baseAddresses>
            <add baseAddress="net.pipe://localhost/MainApplication" />
          </baseAddresses>
        </host>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="Default">
          <serviceMetadata httpGetEnabled="false" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
  <startup>
    <supportedRuntime version="v2.0.50727" />
  </startup>
</configuration>

应该在Application中启动监听器的代码:

protected override void OnStartup(StartupEventArgs e)
{
    var serviceThread = new Thread(ServiceCommunications);
    serviceThread.Start();

    base.OnStartup(e);
}

private void ServiceCommunications()
{
    var host = new ServiceHost(typeof(MainApplication));

    host.Open();
}

我错过了什么? 我没有得到任何异常,但是当我尝试将服务引用添加到我的第二个项目时,我找不到管道,我也不能用pipelist.exe列出它 我错过了一些基本的东西吗?

1 个答案:

答案 0 :(得分:0)

我将ServiceCommunications方法更改为

    private void ServiceCommunications()
    {
        var host = new ServiceHost(typeof(MainApplication));

        host.Open();

        while (keepAlive)
        {
            // Do nothing
        }

        host.Close();
    }

它解决了这个问题。