C++/CLI Как перевести этот код?

Я не очень много знаю о C++, но мне нужно заставить код C++ работать с .NET. Я пытаюсь использовать DLLImport, но мне это не удалось. Поэтому я пытаюсь с C++/CLI сделать что-то вроде оболочки.

Но я не уверен, что все понимаю...

Это базовый файл C++ H с функцией, которую я хочу экспортировать (MyFunction).

 extern "C"
 {
  __declspec(dllexport) IplImage* MyFunction(IplImage *src, std::string* name, OneEnumerationType myEnum, bool myBool, float myFloat);
 }     

Это код Wrapper h.

#include "MyFunction.h"; // the file containing the h code
#include <string>

namespace MyWrapper{
 public ref class MyWrapperClass {
     public: 
       MyWrapper(){};
       IplImage^ GetMyFunction(IplImage *src, std::string^ name, OneEnumerationType myEnum, bool myBool, float myFloat);
}

Это код cpp оболочки.

#include "MyWrapperCode.h";

namespace MyWrapper{
IplImage^ MyWrapperClass::GetMyFunction(IplImage* src, std:string^ name, OneEnumerationType myEnum, bool myBool, float myFloat){
  MyFunction(src, name, myEnum, myBool, myFloat);
 }
}

Это мои вопросы:

1) Когда я компилирую, ошибка "^: не может использовать эту косвенность для типа IplImage" и то же сообщение для типа "std::string". Я следовал этому логическому:

ClasseNative clNat2 = *clNat;  --> ClasseManagee clMan2 = *clMan;
ClasseNative &clNat3 = clNat2; -->  ClasseManagee %clMan3 = clMan2;
ClasseNative *clNat4 = &clNat2; --> ClasseManagee ^clMan4 = %clMan2;

Я видел, что лучше использовать System::String. Я пытаюсь так, но начальная функция использует std::string... Кстати, почему лучше изменить?

2) Как получить результат MyFunction IplImage? Я полагаю, через частный член и получение, но я не знаю, как его инициализировать...

3) Сложный вопрос. Могу ли я поместить CLI, получающий структуру IplImage (из библиотеки OpenCV) (результат моей функции) внутри структуры IplImage .NET, когда я буду вызывать свою оболочку? Не знаю, понятен ли вопрос...

Большое спасибо за твою помощь. 3 дня крутился с этой проблемой...


person PetersLast    schedule 10.04.2013    source источник


Ответы (2)


Ваш класс-оболочка должен создать новый std::string на основе содержимого параметра System::String^, а затем передать его вашей собственной функции. В противном случае вам нужно переписать функцию, чтобы она принимала в качестве строкового ввода что-то еще, например LPWSTR или LPCSTR.

Вы можете написать класс ссылки, чтобы иметь свойства для всех данных, которые будут иметь IplImage, а затем передать это вашему классу-оболочке. Затем ваш класс-оболочка создает объект IplImage на основе данных класса ref и передает его собственной функции. Измените направление копирования данных для возвращаемого значения.

person Sheng Jiang 蒋晟    schedule 10.04.2013
comment
Итак, мне нужно добавить тип System::String^ myVar в качестве частной переменной? И как передать данные из Std::string в System::String? - person PetersLast; 10.04.2013
comment
Как параметр. std:string в качестве локальной переменной для вызова вашей функции. Ваш потребитель класса управляемой оболочки не распознает собственный std:string. - person Sheng Jiang 蒋晟; 10.04.2013

1) просто добавив ^, вы не можете изменить собственный объект, чтобы он стал управляемым, вам нужно создать обертки или передать данные, например:

std::string nativeString = "my string";
String^ managedString = gcnew String(nativeString.c_str());
//now you can return it as 

2) создать управляемую оболочку или использовать примитивный тип данных для передачи данных

3) убедитесь, что это поможет, но посмотрите на Emgu.CV

попробуйте прочитать немного больше о C++\CLI, вот несколько хороших руководств:

Quick C++/ CLI — изучите C++/CLI менее чем за 10 минут

C++/CLI для программиста на C#

person makc    schedule 10.04.2013
comment
Спасибо за вторую ссылку. Первую я уже прочитал. - person PetersLast; 10.04.2013