编组嵌套结构

时间:2016-08-02 13:00:38

标签: c# marshalling

我有两个C ++结构,如下所示。我必须在从C#调用DLL方法时获取结构。

例如,让我们在C ++代码中定义它们如下:

struct A
{
    int count;
    struct B;
}

struct B
{
    char* id;
    char* name;
}

C ++代码返回以下方法

A* GetData();

我需要从C#调用的方法具有以下签名:

IntPtr GetData ();

此方法指向结构A结构A中的填充计数,结构B中的id和名称。

在C#中,我将这些结构定义为类:

[StructLayout(LayoutKind.Sequential)]

class A
{

    public int count;
    public IntPtr B;
}

[StructLayout(LayoutKind.Sequential)]

class B
{

    public string id;
    public string name;
}

我创建了一个C ++ dll来从C#调用。

当我尝试从嵌套结构(A->B->id)读取数据时,出现读取违规错误(AccessViolationException)

如何编组嵌套结构,以便能够在C#方法中读取它?

我的C#代码如下

[DllImport("Win32Project.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Auto)]

public static extern IntPtr GetData();

A setting = new A();

setting.B = new IntPtr();

IntPtr deviceSettingptr = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(A)));

IntPtr settingsInfoptr = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(B)));

Marshal.StructureToPtr(setting, deviceSettingptr, false);

Marshal.StructureToPtr(setting.B, settingsInfoptr, true);

setting.B= settingsInfoptr;

deviceSettingptr = GetData();

setting = (A)Marshal.PtrToStructure(deviceSettingptr, typeof(A));

B info = (B)Marshal.PtrToStructure(setting.B, typeof(B));

Console.WriteLine(string.Format("Setting count={0}", setting.count));
Console.WriteLine(string.Format("Setting id={0}, Setting name={1}", info.id, info.name)); 

如何访问具有id和name的struct B的成员?

1 个答案:

答案 0 :(得分:0)

您发布的代码看起来有点奇怪。行之前的一切

deviceSettingptr = GetData();

似乎无关紧要。您没有显示GetData()的作用,但似乎此方法返回指向结构的指针。所以一开始阅读结构(大概是A):

deviceSettingptr = GetData();
setting = (A)Marshal.PtrToStructure(deviceSettingptr, typeof(A));

(此时,您之前对变量setting所做的任何事情都会过时。)

现在你想(可能)从B所指向的内存中读取setting.B类型的结构:

B info = (B)Marshal.PtrToStructure(setting.B, typeof(B));

在您的代码中,您使用了settingsInfoptr而未正确设置。

现在您可以访问id的{​​{1}}和name媒体资源了:

info

请注意,某人应该释放再次由Console.WriteLine(string.Format("Setting count={0}", setting.count)); Console.WriteLine(string.Format("Setting id={0}, Setting name={1}", info.id, info.name)); 分配的内存。

相关问题