Как вызвать С++ API из С# - программирование
Подтвердить что ты не робот

Как вызвать С++ API из С#

У меня есть довольно большая система, реализованная на С++, с которой мне нужно взаимодействовать. Система имеет довольно большой API, несколько С++ DLL. Эти DLL экспортируют классы С++, в отличие от симпатичного C-стиля API. и мне нужно использовать их из нового проекта С#.

Из того, что я знаю,.NET имеет три способа взаимодействия с родным программным обеспечением:

  • P/Invoke - который работает только с API-интерфейсом C
  • COM-объекты
  • С++/CLI

Итак, как я это понимаю, у меня есть три подхода:

  • Написание обертки в C и вызов ее с помощью P/Invoke. который кажется слишком много работы.
  • Написание обертки с COM. который я не знаю, как это сделать, и если это безумно легко, я неохотно изучаю то, что мне кажется - умирающая технология.
  • Написание обертки в С++/CLI. который кажется наименее работоспособным, хотя все еще много.

Мой вопрос:

  • Прежде всего, я хотел бы знать, почему .NET не позволяет мне просто использовать классы С++ "как есть"? Я предполагаю, что это вопрос памяти управление. и если это я более чем готов писать финализаторы, и реализация IDisposable. Из того, что я знаю, классы С++ просто действительно причудливые структуры, и поскольку P/Invoke поддерживает структуры и функции которые берут структуры как первый параметр, почему бы не поддержать классы?

  • Во-вторых, предполагая, что я действительно ленив, и его много скучных, утомительных, work, Что было бы лучшим способом использовать эти DLL? Возможность называть их непосредственно из С# было бы лучше. Если нет, то я бы любите автоматический инструмент для создания оберток. Кроме того, библиотеки DLL могут изменение, возможно, немного, но все же, id скорее не будет принудительным для ручной перезаписывания оберток.

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

Спасибо

4b9b3361

Ответ 1

Если вы готовы пойти ленивым способом, я бы предложил использовать инструмент для создания С# -компьютера для ваших классов С++. И, конечно, инструмент для создания такой обертки SWIG

Для получения дополнительной информации см. мой старый ответ на аналогичный вопрос

Ответ 2

То, как я это понимаю, на С++ вызывающие соглашения для методов в классах довольно грязные. На уровне файлов .LIB, которые используются компоновщиком, имена функций получают "украшенные" (см., Например, "Изменение имени" ). Кроме того, расположение переменных класса в памяти, по-видимому, различно между всеми различными реализациями С++ по сравнению с С#, поэтому Interop Marshaling является таким большая тема. Поэтому я предполагаю, что Microsoft считает, что слишком много проблем с низким уровнем, и, следовательно, слишком сложно, чтобы сделать это достойным.

Я использовал объекты P/Invoke и COM для привязки своего С# к С++, но я не использовал С++/CLI. Я много лет занимаюсь в COM, и это очень похоже на собственный язык. Поэтому, если вы никогда не делали COM, я думаю, вы правы, что на этом этапе не стоит изучать его. Если С++/CLI позволит вам взаимодействовать с объектами, вместо того, чтобы сжимать все через интерфейс C, я думаю, вы правы, что это лучший маршрут.