我正在将“非托管 C”代码编码为下面给出的 C# 代码。
[DllImport("ContainerDll.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern IntPtr NodeSearch(IntPtr firstNode, string key);
IntPtr firstNode = IntPtr.Zero;
private void button4_Click(object sender, EventArgs e)
{
IntPtr ret = NodeSearch(firstNode, "key_string");
}
//NodeSearch method will be called which is present in 'ContainerDll.dll'
//pointer to structure will be returned.
//my c-structure contains these fields.
// typedef struct container
// {
// char Name[20];
// void *VoidData;
// struct container *Link;
// }
// Node;
我的“IntPtr”类型的 C# 变量“ret”现在得到了指向这个结构的指针。它具有从“NodeSearch”方法返回的地址。
如何在 C# 表单应用程序(以及控制台应用程序)中访问它?
我想我不能这样使用:ret->Name[0]、ret->VoidData 等
我是初学者!你能取悦我吗?
最佳答案
您需要在 C# 中创建兼容的 struct
定义,并使用 Marshal类来编码指向结构的指针。
结构定义可能如下所示:
[StructLayout(LayoutKind.Sequential)]
struct Container
{
[MarshalAs(UnmanagedType.ByValTStr, CharSet = CharSet.Ansi, SizeConst = 20)]
string Name;
IntPtr VoidData;
IntPtr Link
}
然后您应该能够以类似于以下的方式编码指向该结构的指针:
var ret = NodeSearch(IntPtr.Zero, "key_string");
var retContainer = (Container)Marshal.PtrToStructure(ret, typeof(Container));
为了检索链接或无效数据,您还需要调用 Marshal.PtrToStructure
。
关于c# - 如何在 C# 中访问指向结构数据的编码指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7831127/