このようにアプローチすることで、あなたが望むことを実行できると私は信じています。
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です。サービスアドレスから派生するのは、パイプの実際の名前が見込み顧客に公開される共有メモリオブジェクトの名前です。詳細については、こちらをご覧ください。