Подтвердить что ты не робот

Самый простой способ генерировать код P/Invoke?

Я опытный программист .Net, но не скомпилировал программу C/С++ в своей жизни. Теперь у меня есть C-dll, заголовки и документация (сторонний, а не Win API), из которых мне нужно вызвать около десяти методов.

Я думал об использовании Platform Invoke. Я нашел эти три инструмента, которые создадут для меня код:

и, возможно,

Pinvoker, похоже, имеет немного иной подход, чем помощник Interop и Wizard. Swig, который я только что обнаружил, проверяя, что этот вопрос здесь не задавался.

Каковы плюсы и минусы этих инструментов?

Что было бы самым лучшим = самым простым и безопасным способом для создания кода P/Invoke, учитывая, что я мало что знаю о C/С++?

4b9b3361

Ответ 1

См. http://dotnetperls.com/dllimport-interop для примера взаимодействия, и этот Статью MSDN для получения дополнительной информации. Библия для этого материала Адам Натан книга.

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

Вы должны проверить, есть ли какой-либо COM-интерфейс для DLL. Убедитесь, что вам действительно нужно сначала использовать P/Invoke.

SWIG был первоначально предназначен для переноса кода C/С++ для использования на языках сценариев. Он генерирует код С# из описания интерфейса (см. tutorial). Я бы не рекомендовал использовать его из С#, если параметр P/Invoke является опцией.

Ответ 2

если сигнатуры функций просты, то для настройки нужно занять 10 минут, т.е. если они принимают 2 char * и возвращают int. Его только один раз они усложняются, что он становится грязным

Библия на pinvoke Адам Натанс -.NET и COM: полное руководство по совместимости

И я согласен с другим плакатом - swig - это не правильная вещь