一、简介
本博客用以下代码,来阐述我所有的问题。
const string queueName = @".\Private$\FaceSendQueueMsg";
System.Diagnostics.Process.Start(Environment.CurrentDirectory + "\\FaceRecognition" + "\\IDFaceDemo.exe");
MessageQueue queue;
if (MessageQueue.Exists(queueName))//消息队列queueName存在,直接获取这个消息队列的消息
{
queue = new MessageQueue(queueName);
queue .Formatter = new System.Messaging.XmlMessageFormatter(new Type[] { typeof(string) })
System.Messaging.Message msg = queue.Receive();
string str = msg.Body.ToString();
MessageBox.Show("你收到的消息是:{0}", str);
}
else //消息队列queueName不存在,就创建一个新的,并获取这个消息队列的消息
{
queue = MessageQueue.Create(queueName);
queue .Formatter = new System.Messaging.XmlMessageFormatter(new Type[] { typeof(string) })
System.Messaging.Message msg = queue.Receive();
string str = msg.Body.ToString();
MessageBox.Show("你收到的消息是:{0}", str);
二、消息队列的实体错误
首先,我用的是C++创建并发送的一个消息队列,然后用C# 接收。在消息队列FaceSendQueueMsg存在并确实有消息的前提下,用C# 接收该消息,单步执行到 string str = msg.Body.ToString();这一步的时候,发现消息队列的实体Body提示“找不到能够读取消息的格式化程序”的错误。
三、错误原因
由于C++的消息队列不是我写,我也不知道消息队列里面是否存在消息或消息到底是什么类型。所以,我一时间想不出来问题出现在什么地方。按理说,直接用
queue .Formatter = new System.Messaging.XmlMessageFormatter(new Type[] { typeof(string) })
就可以接收所有类型的消息。
但是,我这里就不能接收。
但是,我这里就不能接收。
但是,我这里就不能接收。
百度了下,发现了有类似的问题,但其相关的方法还是不能解决我的问题:
https://www.orcode.com/question/108056_kad1c6.html
于是,我归根结底,去微软官网查了下消息队列。发现可能是实体类型、标签等设置的原因。虽然没有成功解决我的问题,但我还是找到了解决思路。
https://msdn.microsoft.com/en-us/library/windows/desktop/ms711382(v=vs.85).aspx
建议你看英文版,中文版缩水了。