我有两个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的成员?
答案 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));
分配的内存。