0

我是新来的,所以请温柔一点。

这个问题围绕 VB.net / VS2010 / MSMQ 4.0

我正在开发一个以 MSMQ 为核心的应用程序。(目前)有 3 个独立的 VB 解决方案,每个解决方案都向队列发送和接收消息。

我尝试使用 XMLMessageFormatter 并遇到了问题,而且这是一个高性能、时间关键的应用程序,我知道 XMLMessaegFormatter 的开销很高,所以我已经切换到使用 BinaryMessageFormatter 来处理消息。

我已经建立了一个类 (clsTMessage),它为消息数据提供结构并驻留在附加到解决方案的自己的 .vb 文件中。我意识到使用 Binaryformatter 的缺点是完全相同的类(直到版本和所有)必须对消息进行编码和解码,实际上我看到了这个问题。

所以我想,没问题,我只需将 clsTmessage.vb 复制到每个解决方案,但这并不能完全解决问题,因为消息使用主机程序集的命名空间进行编码,因此获取消息的下一个解决方案是在技​​术上寻找不同的类来解码它。

例如,在此示例中,您可以看到 TelemanusWorkbench 版本 1.0.0.0 使用 TelemanusWorkbench.clsTMessage 对消息进行了编码。

00 01 00 00 00 FF FF FF .....ÿÿÿ
FF 01 00 00 00 00 00 00 ÿ.......
00 0C 02 00 00 00 49 54 ......IT
65 6C 65 6D 61 6E 75 73 elemanus  
57 6F 72 6B 62 65 6E 63 Workbenc
68 2C 20 56 65 72 73 69 h, Versi
6F 6E 3D 31 2E 30 2E 30 on=1.0.0
2E 30 2C 20 43 75 6C 74 .0, Cult
75 72 65 3D 6E 65 75 74 ure=neut
72 61 6C 2C 20 50 75 62 ral, Pub
6C 69 63 4B 65 79 54 6F licKeyTo
6B 65 6E 3D 6E 75 6C 6C ken=null
05 01 00 00 00 1E 54 65 ......Te
6C 65 6D 61 6E 75 73 57 lemanusW
6F 72 6B 62 65 6E 63 68 orkbench
2E 63 6C 73 54 4D 65 73 .clsTMes
73 61 67 65 09 00 00 00 sage....
0E 6E 65 77 4D 65 73 73 .newMess
61 67 65 54 79 70 65 12 ageType.
6E 65 77 50 72 6F 74 6F newProto
63 6F 6C 56 65 72 73 69 colVersi
6F 6E 0D 6E 65 77 49 64 on.newId
65 6E 74 69 66 69 65 72 entifier
0B 6E 65 77 53 6F 75 72 .newSour
63 65 49 50 0D 6E 65 77 ceIP.new
53 6F 75 72 63 65 50 6F SourcePo
72 74 10 6E 65 77 44 65 rt.newDe
73 74 69 6E 61 74 69 6F stinatio
6E 49 50 12 6E 65 77 44 nIP.newD
65 73 74 69 6E 61 74 69 estinati
6F 6E 50 6F 72 74 0C 6E onPort.n
65 77 54 69 6D 65 73 74 ewTimest
61 6D 70 0E 6E 65 77 4D amp.newM
65 73 73 61 67 65 42 6F essageBo
64 79 01 01 01 01 01 01 dy......
01 00 01 0D 02 00 00 00 ........
06 03 00 00 00 03 44 46 ......DF
58 06 04 00 00 00 01 30 X......0
06 05 00 00 00 0C 30 30 ......00
30 30 30 30 30 30 30 30 00000000
30 30 06 06 00 00 00 07 00......
30 2E 30 2E 30 2E 30 06 0.0.0.0.
07 00 00 00 01 30 06 08 .....0..
00 00 00 0B 31 39 32 2E ....192.
31 36 38 2E 31 2E 31 06 168.1.1.
09 00 00 00 04 35 30 30 .....500
30 20 46 FE 12 F9 32 CF 0 Fþ.ù2Ï
88 06 0A 00 00 00 49 70 .....Ip
2C 31 2C 31 32 33 34 35 ,1,12345
36 37 38 39 30 31 32 33 67890123
34 35 36 37 38 39 2C 31 456789,1
32 33 34 35 36 37 38 39 23456789
30 31 32 33 34 35 2C 31 012345,1
2C 69 6E 74 65 72 6E 65 ,interne
74 2C 75 73 65 72 6E 61 t,userna
6D 65 2C 70 61 73 73 77 me,passw
6F 72 64 2C 30 2C 33 30 ord,0,30
0B                      .

当我从应用程序中的另一个解决方案/项目中获取消息时,它无法解析消息,即使它具有相同的 clsTMessage 副本,它位于命名空间 TelemanusListener.clsTMessage 中。

鉴于在应用程序的不同部分拥有多个类的副本通常是一个坏主意,那么推荐的方法是什么?我已经阅读了 MSDN 对此的看法,但是关于如何实际实现它的内容非常薄弱。

希望我已经解释得很好,如果没有,请询​​问更多信息。

邓肯

4

1 回答 1

0

是的。需要从两个项目中引用一个具有公共消息类型的类库。

关于自动属性的一点警告——不要在需要序列化/反序列化的类中使用它们。每次将类类型编译到程序集中时,编译器都会为每个自动属性创建一个随机命名的支持字段。当您使用不同项目部署在不同时间编译的同一个类库时,这可能会导致序列化问题。

于 2012-07-21T10:26:25.313 回答