小编vla*_*mir的帖子

编组从C++到C#的结构数组?

在我的C#代码中,我正在尝试从遗留C++ DLL中获取结构数组(代码我无法更改).

在该C++代码中,结构定义如下:

struct MyStruct
{
    char* id;
    char* description;
};
Run Code Online (Sandbox Code Playgroud)

我正在调用的方法(get_my_structures)返回一个指向MyStruct结构数组的指针:

MyStruct* get_my_structures()
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

还有另一种方法可以返回结构的数量,因此我知道返回了多少结构.

在我的C#代码中,我已经定义了MyStruct:

[StructLayout(LayoutKind.Sequential)]  
public class MyStruct
{
  [MarshalAsAttribute(UnmanagedType.LPStr)]    // <-- also tried without this
  private string _id;
  [MarshalAsAttribute(UnmanagedType.LPStr)]
  private string _description;
}
Run Code Online (Sandbox Code Playgroud)

互操作签名如下所示:

[DllImport("legacy.dll", EntryPoint="get_my_structures")]
public static extern IntPtr GetMyStructures();
Run Code Online (Sandbox Code Playgroud)

最后,获取MyStruct结构数组的代码如下所示:

int structuresCount = ...;
IntPtr myStructs = GetMyStructures();
int structSize = Marshal.SizeOf(typeof(MyStruct));    // <- returns 8 in my case
for (int i = 0; i < structuresCount; i++)
{
    IntPtr data = …
Run Code Online (Sandbox Code Playgroud)

.net c# c++ interop marshalling

5
推荐指数
1
解决办法
7550
查看次数

标签 统计

.net ×1

c# ×1

c++ ×1

interop ×1

marshalling ×1