2011-03-22 2 views
1

У меня есть «родная» DLL с некоторыми хорошими функциями, которые могут возвращать (и принимать) указатели на данные, которые отформатированы в соответствии с конкретными C-структурами.Вызов родных DLL-функций, которые возвращают (и принимают) указатели на структуры

В моей программе на C# меня не интересуют внутренние структуры, я просто хочу их получить и передать из собственных функций. Мне уже удалось выделить функции внутри DLL. Для указателей я думал об использовании void * (как «указатель к неизвестному»), так как мне действительно не нравятся внутренние поля выделенных структур, мне просто нужно хранить и использовать указатели для передать его в библиотечные функции библиотеки DLL.

Но использование void * для многих разных типов данных делает мой код нечитаемым! Есть ли способ в C# для typedef void * some_nicer_type_t? Или делать что-то подобное?

ответ

2

Вместо этого вы можете использовать .

От MSDN:

тип конкретной платформы, которая используется для представления указателя или дескриптора.

Это может в конечном итоге помочь вам в написании кода не unsafe.

EDIT:

Для решения ваших желаемых потребностей подтвержденное в комментарии к этому вопросу, одна вещь, которую я мог бы предложить (хотя и не предлагают это, чтобы быть идеальным) является определение struct или class который является по существу обертка вокруг указателя:

public struct TypedPointer 
{ 
    public IntPtr UnderlyingPointer; 
} 

Как вы сами воспитывать, это может привести к оберточной еще больше кода для того, чтобы все это соответствует использованию и эстетике использования, которые вы хотите.

+0

Спасибо, но IntPtr продолжает быть IntPtr для всего. Это может быть чище, но для меня это грязно и бессмысленно, как пустота *. Я попробовал typedef IntPtr someothertype_t, но он не компилируется. Как я могу просто определить новые типы? Я предполагаю, что я должен использовать некоторое обходное решение, например, обернуть IntPtr внутри какого-либо объекта, а затем использовать обертки для этих функций. Ух, раздражает. – gd1

+0

@ Giacomo: Обновлен мой ответ, но на самом деле он просто накладывается на ваш обновленный комментарий. –

+0

Благодарим вас за помощь и внимание. Это решение - лучшее, что можно сделать. – gd1

1

IntPtr

это путь.
Только область, в которой вы должны быть осторожны, - это управление памятью. Небезопасно или нет - для C# нужна ссылка, иначе она будет раньше или позже собрана мусором - потенциально также, когда одна из внешних dll использует ее. Таким образом, вам необходимо убедиться, что ссылка на IntPtr сохраняется так долго, как это необходимо на стороне C#.

+0

Я сделаю это – gd1

Смежные вопросы