如何在C#中通过MSMQ从VB6中提取一个propertybag或复杂对象

时间:2014-06-25 08:43:58

标签: c# vb6 msmq propertybag

我是VB6和MSMQ的新手。我在网上经历了很多教程,但似乎没有我的问题的解决方案。

我设法从C#发送到C#或VB6到VB6但不是从VB6发送到C#,反之亦然。所以我想知道这是一种方法,或者没有办法进行这种沟通。

例如:我想将此发送给MSMQ

Dim PropBag As PropertyBag
 Set PropBag = New PropertyBag
 PropBag.WriteProperty "Customer", "Bob"
 PropBag.WriteProperty "Product", "MoeHairSuit"
 PropBag.WriteProperty "Quantity", 4

并在C#中获取详细信息,“给定编码中存在”无效字符。第1行,第1位。“我使用XmlMessageFormatter

时出错
Message mes = mq.Receive(new TimeSpan(0, 0, 3));
mes.Formatter = new XmlMessageFormatter(new String[] { "System.String,mscorlib" });
result = mes.Body.ToString();

我也尝试从流中读取,但它在我的字符串中出现了一个奇怪的符号。下面是代码,这是输出“늓\ 0 \ 0 \ b \ b휖ꭑ(\ 0customer \ 0Bob \ 0 \ b \ a剂틠4 \ 0产品\ v \ 0MoeHairSuit \ b调⫳ㄴ.quantity \ 0 “

Message mes;
mes = mq.Receive(new TimeSpan(0, 0, 3));
mes.BodyStream.Position = 0;
byte[] b = new byte[mes.BodyStream.Length];
mes.BodyStream.Read(b, 0, (int)mes.BodyStream.Length);
UnicodeEncoding uniCoder = new UnicodeEncoding();
result = uniCoder.GetString(b);

我得到此异常“无法反序列化作为参数传递的消息。无法识别序列化格式。”当使用下面的ActiveXMessageFormatter时

mes = mq.Receive(new TimeSpan(0, 0, 3));
mes.Formatter = new ActiveXMessageFormatter();
result = mes.Body.ToString();

你们有任何想法怎么做吗? 先谢谢

2 个答案:

答案 0 :(得分:1)

我以前处理过这类问题,而且我发现的最佳解决方案实际上是将对象序列化为XML - 之后,您使用的语言/平台并不重要以文本格式编码/解码语言,您将始终拥有选项。在二进制格式中,您将受到直接格式化程序的支配,格式化程序不一定在平台上以相同的方式工作(VB6 / C#)。

参考: http://www.codeproject.com/Articles/33296/Serialization-and-De-serialization

换句话说,您需要在两个平台上都有一个标准的序列化程序,而不是尝试序列化属性包本身。

答案 1 :(得分:0)

VB6 propertybag以二进制格式存储数据。并且您尝试以文本格式读取数据。这就是整个问题。无法识别的字符 - 是PropertyBag中数据的类型和大小。尝试在二面以二进制形式交换数据。