Общие общие определения для C / C ++ (неуправляемый) и управляемого кода C # - PullRequest
3 голосов
/ 22 декабря 2009

У меня есть набор определений структуры, которые используются как управляемыми компонентами C #, так и неуправляемыми компонентами C / C ++.Прямо сейчас, идентичные определения структуры существуют отдельно в коде C / C ++ и C # - вызывая дублирование и связанный хаос.Каков наилучший способ сохранить отдельные определения, которые можно использовать как в C #, так и в C / C ++?Спасибо!Amit

PS: Я парень C / C ++, так что, если есть очевидный способ сделать это, я мог бы упустить его полностью!

Ответы [ 3 ]

3 голосов
/ 22 декабря 2009

Очевидно, я не знаком с вашим проектом (-ами), но рассматривали ли вы возможность создания управляемого моста для вашей библиотеки в C ++ / CLI ? С помощью хакерского «It Just Works» компилятор C ++ / CLI сделает для вас много раз, когда вы сможете упорядочивать и обмениваться управляемыми типами с собственным кодом и обратно.

Опять же, я не знаю, подходит ли вам это без каких-либо подробностей, но, возможно, стоит посмотреть.

1 голос
/ 22 декабря 2009

Однажды я хотел сделать это в одном из моих проектов, в котором было жесткое разделение между кодом C # и кодом C. В идеале код C # должен был бы заимствовать заголовочные файлы из кода C, но:

  • , так как C # не поддерживает include, я не понимаю, как вы могли бы поделиться определением структуры и включить его в код C # или C / C ++
  • иметь мои определения структуры в отдельных заголовках в любом случае было неудобно
  • Я не хотел полагаться на IDL или на пользовательский «предварительный анализ заголовков C и только извлечение определений структур»
1 голос
/ 22 декабря 2009

вам нужен IDL ( язык определения интерфейса ). Попробуйте googling:

  1. протокол буфера.
  2. ICE (механизм интернет-связи).
  3. Возможно, Microsoft COM?.
  4. - изменить: новая запись - похоже, Microsoft имеет IDL компилятор .

Все зависит от того, что вы хотите. Все вышеперечисленные технологии имеют элемент IDL и поставляются с собственным набором багажа. Лично я бы оставался на низком уровне C / C ++: D. Поэтому я бы использовал Google "Imatix GSL" и использовал упомянутую технологию для моделирования проблемы в XML и создания структур данных в любом Язык программирования - эта технология очень простая и тонкая и требует опытного программиста, поэтому, если это не имеет смысла, вам следует придерживаться IDL.

- редактировать: техника программирования -

Вы можете решить проблему чисто техникой, если хотите. Хаос наступает, когда строгость инженерного искусства рушится. Если вы решили использовать брандмауэр и инкапсулировать проблему в чистый код C / C ++, вам не придется беспокоиться о падении интерфейса в зависимом коде - это потому, что любой полезный язык может взаимодействовать с ABI вашей платформы (простые функции C: P). Суть не в том, чтобы выставить внутренние объекты, а просто в интерфейсе с непрозрачными типами, такими как числовые дескрипторы, которые представляют объекты и функции, которые могут быть выполнены для ваших типов.

...