как получить доступ к маршалированному указателю на структурирование данных в c #?

#c# #c

#c# #c

Вопрос:

я маршалирую «неуправляемый код c» в свой код C #, приведенный ниже.

     [DllImport("ContainerDll.dll", CallingConvention = CallingConvention.Cdecl)]
    public static extern IntPtr NodeSearch(IntPtr firstNode, string key);

    IntPtr firstNode = IntPtr.Zero;

    private void button4_Click(object sender, EventArgs e)
    {
        IntPtr ret = NodeSearch(firstNode, "key_string");
    }

    //NodeSearch method will be called which is present in 'ContainerDll.dll'
    //pointer to structure will be returned.

    //my c-structure contains these fields. 

    //        typedef struct container
    //        {
    //             char Name[20];
    //             void *VoidData;
    //             struct container *Link;
    //        }       
    //             Node;
  

Моя переменная C # ‘ret’ типа ‘IntPtr’ теперь получила указатель на эту структуру. Он имеет адрес, возвращаемый из метода ‘NodeSearch’.

Как получить доступ к этому в приложении C # form (также в консольном приложении)?

Я думаю, что я не могу использовать так: ret-> Name[0], ret-> VoidData и т.д.

Я новичок! Не могли бы вы меня порадовать?

Комментарии:

1. Наткнулся на это blogs.msdn.com/b/jaredpar/archive/2008/11/05 /…

2. спасибо за ответ. это полезно для меня.

Ответ №1:

Вам нужно будет создать совместимое struct определение в C # и использовать класс Marshal для маршалирования указателя на структуру.

Определение структуры может выглядеть следующим образом:

 [StructLayout(LayoutKind.Sequential)]
struct Container
{
    [MarshalAs(UnmanagedType.ByValTStr, CharSet = CharSet.Ansi, SizeConst = 20)]
    string Name;
    IntPtr VoidData;
    IntPtr Link
}
  

Затем вы должны иметь возможность маршалировать указатель на эту структуру способом, аналогичным следующему:

 var ret = NodeSearch(IntPtr.Zero, "key_string");
var retContainer = (Container)Marshal.PtrToStructure(ret, typeof(Container));
  

Чтобы получить ссылку или пустые данные, вам также потребуется вызвать Marshal.PtrToStructure .

Комментарии:

1. Спасибо allot за подробный ответ. Я пройду через это и вернусь к вам. Это мой самый первый вопрос в разделе «переполнение стека». Спасибо.