C#のマーシャリングってやつがよくわからん
あと、Socket使って動的なデータやり取りする場合は、データサイズ送った後にデータの実体送る必要があるってことか。
//----------------------------------------
というか、送信できてなかったと思っていたのは、単純にエンディアンが違うだけだったからっぽい・・・。
やっちまった\(^o^)/
//-----------------------------------------
解決した。
やっぱ文法わかってないとだめですね><
struct FilePacket { [MarshalAs(UnmanagedType.ByValArray,SizeConst=100000)] // こうじゃなくて public int dataSize; public byte[] data; } struct FilePacket { public int dataSize; [MarshalAs(UnmanagedType.ByValArray,SizeConst=100000)] // こう public byte[] data; }
要するに[〜〜]ってやつはその下のモノを修飾するわけですね><
あ、でもエラー出た。
埋め込まれた配列インスタンスがレイアウトで宣言された長さと一致しないため、型をマーシャリングできませんでした。
えー。じゃあこれ動的にサイズ決めれないってことか?
SizeConst外したらポインタになってしまうし・・・。
//-----------------------------------------
今回はテスト用でサーバに対してファイルのバイナリを送信するようなツール書いたんですが、
C#やヴぁい - くそにそてくにっく
って書いてますが、C#同士でのテストはOKだったんですが、C#からC++のコードへ送信した場合にC++側でちゃんと受信できませんでした。
原因をいろいろと調べてみたら、やっぱりメモリ配置関係の問題っぽい。
んで、下記のような書き込みを見たんで試してみた。
struct Person { [MarshalAs(UnmanagedType.ByValArray,SizeConst=8)] public byte[] name; public int age; } /* C言語上での型 struct Person { char name [8]; int age; }; [MarshalAs(UnmanagedType.ByValArray,SizeConst=8)]を付けないと struct Person { char* name; int age; }; ↑このような型を意味する */C#でのバイト列操作について - QA@IT