#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 за подробный ответ. Я пройду через это и вернусь к вам. Это мой самый первый вопрос в разделе «переполнение стека». Спасибо.