Мы хотим, чтобы два приложения .NET, работающие на одном компьютере, общались друг с другом.Мы хотим три проекта.Библиотека, содержащая интерфейсы.Приложение «сервер», которое реализует интерфейсы, и приложение «клиент», которое взаимодействует с сервером с помощью интерфейсов.Мы не хотим, чтобы клиент ссылался на сервер.
У нас есть тестовое приложение, которое делает это с удаленным взаимодействием, но недавно обнаружило, что удаленное взаимодействие заменяется на WCF.Поскольку это новая разработка, мы считаем, что нам следует использовать WCF, но нам не удалось заставить ее работать с WCF, и мы задавались вопросом, возможно ли это?
РЕДАКТИРОВАТЬ:
Извините за нехватку деталей выше, но у меня не было доступа к коду в то время.Я работаю с двумя другими людьми над этим проектом и не пристально смотрю на их вещи IPC.Я знаю, что в настоящее время они придерживаются мнения, что WCF не может делать то, что они хотят, и я надеюсь, что смогу показать им, что он может.
Я начал смотреть на попытки моих коллег в этоми буду продолжать обновлять этот пост, насколько я понимаю.
Ниже приведена упрощенная версия их тестового кода для удаленного взаимодействия.Они хотят сделать это с помощью WCF, но до сих пор не смогли заставить его работать.
Обе сборки ServiceApp и ClientApp ссылаются на сборку Lib.Они не ссылаются друг на друга.
Я отредактирую это снова, когда смогу лучше объяснить их попытку воспроизвести это поведение в WCF.На данный момент все, что я действительно знаю, это то, что они используют NetNamedPipeBinding и испытывают проблемы с клиентским приложением, жалующимся, что оно не может получить доступ к сборке службы.
РЕДАКТИРОВАТЬ:
Ниже приведенупрощенная версия тестового кода для WCF.
Следующая строка из ClientProgram вызывает исключение:
IMessage msg2 = service.CreateMessage("Hello World");
Вот исключение:
Could not load file or assembly 'ServiceApp, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. The system cannot find the file specified.
EDIT:
Пытаясь понять последний комментарий Стивена, я прогуглил IMetadataExchange, который, конечно же, впервые попал на MSDN Page .На этой странице говорилось:
Нет необходимости реализовывать контракт MetadataReference в вашей реализации сервиса.Вместо этого добавьте ServiceMetadataBehavior в описание службы.
Или, при использовании конфигурации, установите атрибут контракта элемента конечной точки равным IMetadataExchange.Пример см. В разделе Как опубликовать метаданные для службы с помощью файла конфигурации.
Подробнее о публикации метаданных в WCF см. Публикация метаданных .
Потому что в этом примере я не использую файлы конфигурации, а вместо этого выбираю ссылку Publishing Metadata .Оттуда я перешел по ссылке Как: опубликовать метаданные для службы с использованием кода , в которой был хороший пример, который я использовал для изменения кода приложения-службы *1102*.Добавленный код находится в строках 15-20.
Мне удалось добавить ссылку на сервис после небольшой работы. Служба должна быть запущена, но если вы запускаете ее через Visual Studio, у вас нет возможности добавить ссылку на службу. Кроме того, я до сих пор не понимаю, как должна работать опция «Обнаружение служб в решении». В конце я смог добавить ссылку, открыв папку bin / debug, чтобы вручную запустить службу, а затем введя URL-адрес, который я добавил в приложение-службу. Если это правильный путь, то довольно неловко.
После всего этого код , сгенерированный , с тех пор не делает ничего для меня. Во-первых, он воссоздает мой интерфейс IService, но превращает все мои сообщения в объекты и украшает их немного по-другому. Если их интерфейс используется, то он не только будет использовать другой сервис IService, чем фактически реализует мой сервис, но методы в этом сервисе даже не имеют одинаковые подписи!
Откладывая это в сторону, я предполагал, что мне придется изменить свой клиент, чтобы использовать объекты из вновь созданного объекта, поэтому я изменил свой код клиента .
Теперь, когда я пытаюсь запустить его, в строке 4 появляется следующая ошибка:
The formatter threw an exception while trying to deserialize the message: There was an error while trying to deserialize parameter http://tempuri.org/:msg. The InnerException message was 'XML 'Element' 'http://tempuri.org/:msg' does not contain expected attribute 'http://schemas.microsoft.com/2003/10/Serialization/:Type'. The deserializer has no knowledge of which type to deserialize. Check that the type being serialized has the same contract as the type being deserialized.'. Please see InnerException for more details.
EDIT:
Один день остался за вознаграждением, а ответов нет, так как я добавил вознаграждение. Есть ли что-то, что я могу уточнить, прежде чем истечет время щедрости?
EDIT:
В итоге мы пошли с удаленным взаимодействием, потому что не похоже, что то, что мы хотим сделать, возможно с WCF. Стивен Судит получает награду за всю его помощь, несмотря на то, что все это было до того, как я предложил награду.