C ++ / CLI или C # P / Invoke для большой библиотеки C, вызывая функцию extern - PullRequest
4 голосов
/ 14 сентября 2011

Теперь я знаю, что есть довольно много вопросов по этому поводу, но в целом они относятся к библиотекам c ++.

У меня довольно важный C dll (примерно 2800 функций), и мне нужно сделать API для примерно70 из них могут быть вызваны в C #.Я начал с использования P / Invoke, но это довольно утомительно, потому что у меня есть сложные структуры для передачи и возврата из кода C (структуры с указателями на другие, двойные указатели и т. Д.), И мне требуется много времени, чтобы получить то, что мне нужно.

Сейчас я совсем не знаю C ++ / CLI, но у меня есть небольшой опыт работы с C ++ (хотя и немного).

Мне интересно, стоит ли прилагать усилия, чтобы изучить это?для моего проекта.Позволит ли использование оболочки C ++ позволить мне не бороться с маршалловыми структурами, размещением указателей в глобальной куче и т. Д. Или нет? ....

Большое спасибо и большие взлеты в это замечательное сообщество

Ответы [ 2 ]

6 голосов
/ 14 сентября 2011

Это довольно большая площадь поверхности.Я думаю, что C ++ / CLI будет проще, чем P / invoke.Вам не нужно использовать какие-либо функции C ++, вы можете написать то, что по сути является C, скомпилировать и экспортировать его с C ++ / CLI.

3 голосов
/ 14 сентября 2011

Трудно иметь дело с нативными структурами из C #.Так что написание оболочки C ++ / CLI проще.Вы можете преобразовать / обернуть эти структуры в ref classes без особых проблем и использовать их в C #.

void some_function(Some_Struct * ss)
{
  //...
}

struct Some_Struct
{
  int intVal;
  double dblVal;
}

//C++/ClI
public ref class Wrapper
{
  public:
    void CallSomeFunction(int intval, double doubleval)
    {
      Some_Struct * ss = new Some_Struct(); // maybe malloc is more appropriate.
      ss->intVal = intval;
      ss->dblVal = doubleval;
      some_function(ss);
      delete ss; // or Free(ss);
    }
}

//C#
Wrapper wrapper = new Wrapper();
wrapper.CallSomeFunction(10,23.3);
...