我需要创建一个空数据的二进制blob到PInvoke一个需要无符号char * null的本机C ++ dll。
本机C ++程序期望数据结构,中间有一个空的字节区域,但在C#中,我不能只在中间创建一个带有初始化byte []的结构。
我在C ++中的结构看起来像这样
struct myStruct
{
byte command;
byte returncode;
void* Source (a pointer to a string, rather a null term char*)
void* Destination (same thing)
byte filler [99]
byte options;
}
我已经想过我可以使用myStruct.Source = (void*)Marshal.StringtToGlobalAnsi(source)
取一个字符串并将其转换为字节数组(如果我错了,请纠正我)。
但我不知道如何在中间填写那个空的字节数组。
到目前为止,这是我的C#结构。
[StructLayout(LayoutKind.Sequential, Pack = 1)]
unsafe struct Trans_s
{
public byte command;
public byte returnCode;
public void* pSource;
public void* pDest;
public byte* filler;
public byte options;
}
答案 0 :(得分:2)
不,C ++代码不期望unsigned char*
的空值。它期望结构内有许多填充字节。
C# fixed
keyword可能会对您有所帮助。
答案 1 :(得分:2)
对于字节数组,您需要将C#结构中的字段标记为byvalarray。如果不这样做,默认的编组使用LPArray。
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 99)]
public byte[] filler;
创建结构实例时,需要为填充程序分配内存。