Как разделить класс в Visual C ++ DLL с C #? - PullRequest
1 голос
/ 11 июля 2010

Я написал свою программу на C ++ и экспортировал ее как DLL.У меня есть C # WPF GUI, и я хочу импортировать DLL для выполнения обработки.

Я очень плохо знаком с C #.Как я могу использовать класс C ++ в C #?Я знаю, что не могу просто использовать файл .h.

Поскольку я использовал указатели в C ++, в C # я не мог использовать указатели.Вот почему я запутался.Как и в C ++, я использовал char* вместо string, и мне нужно вернуть double* для большой коллекции double данных и тому подобных вещей.

Ответы [ 2 ]

4 голосов
/ 11 июля 2010

Есть несколько способов:

  1. Экспорт функций DLL и использование DllImportAttribute в P / Invoke в DLL.
  2. Если это COM DLL, то вы можете сгенерировать Callable Wrapper во время выполнения через TLBIMP.exe
  3. Вы можете использовать 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

2 голосов
/ 11 июля 2010

Многое зависит от структуры вашей C ++ DLL.Если у вас есть всего несколько функций, и они не являются функциями-членами класса, то вы можете сделать их «внешними C» -функциями и использовать возможность P / Invoke в .NET (иногда называемую DllImport из-за используемого вами атрибута)для доступа к функциям из C #.

...