Автоматическое создание оберток С# из c заголовков?
Есть ли способ автоматически создавать оболочки p/invoke для .net из заголовка c?
Конечно, я мог бы создать их вручную, но поддерживать их было бы больно, и я, вероятно, допустил бы ошибку, из-за чего сложно было бы отлаживать сбои.
Я попробовал SWIG, но он создал полные классы, в которых достаточно простых структур.
Еще одна проблема с SWIG заключается в том, что для этого требуется дополнительный код взаимодействия на стороне c.
Я бы предпочел, чтобы выход работал на моно, но это не обязательно.
Еще одна вещь, с которой я мог бы работать, - это программа, которая анализирует заголовок c и создает вывод в хорошем промежуточном формате, таком как xml, из которого я могу сам создать оболочку С#.
Edit:
PInvoke Interop Assistant - это то, что мне нужно.
Есть некоторые небольшие проблемы с ним:
* Он переводит "unsigned char *" в строку, где я бы предпочел IntPtr
* Предполагается, что size_t = int = long = 32bit. Это в настоящее время верно для меня, но может быть не верно на каждой платформе.
Есть ли чистый способ исправить это? Else Я буду использовать немного поиска и замены в коде c перед его преобразованием.
Ответы
Ответ 1
PInvoke Interop Assistant должен быть лучше подходит вам, он был специально разработан для работы с C-кодом.
Просто остерегайтесь того, что ни один инструмент не дает вам 100% гарантированного решения, декларации C слишком неоднозначны, чтобы гарантировать абсолютно безотказный результат. Проблема, вызванная указателями, вездесущая в коде C. Там нет способа сказать, что указатель используется для чтения или записи памяти. Или оба. Или кто несет ответственность за освобождение памяти, на которую ссылаются.
Это серьезное зависание для статических анализаторов кода, они не могут выполнять достойную работу, если они не знают, как используется указатель. Они могут только вывести его из использования, но проблема с курицей и яйцом, использование может быть неправильным. Microsoft рассмотрела проблему в своих собственных заголовках с помощью аннотаций SAL, дополнительную разметку, нейтральную для компилятора, но которую можно проанализировать с помощью анализатора кода. Они явно указывают предполагаемое использование указателя.
Также используется помощником Pinvoke Interop Assistant, поэтому он может лучше справляться с объявлениями winapi. Но это, конечно, работает только на заголовках Microsoft, эти аннотации SAL обычно отсутствуют в коде, написанном программистом, занятым C.
Ответ 2
Если я правильно понимаю ваш вопрос, вы в основном спрашиваете, есть ли способ сделать то, что делает SWIG.
Конечно, вы хотите сделать это немного по-другому, поэтому одним из вариантов было бы взять код SWIG и изменить его так, как вам хотелось бы.