Marshaled结构后跟固定大小的数据

时间:2016-05-26 14:18:41

标签: c# c++

我想将一些数据从c#传递给c ++。这些数据由struct和guid组成。由于guid是class,我决定在struct数据之后立即复制它。有一个更好的方法吗?这个解决方案可以正常工作,并且可以用c ++正确读取数据,但是我不担心是否存在这种情况,何时不起作用。

STRUCT:

[StructLayout(LayoutKind.Sequential, Pack = 1)]
struct TEST_STRUCT
{
    public Uint32 var1;
    public Uint32 var2;
}

使用:

TEST_STRUCT testStruct = new TEST_STRUCT(); // filled somewhere
byte [] guid; // defined above

IntPtr mem = Marshal.AllocHGlobal(Marshal.SizeOf(testStruct.GetType()) + guid.Length);
try
{
    Marshal.StructureToPtr(testStruct, mem, false);
    Marshal.Copy(guid, 0, new IntPtr(mem.ToInt64() + Marshal.SizeOf(testStruct.GetType())), guid.Length);

    // send data to c++ ...
}
finally
{
    Marshal.FreeHGlobal(mem);
}

1 个答案:

答案 0 :(得分:1)

在这种非常具体的情况下你会逃脱它,GUID没有对齐要求。结构总是24个字节长。

但这样做没有意义,pinvoke marshaller知道如何正确编组System.Guid。它是一个值类型(结构),而不是您所假设的类,其内部结构有意笨重,因此它与本机GUID完全匹配。你可以从Reference Source看到的东西。这是非常有意的,Guids在互操作中很重要,COM代码特别使用它们。

所需要的只是:

struct TEST_STRUCT
{
    public Uint32 var1;
    public Uint32 var2;
    public Guid guid;
}

我故意遗漏了[StructLayout]属性,没有必要和包装不必调整。