C #: получение и использование IntPtr * через отражение - PullRequest
3 голосов
/ 14 июля 2009

В настоящее время я работаю над некоторым кодом, который отражает структуры, которые возвращаются из вызовов в нативную 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 *.

Какие методы доступны для решения этой проблемы?

Ответы [ 2 ]

1 голос
/ 14 июля 2009

Хотя вы, возможно, не сможете привести из Object в IntPtr *, вы можете привести к IntPtr. Помните, IntPtr* это просто указатель указателя. Таким образом, вы можете добраться до первого указателя и затем вернуть его обратно.

var ptr1 = (IntPtr)(fi.GetValue(theStruct));
var ptr2 = (IntPtr*)(ptr1);
0 голосов
/ 14 июля 2009

Чтобы добавить ответ JaredPar, взгляните на класс Marshal в .NET, он может иметь много полезных функций для вас.

MSDN Link

...