Есть несколько способов:
- Экспорт функций DLL и использование
DllImportAttribute
в P / Invoke в DLL.
- Если это COM DLL, то вы можете сгенерировать Callable Wrapper во время выполнения через TLBIMP.exe
- Вы можете использовать C ++ / CLI для создания создания сборки .Net, которая загружает и вызывает методы для DLL непосредственно.
Для решения ваших дополнительных проблем, да, вы можете использовать указатели в C #. Если у вас есть функция с параметром double*
, вы можете объявить это в C # следующим образом:
[DllImport("Your.DLL")]
private static extern unsafe void DoProcessing(double* data, int dataSize);
Вам необходимо убедиться, что вы установили флажок «Разрешить небезопасный код» на вкладке сборки проекта C #, и после этого вы можете использовать указатели для вашего сердца.
Тем не менее, обратите внимание, что хотя я предоставляю здесь сигнатуру указателя, так как вы, очевидно, знакомы с указателями, существуют другие сигнатуры, которые могут быть более безопасными для вас, и вам не потребуется компилировать C # с небезопасным кодом. , Стандартный маршаллер в CLR позаботится о преобразовании указателя в массив C #, при условии, что вы дадите ему подсказку, если потребуется длина:
[DllImport("Your.DLL")]
private static extern void DoProcessing(
[MarshalAs(UnmanagedType.LPArray, SizeParamIndex=1)] double[] data,
int dataSize);
Это указывает маршаллеру использовать параметр с индексом 1 (2-й параметр) в качестве размера массива пар, на который указывает 1-й параметр. Это позволяет вам избегать указателей в C # и использовать безопасные типы CLI. Однако, если вам нравятся указатели, я советую просто использовать их - вам будет проще использовать C #, чем выяснять, как писать сигнатуру метода без них.
Подробнее о P / Invoke см. В этой документации: http://msdn.microsoft.com/en-us/library/aa288468(VS.71).aspx