2008-08-28 85 views
2

声明:近零与编组的概念..如何编组结构的数组 - (.NET/C#=> C++)

我有一个包含一个字符串+结构的数组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工作 - 他做了一些automagic让.tlb/.tlh创建,然后他可以在C++领域使用。 麻烦是他不能修复数组大小。

回答

1

答案取决于您尝试编组的原生定义。你没有提供足够的信息让任何人都能够真正帮助。

当本地数组中的字符串编组时,常见的事情是本地数组通常对与内部分配的字符串使用固定大小的缓冲区。你的定义是编组字符串作为指向另一个包含字符串的内存块的指针(这是默认值)。

[的MarshalAs(UnmanagedType.ByValTStr,SizeConst = ##)]可能你正在寻找...

4

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

我正要接近一个需要跨元帅结构化数据的项目C++/C#边界,但我发现什么可能是更好的方法(特别是如果你了解C++并喜欢学习新的编程语言)。如果您有权访问Visual Studio 2005或更高版本,则可以考虑使用C++/CLI而不是编组。它基本上允许您创建与C#100%兼容的这种神奇的混合.NET /本机类库(就好像您已经用C#编写所有内容,用于在另一个C#项目中使用它的目的),它也与C完全兼容和/或C++。在你的情况下,你可以编写一个C++/CLI包装器,将内存中的C++数据封装到内存类型的CLI中。我使用纯C++代码读取和写出数据文件(这可能是某种第三方库,甚至),然后我的C++/CLI代码将(复制)将C++数据转换为内存中的.NET类型,这些数据可以直接使用,就好像我已经在C#中编写了读/写库一样。对我来说,唯一的障碍是语法,因为你必须学习C++的CLI扩展。我希望我有StackOverflow问语法问题,回来时,当我正在学习这个!

作为对语法跋涉的回报,您可能会学习到最强大的可以想象的编程语言。想一想:C#和.NET库的优雅和完美,以及C++的低级和本地库兼容性。你不想用C++/CLI编写所有的项目,但将C++数据转换为C#/ .NET项目非常棒。它“只是有用”。

教程: