2

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

我有一个结构 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++ 领域中使用。问题是他无法修复数组大小。

4

2 回答 2

4

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

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

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

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

教程:

于 2008-08-28T23:13:18.957 回答
1

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

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

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

于 2008-08-28T12:52:00.480 回答