У меня есть довольно большая система, реализованная на C++, с которой мне нужно взаимодействовать. Система имеет довольно большой API, несколько C++ DLL. Эти DLL экспортируют классы C++, в отличие от симпатичного C-стиля API. и мне нужно использовать их из нового проекта C#.Как вызвать C++ API из C#
Из того, что я знаю, .NET имеет три способа взаимодействия с родным программным обеспечением:
- P/Invoke - который работает только на C API,
- COM объекты
- C++/CLI
Итак, как я понимаю, у меня есть три подхода соответственно:
- Написание обертки в C и вызов ее с помощью P/Invoke. который кажется, слишком много работает.
- Написание обертки с COM. который я не знаю, как это сделать, и если это безумно легко, я неохотно изучаю то, что мне кажется - умирающая технология.
- Написание обертки в C++/CLI. который кажется наименее трудным, хотя все еще много.
Мой вопрос:
Прежде всего, я хотел бы знать, почему не .NET позволяет мне просто использовать ++ классов C «как есть»? Я предполагаю, что это вопрос памяти . и если это, то я более чем готов писать финализаторы, и реализации IDisposable. Из того, что я знаю, классы C++ - это всего лишь действительно причудливые структуры, и поскольку P/Invoke поддерживает структуры и функции , которые берут структуры как первый параметр, почему бы не поддерживать классы ?
Во-вторых, предполагая, что я действительно ленив, и его много скучно, утомительно, Работа: Какой был бы лучший способ использовать эти библиотеки DLL? возможность назвать их напрямую с C# была бы лучшей. Если нет, я бы люблю автоматический инструмент для создания оберток. Кроме того, DLL могут изменить, возможно, немного, но все же, идентификатор скорее не должен быть принудительно для ручной перезаписывания оберток.
Для действительно хороший ответ, особенно в первой части, или хороший автоматический инструмент, я буду награждать баунти ...
Спасибо
1. Поскольку разные DLL файлов имеют различные соглашения о вызовах. –
http://stackoverflow.com/questions/2120690/tool-for-creating-net-wrappers-for-a-com-dll –
Я думаю, что C++/CLI будет хорошим. Тем не менее, у меня нет опыта работы с экспортом C++. – chris