У меня есть довольно большая система, реализованная на С++, с которой мне нужно взаимодействовать. Система имеет довольно большой 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 скорее не будет принудительным для ручной перезаписывания оберток.
Для действительно хорошего ответа, особенно в первой части, или хорошего автоматического инструмента, я вознагражу награду...
Спасибо