Как наиболее эффективно разделить код между C и C # (как Mono, так и Silverlight) - PullRequest
4 голосов
/ 11 августа 2010

Наше настольное приложение состоит из серверной части Mono / .NET 3.5, которая взаимодействует через USB с различными устройствами, и интерфейсной части Silverlight, которая взаимодействует с серверной частью через разъемы. Встроенное ПО для устройств разработано собственными силами на C. Чтобы ускорить процесс разработки и уменьшить количество ошибок, мы хотели бы поделиться кодом между нашим встроенным ПО и настольным приложением. Какие инструменты и методы вы бы предложили, чтобы мы могли это сделать? А еще лучше: что вы успешно использовали в своем программном обеспечении для решения аналогичной проблемы?

Двумя основными вещами, которыми мы хотели бы поделиться, являются структуры сообщений, которые определяют наш протокол связи, и данные, которые в настоящее время определяются через константы структуры / массива Си. Для протокольных сообщений мы в настоящее время вручную переписываем наши реализующие сообщения классы, чтобы они соответствовали определениям C, используя код C в качестве руководства. Для данных, которыми мы делимся, мы создали управляемое приложение C ++, которое ссылается на скомпилированный код C, а затем извлекает содержимое массивов в файл XML.

Наши методики работают, но они не оптимальны. С одной стороны, у нас было множество ошибок, связанных с нашей реинтерпретацией структур C как C #, из-за параллельного изменения кода C и ошибок программиста; мы хотели бы избежать этого класса ошибок в будущем развитии. Что касается обмена данными, у меня нет больших проблем с нашим текущим решением, но сопровождающий программы извлечения говорит, что это болезненный процесс, заставляющий это работать должным образом.

Мы немного ограничены в вещах, которые мы сможем изменить в прошивке для устройств. Во-первых, у нас есть большое разнообразие процессорных архитектур и встроенных платформ, поэтому код на C должен оставаться переносимым. С другой стороны, микропрограмма работает в режиме реального времени и ограничена доступным MIPS и объемом памяти, поэтому мы не можем ничего добавить с непредсказуемым или медленным временем выполнения.

Ответы [ 2 ]

2 голосов
/ 11 августа 2010

Попробуйте использовать буферы протокола, представляющие собой двоичный формат кодирования, не зависящий от языка программирования, который Google использует в качестве формата обмена данными между своими службами.

Идея состоит в том, что вы пишете файл .proto, который описывает структуру ваших данных, и запускаете компилятор буферов протокола, который генерирует код сериализации / десериализации для вашего языка. Это будет более эффективным, чем кодирование в XML, и сэкономит время на написание сериализаторов / десериализаторов вручную и устранит ошибки из-за неправильной реализации (поскольку они автоматически генерируются из высокоуровневого описания в случае буферов протокола).

Реализация Google поддерживает C ++, Java и Python, и есть независимая реализация для других языков, например, для C # есть это и это .

Существуют и другие подобные технологии, например, Экономия Facebook.

2 голосов
/ 11 августа 2010

Я хотел бы рассмотреть возможность использования XSLT-преобразования для генерации кода. Имейте XML, который определяет структуры протокола и имеют различные XSLT, которые генерируют C # и код C различных платформ. Затем используйте сгенерированный код при создании приложений.

Преобразование XSLT можно сделать частью сборки проекта, я использовал эту технику в нескольких проектах, как описано в Использование XSLT для генерации кода счетчиков производительности (хотя этот пост не о протоколах связи, я на самом деле использовала одну и ту же технику для протоколов связи, как проводных, так и между модулями). Когда вы преодолеете трудности, связанные с написанием XSL и XQuery, вы станете очень продуктивными и по достоинству оцените, насколько легко и быстро вы можете изменить протокол связи.

...