C#:检索,并通过使用反射一个IntPtr *(C#: Retrieving and using a

2019-09-18 17:59发布

我目前工作的一些代码,这反映了被封从回调到本地的dll结构。 一些结构中包含指向指针的空值终止阵列的IntPtr *领域。 这些领域需要特殊处理。 当体现在结构,因为它们是由一个自定义属性标记,我认得出这些字段。

下面举例说明什么,我试图做的:

public void ProcessStruct(object theStruct)
{
    foreach (FieldInfo fi in theStruct.GetType().GetFields(BindingFlags.Public |  BindingFlags.Instance))
    {
        if (fi.FieldType.IsPointer && IsNullTermArray(fi))
        {
            //Has the custom attribute, commence processing of 
            //IntPtr* pointing to null-terminated array
            ProcessIntPtr(fi.GetValue(theStruct));
        }
        else{/*..Other Processing..*/  }
    }
}
public void unsafe ProcessIntPtr(IntPtr* ptr)
{
    //Iterate over the array and process the elements
    //There are pointer operations here.
}

问题是,

  fi.GetValue(theStruct)

返回一个对象,这是我显然不能直接传递到ProcessIntPtr()。 我不能改变ProcessIntPtr()的签名接受一个对象,那我不就能够完成,我需要的是指针操作。 很显然,我也无法施展从对象到IntPtr的*。

什么技术可用来处理这个问题?

Answer 1:

虽然你可能无法从对象转换为IntPtr的*,您可以转换为IntPtr的。 请记住, IntPtr*只是一个指针的指针。 所以,你可以得到第一指针,然后将它转换回。

var ptr1 = (IntPtr)(fi.GetValue(theStruct));
var ptr2 = (IntPtr*)(ptr1);


Answer 2:

为了增加JaredPar的答案,看看在.NET Marshal类,它可能有很多对您有用的功能。

MSDN链接



文章来源: C#: Retrieving and using an IntPtr* through reflection