C#:通过反射检索和使用IntPtr *

时间:2009-07-14 15:09:02

标签: c# reflection unsafe

我正在研究一些代码,这些代码反映了从调用到本机dll的编组结构。一些结构包含指向以null结尾的指针数组的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 *。

有哪些技术可以解决这个问题?

2 个答案:

答案 0 :(得分:1)

虽然您可能无法从Object转换为IntPtr *,但您可以转换为IntPtr。请记住,IntPtr*只是一个指针指针。所以你可以到达第一个指针然后再将其转换回来。

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

答案 1 :(得分:0)

要添加到JaredPar的答案,看一下.NET中的Marshal类,它可能有很多有用的功能。

MSDN Link