关于互操作性:如何封送结构数组-(.Net / C#=> C ++)

关于互操作性:如何封送结构数组-(.Net / C#=> C ++)

How to marshal an array of structs - (.Net/C# => C++)

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

我有一个结构B,它包含一个字符串+一个结构C的数组。我需要将它跨巨大的互操作鸿沟发送给COM-C ++使用者。
装饰结构定义需要哪些正确的属性集?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
[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 ++领域。
问题是他无法确定阵列大小。


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

我将要处理一个需要跨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扩展。我希望我早在学习此内容时就让StackOverflow提出语法问题!

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

教程:

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

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

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

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


推荐阅读