Автоматически создавать оболочки C # из заголовков c? - PullRequest
17 голосов
/ 25 марта 2010

Есть ли способ автоматически создавать p / invoke оболочки для .net из заголовка c?

Конечно, я мог бы создавать их вручную, но поддерживать их было бы больно, и я, вероятно, где-то допустил бы ошибку, что привело бы к трудным отладкам сбоев.

Я попробовал SWIG, но он создал полные классы, где было бы достаточно простых структур. Другая проблема с SWIG заключается в том, что для этого требуется дополнительный код взаимодействия на стороне c.

Я бы предпочел, чтобы вывод работал и на моно, но это не обязательно.

Еще одна вещь, с которой я мог бы поработать, - это программа, которая анализирует заголовок c и создает вывод в хорошем промежуточном формате, таком как xml, из которого я могу самостоятельно создавать оболочку C #.

Edit:
PInvoke Interop Assistant - это то, что мне нужно.
Однако есть некоторые небольшие проблемы:
* Переводит "unsigned char *" в строку, где я бы предпочел IntPtr
* Предполагается, что size_t = int = long = 32bit. В настоящее время это верно для меня, но не может быть верно для каждой платформы.
Есть ли чистый способ исправить это? В противном случае я буду использовать немного кода поиска и замены в коде c перед его преобразованием.

Ответы [ 2 ]

10 голосов
/ 25 марта 2010

PInvoke Interop Assistant должен быть лучше для вас, он был специально разработан для работы с кодом C.

Просто имейте в виду, что ни один инструмент не дает 100% гарантированного решения, объявления C way слишком неоднозначны, чтобы гарантировать абсолютно безаварийный результат. Проблема, вызванная указателями, вездесущими в C-коде. Нет никакого способа сказать, что указатель используется для чтения или записи памяти. Или оба. Или кто отвечает за освобождение памяти, на которую указывают.

Это серьезное зависание и для статических анализаторов кода, они не могут делать достойную работу, если не знают, как используется указатель. Они могут только вывести его из употребления, но это проблема курицы и яйца, использование может быть неправильным. Microsoft решила эту проблему в своих заголовках с помощью SAL аннотаций , дополнительной разметки, которая нейтральна для компилятора, но может быть проанализирована анализатором кода. Они явно указывают на предполагаемое использование указателя.

Также используется помощником Pinvoke Interop, поэтому он лучше справляется с декларациями winapi. Но это, конечно, работает только для заголовков Microsoft, эти аннотации SAL обычно отсутствуют в коде, написанном занятым программистом C.

1 голос
/ 25 марта 2010

Если я правильно понимаю ваш вопрос, вы в основном спрашиваете, есть ли способ сделать то, что делает SWIG.

Конечно, вы хотите сделать это немного по-другому, поэтому одним из вариантов будет взять код SWIG и изменить его так, чтобы он работал так, как вам хотелось бы.

...