我相信,像这样接近它会做你想做的事:
string relativeUriPart = GetUniquePartFromConfigOfThisApplicationInstance();
var host = new ServiceHost(typeof(MyClass1)); // No base addresses specified
host.AddServiceEndpoint(
typeof(ISomeInterface),
new NetNamedPipeBinding(),
"net.pipe://localhost/" + relativeUriPart); // Specify absolute URI for endpoint
host.Open();
这是因为,如果您指定使用该net.pipe
方案的基地址,则该基地址用于派生侦听器使用的管道名称[请参阅下面的编辑],并且在每个应用程序实例中都是相同的,因此只有第一个应用程序的侦听器可以创建管道 - 正如您所指出的,其他的失败。
在端点级别使用绝对 URI,没有基地址,侦听器是使用从完整绝对 URI 派生的管道名称[参见下面的编辑]创建的,这在每个应用程序实例中是不同的,因此每个应用程序的侦听器都可以创建它的拥有不同的管道没有任何问题。
编辑:更准确地说,管道名称本身根本不是从服务地址派生的 - 它是一个 GUID,每次打开服务时都会更改。从服务地址派生的是共享内存对象的名称,通过该名称将管道的实际名称发布给潜在客户。有关更多详细信息,请参见此处。