C# 如何在C中提取通过MSMQ从VB6发送的propertybag或复杂对象#

C# 如何在C中提取通过MSMQ从VB6发送的propertybag或复杂对象#,c#,vb6,msmq,propertybag,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 "Pro

我是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휖ꭑ(\0客户\0Bob\0\b\a劑틠4\0product\v\0MoeShairsuit\b調⫳ᄂ.数量\0“

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

mes = mq.Receive(new TimeSpan(0, 0, 3));
mes.Formatter = new ActiveXMessageFormatter();
result = mes.Body.ToString();
你们知道怎么做吗?
感谢advanced(高级)

VB6 propertybag以二进制格式存储数据。您尝试以文本格式读取数据。这就是全部问题。无法识别的字符-是propertybag中数据的一种类型和大小。请尝试在两侧以二进制形式交换数据。

我以前处理过这种类型的问题,也是最好的解决方法我发现的解决方案实际上是将对象序列化为XML—之后,无论您使用何种语言/平台对该语言进行编码/解码,因为在文本格式中,您将始终有选项。在二进制格式中,您将受即时格式化程序的支配,而即时格式化程序在不同平台上的工作方式不一定相同(VB6/C#)

参考:


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

您是否尝试过使用
ActiveXMessageFormatter
而不是
XmlMessageFormatter
?我过去曾在类似场景中使用过它。是的,我尝试过,但它只适用于纯文本sage,但不是VB6的属性包。你确定应该使用Unicode编码吗?你是否在C端尝试过UTF8或ASCII编码器。我也尝试过UTF8和ASCII,但两者都得到了最坏的结果。至少我能读懂“客户”、“鲍勃”这个词通过使用Unicode编码,但如果使用UTF8和ASCIITIS,我什么都看不懂,这实际上不是一个答案-更多的是一个注释。OP无法从中获得任何具体信息来解决问题。@Yargo我尝试了“mes.Formatter=new BinaryMessageFormatter()'也是,但如何将其解析为PropertyBag?我得到了byteArray,它与我在VB+1 Drop propertybags中得到的相同。或者,编写一个VB6 COM DLL(标准序列化程序)阅读propertybag并从C#调用它。感谢Karell和@MarkJ,我相信序列化propertybag并不是解决这个问题的最佳方法。我将按照MarkJ的建议使用VB6 COM DLL来完成这项工作。谢谢大家
mes = mq.Receive(new TimeSpan(0, 0, 3));
mes.Formatter = new ActiveXMessageFormatter();
result = mes.Body.ToString();