Вероятно, лучший способ для этого - использовать P / Invoke или Platform Invoke. В зависимости от структуры или вашего dll-интерфейса C ++ вы можете обернуть его в чистый C-интерфейс; это проще всего, если ваш интерфейс использует только типы blittable . Если вы ограничите свой dll-интерфейс для blittable типов (Int32, Single, Boolean, Int32 [], Single [], Double [] - основы), вам не нужно будет выполнять какое-либо сложное маршалинг данных между managed (C #) и неуправляемые (C) области памяти.
Например, в вашем коде c # вы определяете доступные вызовы в dll C / C ++, используя атрибут DllImport.
[DllImport, "ExactDllName.dll"]
static extern boolean OneOfMyCoolCRoutines([In] Double[] x, [In] Double[] y, [Out] Double result)
Маленькие [In] и [Out] не обязательны, но они могут ускорить процесс. Теперь, добавив «ExactDllName.dll» в качестве ссылки на ваш проект C #, вы можете вызывать функцию C / C ++ из своего кода C #.
fixed(Double *x = &x[0], *y = &y[0] )
{
Boolean returnValue = OneOfMyCoolCRoutines(x, y, r);
}
Обратите внимание, что я по сути передаю указатели назад и четвертый между моим dll и C # кодом. Это может привести к ошибкам памяти, потому что расположение этих массивов может быть изменено сборщиком мусора CLR, но DLL C / C ++ ничего не будет знать об этом. Поэтому, чтобы защититься от этого, я просто исправил эти указатели в моем C #, и теперь они не будут перемещаться в памяти, пока моя dll работает с этими массивами. Теперь это небезопасный код, и мне нужно скомпилировать мой код C # с этим флагом.
Существует много мелких деталей для взаимодействия языков, но это должно помочь вам. Приверженность интерфейсу C, не поддерживающему состояние, для blittable типов - отличная политика, если это возможно. Это сделает код вашего языкового взаимодействия максимально чистым.
Удачи,
Пол