我目前正在编写一些代码,这些代码反映了从调用本机 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*。
有什么技术可以解决这个问题?
虽然您可能无法从 Object 转换为 IntPtr*,但可以转换为 IntPtr。记住,IntPtr*
只是一个指针指针。所以你可以到达第一个指针,然后将其转换回来。
var ptr1 = (IntPtr)(fi.GetValue(theStruct));
var ptr2 = (IntPtr*)(ptr1);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)