Унаследованный интерфейс создает дубликат объявления метода в метаданных DLL
Сценарий довольно запутанный, но, возможно, этого урезанного резюме будет достаточно, чтобы направить меня в правильном направлении.
У меня есть служба, которая предоставляет данные для моего приложения. WCF используется для обеспечения взаимодействия между ними. У меня также есть отладочная версия службы, которую я использую для предоставления сгенерированных тестовых данных приложению. Отладочная версия копирует весь связанный с WCF код и данные конфигурации, повторно используя библиотеки DLL, из которых построена служба. Служба работает, как и подключение WCF к ней. Отладочная версия начинает работать, но не может установить соединение WCF, жалуясь, что два метода в одном контракте имеют одно и то же имя.
Основная задействованная архитектура такова:
using System.ServiceModel; namespace nsOne { [ServiceContract] public interface IFoobarOne { [OperationContract] void FooOne(string str); [OperationContract] void BarOne(string str); } } namespace nsTwo { [ServiceContract(/*...*/)] public interface IFoobarTwo : nsOne.IFoobarOne { [OperationContract] void FooTwo(int number); [OperationContract] string BarTwo(); } public abstract class One<T> : nsOne.IFoobarOne { public virtual void FooOne(string str) { /*...*/ } public virtual void BarOne(string str) { /*...*/ } } public interface IOther { /*...*/ } [ServiceBehavior(/*...*/)] public class BeOne : One<IOther>, IFoobarTwo { public BeOne() { /*...*/ } public void FooTwo(int number) { /*...*/ } public string BarTwo() { /*...*/ return "me"; } } } namespace nsThree { public class Something<T> where T: class, nsOne.IFoobarOne { protected T proxy; protected void DoSome() { proxy.FooOne("abc"); } } public class SomethingMore : Something<nsTwo.IFoobarTwo> { private void DoMore() { DoSome(); proxy.FooTwo(2); } } } namespace nsFour { [ServiceBehavior(/*...*/)] public class BeOneToo : nsTwo.One<nsTwo.IOther>, nsTwo.IFoobarTwo { public BeOneToo(object param) { /*...*/ } public void FooTwo(int number) { /*...*/ } public string BarTwo() { /*...*/ return "you"; } } }В терминах этого примера служба строит
BeOne
использование объекта:serviceHost = new ServiceHost(typeof(BeOne));В приложении,
SomethingMore
объект успешно обращается к объекту и манипулирует им (через WCF) . BeOne
объект на службе.Пространство имен
nsOne
, nsTwo
, и nsThree
содержатся в одном и том же растворе VS.Пространство имен
nsFour
содержит отладочную версию службы. Библиотеки DLL для других пространств имен включены по ссылке, но их проекты не входят в это решение VS. Объекты WCF создаются с помощью: var objBeOneToo = new BeOneToo(this); serviceHost = new ServiceHost(objBeOneToo);Когда он запускается, объект успешно создается, но
ServiceHost
конструкция выбрасывает исключение, жалуясь, что есть два метода контракта с именем BarOne
Если я посмотрю на определения IFoobarOne
и IFoobarTwo
что IntelliSense происходит от метаданных DLL, конечно же, оба включают объявление для BarOne
, но только IFoobarOne
содержит декларацию для FooOne
. Я в недоумении. Почему это происходит
IFoobarTwo
DLL правильно указывает на IFoobarOne.FooOne
, но не для того, чтобы IFoobarOne.BarOne
? Как мне это исправить?Что я уже пробовал:
Смотреть Ошибка: не может быть двух операций в одном контракте с одним и тем же именем[^], но он не решает эту проблему.