如何编组结构数组 - (。Net / C#=> C ++)

时间:2008-08-28 08:38:05

标签: .net interop marshalling

免责声明:编组概念几乎为零..

我有一个结构B,它包含一个字符串+一个结构C数组。我需要通过巨大的互操作差异将它发送给COM-C ++使用者。
我需要装饰我的结构定义的正确属性集是什么?

[ComVisible (true)]
[StructLayout(LayoutKind.Sequential)]
public struct A
{
    public string strA
    public B b;
}


[ComVisible (true)]
[StructLayout(LayoutKind.Sequential)]
public struct B
{
    public int Count;

    [MarshalAs(UnmanagedType.LPArray, ArraySubType=UnmanagedType.Struct, SizeParamIndex=0)]
    public C [] c;
}

[ComVisible (true)]
[StructLayout(LayoutKind.Sequential)]
public struct C
{
    public string strVar;
}

编辑:@Andrew 基本上这是我朋友的问题。他在.Net中使用了这个东西 - 他创建了一些自动生成的.tlb / .tlh,然后可以在C ++领域中使用它。 麻烦的是他不能修复数组大小。

2 个答案:

答案 0 :(得分:4)

C++: The Most Powerful Language for .NET Framework Programming

我正要接近一个需要整理C ++ / C#边界的结构化数据的项目,但我发现了什么是更好的方法(特别是如果你了解C ++并且喜欢学习新的编程语言)。如果您可以访问Visual Studio 2005或更高版本,则可以考虑使用C ++ / CLI而不是编组。它基本上允许您创建这个与C#100%兼容的神奇混合.NET /本机类库(好像您已经在C#中编写了所有内容,以便在另一个C#项目中使用它),它也与C 100%兼容和/或C ++。在您的情况下,您可以编写一个C ++ / CLI包装器,它将数据从内存中的C ++封装到内存类型的CLI中。

我运气很好,使用纯C ++代码读取和写出数据文件(这可能是某种类型的第三方库,甚至),然后我的C ++ / CLI代码转换(复制)将C ++数据转换成.NET类型,在内存中,可以直接使用,就好像我用C#编写了读/写库一样。对我来说唯一的障碍是语法,因为你必须学习C ++的CLI扩展。我希望StackYverflow能够在我学习这个时回答语法问题!

作为对语法跋涉的回报,您可能会学到可以想象的最强大的编程语言。想一想:C#和.NET库的优雅和健全,以及C ++的低级和本机库兼容性。您不希望在C ++ / CLI中编写所有项目,但它非常适合将C ++数据导入C#/ .NET项目。它“只是有效。”

教程:

答案 1 :(得分:1)

答案取决于你试图编组的原生定义是什么。您没有提供足够的信息供任何人真正提供帮助。

在本机数组中编组字符串时,人们常常惹恼的是,本机数组通常使用固定大小的缓冲区作为与结构内联分配的字符串。您的定义是将字符串编组为指向另一个包含字符串的内存块的指针(这是默认值)。

[MarshalAs(UnmanagedType.ByValTStr,SizeConst = ##)]可能就是你要找的......