既知の構造で構成される TCP/IP 経由でバイナリ データを受信できるようにしたいと考えています。私は C または C++ と相互運用したくないので、このケースで機能するソリューションは役に立ちませんでした。残念ながら、相手側はプロトコルを変更できません。この問題は、特定の形式のバイナリ ファイルを読み込もうとしたときにも発生するはずです。
私もチェックBinaryFormatter
しましたが、それらは私には受け入れられない独自の形式を使用しています。
構造体のサンプル セットを次に示します。構造体のネストされた配列 (既知の長さ) を再構築できるようにしたいと考えています。現在のコードでは、例外が発生します。
アセンブリ '...' から型 'NestedStruct' を読み込めませんでした。これは、オフセット 2 にオブジェクト フィールドが含まれているためです。
のインスタンスを送受信 (または読み取り/書き込み) できるようにしたいstruct MainStruct
。
[StructLayout(LayoutKind.Explicit, Pack = 1, Size = 244, CharSet = CharSet.Ansi)]
public struct NestedStruct
{
[FieldOffset(0)]
public Int16 someInt;
[FieldOffset(2), MarshalAs(UnmanagedType.ByValArray, SizeConst = 242)]
public Byte[] characterArray; // an array of fixed length 242
}
[StructLayout(LayoutKind.Explicit)]
public struct OtherNestedStruct
{
[FieldOffset(0)]
public Int16 someInt;
[FieldOffset(2)]
public Int16 someOtherInt;
}
[StructLayout(LayoutKind.Explicit)]
public struct MainStruct
{
[FieldOffset(0)]
public double someDouble;
[FieldOffset(8)]
public NestedStruct nestedContent;
[FieldOffset(8 + 244)]
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 13 * 4)]
public OtherNestedStruct[] arrayOfStruct; // fixed array length 13
}
アップデート:
これが私の最新バージョンです:
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct NestedStruct
{
public Int16 someInt;
[MarshalAs(UnmanagedType.ByValArray, ArraySubType = UnmanagedType.U1, SizeConst = 242)]
public Byte[] characterArray; // an array of fixed length 242
}
[StructLayout(LayoutKind.Sequential , Pack=1)]
public struct OtherNestedStruct
{
public Int16 someInt;
public Int16 someOtherInt;
}
[StructLayout(LayoutKind.Sequential, Pack=1)]
public struct MainStruct
{
public double someDouble;
public NestedStruct nestedContent;
[MarshalAs(UnmanagedType.ByValArray, ArraySubType = UnmanagedType.Struct, SizeConst = 13)]
public OtherNestedStruct[] arrayOfStruct; // fixed array length 13
}