在C#中创建空的本机C ++字节*到PInvoke

时间:2011-08-11 23:06:26

标签: c# marshalling

我需要创建一个空数据的二进制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;
}

2 个答案:

答案 0 :(得分:2)

不,C ++代码不期望unsigned char*的空值。它期望结构内有许多填充字节。

C# fixed keyword可能会对您有所帮助。

答案 1 :(得分:2)

对于字节数组,您需要将C#结构中的字段标记为byvalarray。如果不这样做,默认的编组使用LPArray。

[MarshalAs(UnmanagedType.ByValArray, SizeConst = 99)]
public byte[] filler;

创建结构实例时,需要为填充程序分配内存。