c# - 如何在 C# 中访问指向结构数据的编码指针?

标签 c# c

我正在将“非托管 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/

相关文章:

c# - C#中组件的默认图标存放在哪里?

c - 数组静态分配

C - 等级边界程序,潜在的运行时错误?

c - 使用 IPC 在 while 循环内重定向 stdin

具有继承的字段的 c# 类设计

c# - UI 不像 ObservableCollection

c# - 将 Cmd 命令传递给 C# 应用程序

c# - .NET6最小API : Manipulating response after . MapGet

c - 为什么显示的地址为负值

C - 如何将数组指针设置回第一个内存字节