免责声明:编组概念几乎为零..
我有一个结构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 ++领域中使用它。 麻烦的是他不能修复数组大小。
答案 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 = ##)]可能就是你要找的......