В моем приложении необходимо передать абсолютно произвольный объект/структуру в C++-функцию с помощью P/Invoke. Согласно Интернету, любые объекты могут передаваться как структуры C++ (они привязаны к определенной ячейке памяти в течение всего времени вызова). Поскольку меня интересуют только данные и не планируют вызывать какой-либо метод, это соответствует моим потребностям достаточно хорошо. Однако эксперименты показывают, что эти объекты должны иметь атрибут [StructLayout(LayoutKind.Sequential)]
, иначе код не будет компилироваться. К сожалению, классы создаются другими разработчиками и не гарантируют наличие этого атрибута.Как создать структуру с динамическими свойствами и атрибутами в C#
Чтобы решить эту проблему, одно решение было бы передать объект в специальной C# оберточной функции, которая будет:
- получить свойства объекта с помощью
Type.GetProperties
- Динамически создать на структуру с необходимыми свойствами и скопировать значения из объекта.
- Добавить
[StructLayout(LayoutKind.Sequential)]
атрибут. - Передайте эту структуру в C++ вместе с метаданными извлеченных на шаге 1 (так что C++ знает, что структура объекта и как ее читать)
Как я новичок в C#, я не уверен, как создавать структуры с произвольными свойствами и атрибутами динамически. То, что я нашел до сих пор, - MakeGenericType и ExpandoObject, но необходимо создать динамическую структуру, которая ранее не была определена нигде - даже не как общий объект. Есть идеи?
Вы можете использовать 'VARIANT' на неуправляемой стороне и' object' на управляемой стороне. Не нужно ничего переустанавливать. –