考慮通過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是一個以null結尾的字符串,而非託管dll則不會 - 並且實際上使用最後一個char(它總是從編組器中變爲null)。
任何想法?
澄清:我不能只是將SizeConst更改爲43,因爲我需要保留消息的總大小以及結構中下一個字段的位置(根據現有的ICD)
使用char []確實是這樣做的方法。 – 2010-08-17 11:41:04