OrderMessage 为自定义的class写函数
OrderMessage om= new OrderMessage();
System.Messaging.Message ms = new System.Messaging.Message();
om.Order_Id = 1;
om.Order_Customer_Name  = "sssss";
ms.Body = om;
MSMQ.Send(ms);
读函数
OrderMessage om = new OrderMessage();
System.Messaging.Message[] ms;
System.Messaging.XmlMessageFormatter stringFormatter;
stringFormatter = new System.Messaging.XmlMessageFormatter(new string[] {"OrderMessage"});ms = MSMQ.GetAllMessages();
for (int index = 0; index < ms.Length; index++) 
{
ms[index].Formatter = stringFormatter;
om = (OrderMessage)ms[index].Body; <-------出错!
}

解决方案 »

  1.   

    #region Class Cls_MessageMG
    /// <summary>
    /// This Class is used read and write message from MessageQueue
    /// </summary>
    public class Cls_MessageMG
    {
    public static void clear_message(string Queue_Path)
    {
    Queue_Path=@".\Private$\"+Queue_Path;
    if (!MessageQueue.Exists(Queue_Path))
    {
    MessageQueue.Create(Queue_Path);
    }
    MessageQueue mq=new MessageQueue(Queue_Path);
    mq.Purge();
    } public static void send_message(string Queue_Path, string Msg_Content, Msg_Type Msg_Type_Instance)
    {
    Queue_Path=@".\Private$\"+Queue_Path;
    if (!MessageQueue.Exists(Queue_Path))
    {
    MessageQueue.Create(Queue_Path);
    }
    MessageQueue mq=new MessageQueue(Queue_Path);
    mq.Label=System.DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss:ffff");
    switch (Msg_Type_Instance)
    {
    case Msg_Type.XML:
    mq.Formatter=new XmlMessageFormatter();
    break;
    case Msg_Type.Binary:
    mq.Formatter=new BinaryMessageFormatter();
    break;
    case Msg_Type.ActiveX:
    mq.Formatter=new ActiveXMessageFormatter();
    break;
    }
    mq.Send(Msg_Content);
    } public static string receive_message(string Queue_Path)
    {
    Queue_Path=@".\Private$\"+Queue_Path;
    if (!MessageQueue.Exists(Queue_Path))
    {
    MessageQueue.Create(Queue_Path);
    return "";
    } MessageQueue mq= new MessageQueue(Queue_Path);
    mq.Label=System.DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss:ffff");
    ((XmlMessageFormatter)mq.Formatter).TargetTypeNames=new string[]{"System.String,mscorlib"}; try
    {
    System.Messaging.Message m = mq.Receive();
    return (string)m.Body;
    }
    catch (Exception ex)
    {
    return (ex.ToString());
    }
    } public static string peek_message(string Queue_Path)
    {
    Queue_Path=@".\Private$\"+Queue_Path;
    if (!MessageQueue.Exists(Queue_Path))
    {
    MessageQueue.Create(Queue_Path);
    return "";
    } MessageQueue mq= new MessageQueue(Queue_Path);
    mq.Label=System.DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss:ffff");
    ((XmlMessageFormatter)mq.Formatter).TargetTypeNames=new string[]{"System.String,mscorlib"}; try
    {
    System.Messaging.Message m = mq.Peek();
    return (string)m.Body;
    }
    catch (Exception ex)
    {
    return (ex.ToString());
    }
    } public static bool IsQueueEmpty(string Queue_Path)
    {
    Queue_Path=@".\Private$\"+Queue_Path;
    bool isQueueEmpty = false; if (!MessageQueue.Exists(Queue_Path))
    {
    MessageQueue.Create(Queue_Path);
    return true;
    } // Connect to a queue.
    MessageQueue myQueue = new MessageQueue(Queue_Path); try
    {
    // Set Peek to return immediately.
    myQueue.Peek(new TimeSpan(0)); // If an IOTimeout was not thrown, there is a message 
    // in the queue.
    isQueueEmpty = false;
    } catch(MessageQueueException ex)
    {
    if (ex.MessageQueueErrorCode == 
    MessageQueueErrorCode.IOTimeout)
    {
    // No message was in the queue.
    isQueueEmpty = true;
    } // Handle other sources of MessageQueueException.
    } // Handle other exceptions as necessary. // Return true if there are no messages in the queue.
    return isQueueEmpty;
    }
    public static int GetQueueCount(string Queue_Path)
    {
    Queue_Path=@".\Private$\"+Queue_Path; if (!MessageQueue.Exists(Queue_Path))
    {
    MessageQueue.Create(Queue_Path);
    return 0;
    } MessageQueue myQueue = new MessageQueue(Queue_Path);
    MessageEnumerator myEnumerator = myQueue.GetMessageEnumerator(); int message_count=0;

    while (myEnumerator.MoveNext())
    {
    message_count++;
    }
    return message_count;
    } }
    #endregion
      

  2.   

    忘了前面要加
    public enum Msg_Type {XML, Binary, ActiveX};
      

  3.   

    谢谢楼上耐心回答一定给分,但是我觉得没有真真解决我的问题,我send的是一个自定义的object,然后出错是在从queue中取出并还原的时候,是说我序列化生成器有问题,希望能帮忙解决
      

  4.   

    保存到MSMQ的只能是XML, Binary, ActiveX三种类型中的一种,其他的类型(包括你自己定义的object)是不能被序列化存储到MSMQ中去的。参见MSMQ在MSDN中的说明
      

  5.   

    我看过MSDN了,XML, Binary, ActiveX三种是.net预定义的,但.net是可以写自己的格式化程序的,我再看看怎么写格式化程序,那位老兄知道最好了!