Подходя к нему так, вы получите то, что хотите, я считаю:
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, который изменяется при каждом открытии службы,То, что является , полученным из адреса службы, является именем объекта общей памяти, через который фактическое имя канала публикуется для потенциальных клиентов. Подробнее см. Здесь.