2016-12-18 2 views
0

Я хотел бы экспортировать свой C# класс с C++/CLI:Вызов C# класс от C++/CLI

Вот мой заголовок (.h) файл и мой .cpp

using namespace System; 
using namespace Microsoft::Kinect; 
using namespace std; 
using namespace System::Runtime::InteropServices; 

class clrPrivate; 

class __declspec(dllexport) clr 
{ 
private: clrPrivate* _private; 



public: clr(); 
public: ~clr(); 


public: String^ calculate(Double* Robot_Points_Values[], CameraSpacePoint* human_point_cloud, unsigned char* bodyindexdata[]); 
}; 

и мой. CPP файл

// This is the main DLL file. 
#using "FULLPATH\MYDLL.dll" 
#include <msclr\auto_gcroot.h> 
#include "ClassLibrary4.h" 
#include <array> 
//#include "stdafx.h" 


using namespace Distance_Test; 
using namespace std; 
using namespace System::Runtime::InteropServices; 
using namespace Microsoft::Kinect; 
using namespace System; 

class clrPrivate 
{ 
public: msclr::auto_gcroot<MINIMUM_DISTANCE^> out; 
}; 


    clrPrivate* _private; 

     clr::clr() 
     { 
      _private = new clrPrivate(); 
      _private->out = gcnew MINIMUM_DISTANCE; 
     }; 

     String^ clr::calculate(Double* Robot_Points_Values[], CameraSpacePoint* human_point_cloud, unsigned char* bodyindexdata[]) 
     { 


      String^ output; 
     return output = _private->out->calculate(*Robot_Points_Values, *human_point_cloud, **bodyindexdata); 
      //return output = _private->out->value_return; 
     }; 

    clr::~clr() 
{ 
    delete _private; 
}; 

Когда я запускаю режим отладки он показывает мне 2 ошибки:

1) Ошибка C3395'clr :: высчитывает ': __declspec (dllexport) не может б е применяется к функции с __clrcall соглашения о вызове

2) Ошибки C2228 слева от «.value_return» должны иметь класс/структуры/объединение

я пытаюсь 2 дня теперь, чтобы найти решение, но я застрял. Если бы кто-то мог мне помочь, я был бы благодарен.

ответ

0

Вам не нужно __declspec (dllexport) для управляемых классов, поскольку они экспортируются автоматически, если вы не объявите их private/internal. Просто измените сигнатуру класса, как это:

public ref class clr 

Кроме того, если вы хотите использовать это из C# вы должны использовать управляемые массивы в подписи метода Calculate:

String^ calculate(array<Double*>^ Robot_Points_Values, CameraSpacePoint* human_point_cloud, array<unsigned char*>^ bodyindexdata); 
Смежные вопросы