如何封送结构数组-(.Net / C#=> C ++)

时间:2020-03-05 18:44:16  来源:igfitidea点击:

免责声明:编组概念接近于零。

我有一个结构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;
}

编辑:@安德鲁
基本上这是我朋友的问题。他在.Net中具有此功能。他会自动创建.tlb / .tlh,然后将其用于C ++领域。
问题是他无法确定阵列大小。

解决方案

回答

答案取决于我们也想编组的本机定义是什么。我们没有提供足够的信息来帮助任何人。

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

[MarshalAs(UnmanagedType.ByValTStr,SizeConst = ##)]可能就是我们想要的...

回答

C ++ :. NET Framework编程最强大的语言

我将要处理一个需要在C ++ / Cboundary中封送结构化数据的项目,但是我发现了一种更好的方法(尤其是如果我们了解C ++并且喜欢学习新的编程语言时)。如果可以访问Visual Studio 2005或者更高版本,则可以考虑使用C ++ / CLI而不是封送处理。它基本上允许我们创建一个与C 100%兼容的魔术混合.NET /本机类库(就好像我们已经用C#编写了所有内容,以便在另一个Cproject中使用它一样)也与C和100%兼容。 /或者C ++。在情况下,我们可以编写一个C ++ / CLI包装器,将数据从内存中的C ++整理到内存类型中的CLI。

我很幸运,使用纯C ++代码读取和写入数据文件(甚至可能是某种第三方库),然后我的C ++ / CLI代码将C ++数据转换(复制)为.NET类型在内存中,可以像在C#中编写读/写库一样直接使用。对我而言,唯一的障碍是语法,因为我们必须学习C ++的CLI扩展。我希望我早在学习本文时,就可以让StackOverflow提出语法问题!

作为遍历语法的回报,我们可能学习了可以想象到的最强大的编程语言。想想看:.NET库Cand的优雅和理智,以及C ++的低级和本机库兼容性。我们不想用C ++ / CLI编写所有项目,但是将C ++数据导入C#/。NET项目非常有用。它"有效"。

教程:

  • http://www.codeproject.com/KB/mcpp/cppcliintro01.aspx