考虑以下结构体将被发送到未托管的dll上,通过TCP协议进行传输。
问题: 码化程序假定foo是以空字符结尾的字符串,然而非托管dll并不是如此 - 实际上它使用最后一个字符(这总是从码化程序中输出的null值)。
有什么想法吗?
澄清:我不能只将SizeConst更改为43,因为我需要保持消息的总大小以及结构体中下一个字段的位置(根据现有的ICD)。
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
public struct FooMessage
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 42)]
public string foo;
//More fields...
}
Using the following function (credit to Cheeso):
public byte[] RawSerialize( T item )
{
int rawSize = Marshal.SizeOf( typeof(T) );
IntPtr buffer = Marshal.AllocHGlobal( rawSize );
Marshal.StructureToPtr( item, buffer, false );
byte[] rawData = new byte[ rawSize ];
Marshal.Copy( buffer, rawData, 0, rawSize );
Marshal.FreeHGlobal( buffer );
return rawData;
}
问题: 码化程序假定foo是以空字符结尾的字符串,然而非托管dll并不是如此 - 实际上它使用最后一个字符(这总是从码化程序中输出的null值)。
有什么想法吗?
澄清:我不能只将SizeConst更改为43,因为我需要保持消息的总大小以及结构体中下一个字段的位置(根据现有的ICD)。