我有寫入到隊列(這裏的代碼)的成分: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();
}
現在當運行上述的「測試」簡單地是與在其上2個特性的Serializble對象。如果我查看隊列上的文本正文,它看起來沒問題。
現在我有一個單獨的組件從隊列中讀取:
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是我的寫入組件中的方法名稱。
當寫我想我可能必須先明確序列化對象,以便在我的組件,寫我改變了我的代碼稍有是隊列:
正如你可以看到我設置BodyStream這次直接,但是當我嘗試從隊列中讀取時仍然收到相同的錯誤。
你在每個裝配一個單獨的測試類?如果要使用二進制格式,然後組件必須是共享的(除非你想用它_play_,可能的,只是不容易) –
是,測試類已在這兩個組件複製 – bilpor
你不能在C#(相反,例如,C++)一個類與它的程序集綁定。名字是不夠的。你應該把它移動到一個共享的組件(或_hacking_格式解析爲**另一種類型的**,因爲具有相同名稱的一類是另一個組件是另一種類型) –