2013-04-04 4 views
14

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

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

  1. P/Invoke - который работает только на C API,
  2. COM объекты
  3. C++/CLI

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

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

Мой вопрос:

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

  2. Во-вторых, предполагая, что я действительно ленив, и его много скучно, утомительно, Работа: Какой был бы лучший способ использовать эти библиотеки DLL? возможность назвать их напрямую с C# была бы лучшей. Если нет, я бы люблю автоматический инструмент для создания оберток. Кроме того, DLL могут изменить, возможно, немного, но все же, идентификатор скорее не должен быть принудительно для ручной перезаписывания оберток.

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

Спасибо

+0

1. Поскольку разные DLL файлов имеют различные соглашения о вызовах. –

+2

http://stackoverflow.com/questions/2120690/tool-for-creating-net-wrappers-for-a-com-dll –

+0

Я думаю, что C++/CLI будет хорошим. Тем не менее, у меня нет опыта работы с экспортом C++. – chris

ответ

6

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

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

+0

Я принимаю ваш ответ за предложение SWIG. хотя мы закончили использование P/Invoke для C Wrapper. –

0

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

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

Смежные вопросы