Можете ли вы рассказать мне, что лучший способ отправить объекты через NamedPipes в .net 3.5?
Как отправить объект через NamedPipe в .NET 3.5?
Ответ 1
Использовать WCF на NetNamedPipeBinding. См. Также Открыть службу WCF через привязку именных имен.
Ответ 2
Связывание WCF NetNamedPipes - это путь, вы можете также рассмотреть .NET Remoting для достижения этого
Ответ 3
Сериализовать свой объект XmlSerializer, чем отправить его как текст и десериализоваться с другой стороны или использовать WCF с именем pipe binding, поскольку Remus предлагает
Ответ 4
То, что вы ищете, это атрибут DataContract. См. Также: MSDN Использование контрактов данных.
Контракт данных является формальным соглашением между службой и клиентом, который абстрактно описывает данные, подлежащие обмену. То есть для связи клиент и служба не должны использовать одни и те же типы, только одни и те же контракты данных. Контракт данных точно определяет для каждого параметра или типа возвращаемого значения, какие данные сериализуются (превращаются в XML) для обмена.
Ваш контракт на обслуживание:
[ServiceContract]
public interface IApplicationRegistration
{
// Sends the application information
[OperationContract]
bool RegisterApplication(AppInfo appInfo);
}
Данные для обмена:
[DataContract]
public class AppInfo
{
private int _processID;
private string _processName;
[DataMember]
public int ProcessID
{
get { return _processID; }
set { _processID = value; }
}
[DataMember]
public string ProcessName
{
get { return _processName; }
set { _processName= value; }
}
}
Ответ 5
Как указано в исходном вопросе, вы не отправляете объекты другим процессам. Вы можете отправлять данные в другой процесс, и эти данные могут использоваться для создания прокси или факсимиле исходного объекта в другом процессе, но вы не можете напрямую отправлять объект.
Даже те технологии, которые предлагают межпроцессную объектно-передающую семантику, находятся под капотом, делая именно это. Из-за этого вы всегда должны использовать "попытаться выполнить операцию и уловить исключение, если она не работает", а не "сделать так, чтобы она выполняла операцию, а затем выполняла ее". Даже если объект выглядит в правильном состоянии для вашей операции, вы смотрите на старые данные, и поэтому он может быть недействительным при попытке выполнить фактическую операцию.
Итак, поскольку вы не можете отправлять объекты, то, что вы действительно собираетесь делать, это сериализация некоторых данных (с использованием XmlSerializer или DataContractSerializer или что-то еще), чтение потока данных на другом конце и создание новый объект для представления старого. Вам может быть проще создать отдельный объект для представления данных, которые вы хотите отправить по всему каналу, в отличие от реального живого представления объекта.
WCF может обрабатывать много этого материала автоматически для вас, но нет ничего сложного в том, чтобы отправлять его по трубе самостоятельно.
Если использовать WCF, как другие предложили, имейте в виду, что вы по-прежнему не отправляете "объекты". Вы по-прежнему отправляете данные, и WCF довольно откровенен в этом вопросе (поэтому они называют его DataContractSerializer, а не ObjectSerializer). В частности:
1) Любые операции, выполняемые над объектом, посланным с сериализацией DataContract, будут выполняться локально.
2) Если один и тот же объект отправляется дважды, он не будет автоматически обновлять старые версии, и у них не будет ссылочного равенства. У вас будет две структуры данных, которые в отношении С# полностью не связаны.
3) Обновления объекта будут выполняться только локально и не будут автоматически обновлять другие процессы с помощью "того же" объекта.
Если вы абсолютно уверены, что вам нужно передать "объекты" через процессы, вы можете либо свернуть свой собственный (что я бы рекомендовал, даже если он больше работал), либо использовать пространство имен System.Remoting.
Даже если вы используете System.Remoting, поймите, что то, о чем я говорил выше, это то, что на самом деле происходит, и проектируйте свои объекты и систему с учетом этого. Вы получите намного лучшие результаты.
Ответ 6
Асинхронные именованные каналы здесь http://www.eggheadcafe.com/tutorials/aspnet/478ca475-2fd9-45d6-9090-5acdaeb00162/make-your-apps-talk-to-ea.aspx
использует часть моего кода; -)