Существует несколько способов сделать это, но примеры, которые я пробовал, не сработали для меня.PInvoke стиль передачи структуры с элементом динамический массив указателей
Я где-то читал, что использование небезопасных указателей будет способом перехода на более сложные структуры, требующие указателей. (Извините, но я не смог найти источник снова)
Моя последняя попытка выглядит примерно так:
unsafe public struct ComplexStruct {
public Int32 NumSubStruct;
public SubStruct*[] arr;
}
unsafe public static extern UInt32 DLL_Call(ref ComplexStruct p);
function {
unsafe {
ComplexStruct p = new ComplexStruct();
p.NumSubStruct = 2;
p.arr= new SubStruct*[p.NumSubStruct];
SubStruct p1 = new SubStruct();
SubStruct p2 = new SubStruct();
p.arr[0] = &p1;
p.arr[1] = &p2;
testLogHandlerHandle = DLL_Call(ref p);
}
}
Я получаю ошибку, которая говорит, что SubStruct не может быть выстраивали (Подпись не Interop совместимый).
Возможно ли передать объект без маршалинга? (DLL должна быть загружена в том же пространстве процесса, что и приложение C#).
Если нет, то каким будет самый простой способ передать копию объекта?
Примечание: изменение DLL не является проблемой. Я смутно знаю некоторые другие решения, такие как C++/CLI, но у меня только относительно небольшое количество типов структуры, которые необходимо передать таким образом.
EDIT: Несколько заметок:
- массив должен с помощью динамического
Фактические структур немного более сложные (есть 4 слоя вложенных структур, как это), так что я думаю, что добавление они будут отвлекать внимание от вопроса, но для полноты картины, вот как я бы объявить их в C++:
struct ComplexStruct { unsigned int NumSubStruct; SubStruct** arr; }; struct SubStruct { unsigned int NumSubStruct; //some more datamembers here as well SubSubStruct** arr; };
(дополнительный окольные не надо, но я полагал, что это может быть полезно, чтобы иметь возможность объявить массив указателей SubStruct в IntPtrs)
Можете ли вы показать декларацию C++ для двух структур? Лично я очень сомневаюсь, что «небезопасно» - это путь. –
Эта дополнительная направленность может навредить вам. Без него было бы легче. –