2015-01-27 3 views
1

Я использую некоторые службы, которые отправляют мне байтовый массив, используя UDP. Это служебное приложение было разработано в C - и этот массив байтов является структурой C.Как использовать структуру c/C++ в коде C#?

Я знаю, что я могу переопределить эту структуру на C# и с помощью атрибута StructLayout иметь такое же выравнивание члена (я прав?)

Но можно определить же структуру, используя управляемый C++/CLI и импортировать этот управляемый код C++ в мой проект C# и таким образом сделать сериализацию?

Если это возможно - так как это сделать? Я не могу найти какой-либо пример, когда я это сделаю.

+1

Тот же файл буквального кода, используемый в обоих проектах? Нет. Вы могли бы сделать это с третьим общим проектом и большим количеством конструкций '#ifdef .. # endif'. – Blindy

+0

У меня есть файл заголовка службы. Не могли бы вы объяснить, что вы имеете в виду, потому что я не понимаю. – Yanshof

+1

Вы делаете третий проект C++ между C# one и C++. Ваш заголовочный файл, находящийся в C++, должен быть скомпилирован в проекте C++ (неуправляемый для вашего исходного проекта и управляемый заглушка с только заголовком, на который ссылается проект C#). Вам нужно внести изменения условной компиляции ('ref class' vs' class' и т. Д.), Но тот же заголовочный файл * может * работать для обоих. – Blindy

ответ

5

Нет, это не поможет. В C++/CLI также различается собственная структура (ключевое слово struct) и управляемая структура (ключевое слово value struct). Вы можете, конечно, объявить структуру, используя #include, чтобы вы всегда использовали объявление C, вы даже можете заставить ее экспортировать структуру в метаданные с помощью #pragma make_public. Но компилятор C# просто увидит непрозрачный тип значения без каких-либо членов.

CLR прилагает много усилий, чтобы сделать компоновку структуры идентичной исходной компоновке, которую использует компилятор C или C++. Важно сделать interop эффективным, он делает структуру blittable. Но используемые ею правила совершенно преднамеренно не документированы и фактически зависят от конкретных типов членов структуры и битовности процесса. В неясных случаях это будет выгодно [StructLayout (LayoutKind.Auto)]. Вы можете найти пример такой неудачи here.

Предложение «иногда не» - это трюк, компилятор ничего не может предположить о макете. Вы все равно можете заставить C++/CLI окупиться своей способностью анализировать объявление структуры C с помощью #include. Это помогает избежать несчастных случаев либо путем неправильного объявления декларации управляемой структуры, либо при изменении кода C. Вам нужно объявить управляемую версию с ключевым словом public value struct, чтобы ваш код C# использовал его. Вы сомневаетесь, что это будет стоить дополнительного проекта, но, вероятно, это не так.

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