Позвольте мне задать еще один вопрос, потому что, хотя я видел много подобных, никто не говорит об этом аспекте ... У меня есть C++ DLL (нет исходного кода, но .lib и .h) и Я написал необходимую управляемую оболочку. Нет проблем с этим, вопрос о структурах и перечислениях, определенных в исходном коде на C++, и их очень много, все они должны быть подвержены коду C#. В учебниках и образцах обычно используются простые типы данных, такие как float и strings, а не сценарии реального мира сложных структур данных.Использование структур C++/CLI из C#
Моя управляемая оболочка C++/CLI потребляет неуправляемые структуры из файлов заголовков DL .h. Функции члена класса, которые я обертываю, используют их все время. Следовательно, мне нужно использовать те же структуры в моем коде C#, передавая их и получая из кода на C++. Кажется очевидным, что я не могу избежать переопределения всех из них на C#, но даже тогда их использование проблематично. Давайте пример: простую структура, которая используется функцией в неуправляемом коде:
typedef struct INFO {
...
} INFO;
int GetInfo(INFO& out_Info);
я такая же структуру, объявленную в моем коде C++/CLI обертки:
public ref struct INFO_WRAP {
...
};
int GetInfo(INFO_WRAP out_Info);
Реализации в код обертки пытается преобразовать эту новую структуру исходной для потребления старого, неуправляемого кода:
int Namespace::Wrapper::GetInfo(INFO_WRAP out_Info) {
pin_ptr<INFO> pin_out_Info = out_Info;
return self->GetInfo(*(::INFO*)pin_out_Info);
}
Но это не компилируется (не может конвертировать между структурами и не с найдено подходящее преобразование).
Есть ли решение, которое не требует создания новых структур данных и ручного копирования всех элементов структуры все время и обратно? Не только из-за дополнительной работы и времени, но есть действительно много структур.
Первой причиной попытки 'ref structs' было то, что в реальных структурах есть много членов' char [n] '. Насколько я могу судить, я должен использовать 'array <>' и инициализировать их до нужного размера в конструкторе, из которых не имеет значений structs. Что касается функции маршалинга, хорошая идея, я использовал ее несколько раз в C#. –
'value struct' не позволяет вам определять конструктор * default *, но они позволяют вам определять любой другой конструктор. (Конструктор по умолчанию всегда «Assign zeros & nullptr для всех полей».) На мой взгляд, «ref struct» легко ошибиться с первого взгляда. Для максимальной ясности я всегда использую 'ref class' или' value struct' в моем коде, а не другие. –
Да, но я бы предпочел, чтобы эти структуры имели char (или другие) массивы по умолчанию, без необходимости вызова специального конструктора. И, просматривая Интернет, я нашел решение, используя шаблон C++. Немного похоже на хак, но умный в этом ... :-) Жаль, что комментарий не позволяет правильно отформатировать код ... –