我想将一些数据从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);
}
答案 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]属性,没有必要和包装不必调整。