【发布时间】:2016-03-11 02:18:41
【问题描述】:
考虑通过 TCP 将以下结构发送到非托管 dll
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
public struct FooMessage
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 42)]
public string foo;
//More fields...
}
使用以下函数(感谢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 不是 - 并且实际上使用最后一个字符(从编组器中总是出现空值)。
有什么想法吗?
澄清:我不能只将SizeConst改为43,因为我需要保持消息的总大小,以及结构体中下一个字段的位置(根据现有的 ICD)
【问题讨论】:
-
使用 char[] 确实是这样做的方法。
标签: .net string interop pinvoke marshalling