У меня есть компонент, который записывает в очередь (вот код):MSMQ с помощью BinaryFormatter
using (MessageQueueTransaction transaction = new MessageQueueTransaction())
{
transaction.Begin();
using (var queue = new MessageQueue(@fullQueue, QueueAccessMode.Send))
{
BinaryMessageFormatter formatter = new BinaryMessageFormatter();
// XmlMessageFormatter formatter = new XmlMessageFormatter(new Type[] { typeof(Testing) });
var testing = new Testing {myBody = string.Format("Hello {0}",Environment.UserName), myMessageText = "Header"};
var message = new Message
{
Body = testing,
Label = Environment.MachineName,
UseDeadLetterQueue = true,
Recoverable = true,
Formatter = formatter
};
queue.Send(message, MessageQueueTransactionType.Single);
}
transaction.Commit();
}
Теперь, когда я запускаю выше «Тестирование» просто Serializble объект с 2-мя свойствами на нем. Если я посмотрю на текст текста в очереди, он выглядит нормально.
Теперь у меня есть отдельный компонент для чтения из очереди:
BinaryMessageFormatter formatter = new BinaryMessageFormatter();
// XmlMessageFormatter formatter = new XmlMessageFormatter(new Type[] { typeof(Testing) });
MessageQueue msgQ = new MessageQueue(fullQueue, QueueAccessMode.Receive);
try
{
using (TransactionScope transaction = new TransactionScope())
{
Message incoming = new Message { Formatter = formatter, AcknowledgeType = AcknowledgeTypes.FullReceive };
incoming = msgQ.Receive(new TimeSpan(0, 0, 3),MessageQueueTransactionType.Single);
// var ttt = incoming.Body;
MemoryStream mem = (MemoryStream) incoming.BodyStream;
mem.Seek(0, SeekOrigin.Begin);
IFormatter ifm = new BinaryFormatter();
Testing tt = (Testing)ifm.Deserialize(mem);
transaction.Complete();
}
}
Теперь в точке я выступаю в ifm.Deserialize, это ошибки с
Не удается найти сборку «MSMQWrite , Version = 1.0.0.0, Culture = neutral, PublicKeyToken = null ' Где MSMQWrite - это имя метода в моем компоненте записи.
При записи в очереди, я думал, что я, возможно, придется явно сериализовать объект первого, так на мой компонент, который пишет, я немного изменил код, чтобы быть:
var testing = new Testing {myBody = string.Format("Hello {0}",Environment.UserName), myMessageText = "Header"};
MemoryStream mem = new MemoryStream();
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(mem,testing);
var message = new Message
{ BodyStream = mem,
//Body = testing,
Label = Environment.MachineName,
UseDeadLetterQueue = true,
Recoverable = true,
Formatter = formatter
};
queue.Send(message, MessageQueueTransactionType.Single);
Как вы можете видеть, я устанавливаю BodyStream прямо сейчас, но я все равно получаю ту же ошибку при попытке чтения из очереди.
У вас есть отдельный класс тестирования в каждой сборке? Если вы хотите использовать двоичный форматировщик, тогда сборки должны быть общими (если вы не хотите _play_ с ним, возможно, просто не легко) –
Да, класс тестирования был дублирован в обеих сборках – bilpor
Вы не можете в C# (напротив, например, на C++), класс привязан к его сборке. Имя недостаточно. Вы должны перенести его на общую сборку (или _hacking_ formatter, чтобы разрешить ** другой тип **, потому что класс с таким же именем является другой сборкой другого типа) –