0

私はここで新しいので、優しくしてください。

この質問は、VB.net / VS2010 / MSMQ 4.0 を中心に展開しています

MSMQ を中心としたアプリケーションを開発しています。(現在) 3 つの個別の VB ソリューションがあり、それぞれがメッセージをキューに送受信します。

XMLMessageFormatter を使用してみましたが、問題が発生しました。さらに、これは高性能でタイム クリティカルなアプリであり、XMLMessaegFormatter のオーバーヘッドが高いことを理解しているため、メッセージに BinaryMessageFormatter を使用するように切り替えました。

メッセージ データの構造を提供し、ソリューションに添付された独自の .vb ファイルに存在するクラス (clsTMessage) を確立しました。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                      .

アプリ内の別のソリューション/プロジェクトからメッセージを取得すると、名前空間 TelemanusListener.clsTMessage にある clsTMessage の同一のコピーがあるにもかかわらず、メッセージの解析に失敗します。

とにかくアプリのさまざまな部分にクラスの複数のコピーを持つことは一般的に悪い考えであることを考えると、これを行うための推奨される方法は何ですか? これについてMSDNが何を言わなければならないかを読んだことがありますが、実際にそれを実装する方法については非常に薄いです。

十分に説明したことを願っています。そうでない場合は、さらに情報を求めてください。

ダンカン

4

1 に答える 1

0

はい。2 つのプロジェクトから、パブリック メッセージ タイプを持つ 1 つのクラス ライブラリを参照する必要があります。

自動プロパティに関する警告 - シリアル化/逆シリアル化が必要なクラス内で使用しないでください。クラス型がアセンブリにコンパイルされるたびに、コンパイラは自動プロパティごとにランダムな名前のバッキング フィールドを作成します。これにより、異なるプロジェクトで異なる時期にコンパイルされた 1 つまたは同じクラス ライブラリを配置すると、シリアル化の問題が発生する可能性があります。

于 2012-07-21T10:26:25.313 に答える