Я звоню в родной DLL из C #. Для конкретной рассматриваемой функции одним из необходимых мне параметров является структура, которая содержит дважды косвенное поле (указатель на указатель).
Например, возьмите следующий прототип C и структуры:
int someFunc(SomeStruct* result);
struct SomeStruct
{
DWORD foo;
AnotherStruct** ppResultStruct;
}
struct AnotherStruct
{
DWORD bar;
}
Следующий код C # обеспечивает только один уровень косвенности для поля AnotherStruct, что неверно:
[DllImport("my.dll")]
public static extern int someFunc(SomeClass result);
[StructLayout(LayoutKind.Sequential)
public class SomeClass
{
int foo;
AnotherClass resultClass;
}
[StructLayout(LayoutKind.Sequential)]
public class AnotherClass
{
int bar;
}
Как мне добиться двойного косвенного обращения, которое здесь требуется? Я знаю, как это сделать в случае двояко-косвенного параметра для функции, но меня смущает тот факт, что он встроен в структуру.
Может быть, мне следует объявить поле AnotherClass как IntPtr, а затем прибегнуть к небезопасному коду, чтобы присвоить ему подходящее значение. Это правильный подход, и есть ли другие / лучшие варианты?