3

我目前正在处理一些代码,这些代码反映了从调用返回到本机 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*。

有哪些技术可以处理这个问题?

4

2 回答 2

1

虽然您可能无法从 Object 转换为 IntPtr*,但您可以转换为 IntPtr。记住,IntPtr*指针只是指针。所以你可以得到第一个指针,然后把它扔回去。

var ptr1 = (IntPtr)(fi.GetValue(theStruct));
var ptr2 = (IntPtr*)(ptr1);
于 2009-07-14T15:11:12.190 回答
0

To add to JaredPar's answer, take a look at Marshal class in .NET , it might have a lot of useful features for you.

MSDN Link

于 2009-07-14T15:15:15.320 回答