Для справки, этот вопрос касается доступа к C ++ NaturalPoint Camera SDK через C #.
Я пытаюсь передать реализацию виртуального метода из C ++ в C #. Проблема, с которой я сталкиваюсь, заключается в том, что виртуальный метод C ++ не находится в классе интерфейса, и я не могу это изменить. Вот объявление класса:
class CLAPI cCameraListener
{
public:
cCameraListener() {};
~cCameraListener() {};
virtual void FrameAvailable();
virtual void FrameOverflow();
virtual void ButtonPressed();
};
CLAPI определяется как:
#define CLAPI __declspec(dllexport)
Я не могу наследовать от класса cCameraListener в классе ref, поскольку он не является интерфейсным классом и не нашел способа представить виртуальные методы управляемому классу. Мне также нужно иметь возможность зарегистрировать слушателя, о котором я расскажу ниже.
Вот рабочая реализация C ++ для прослушивания кадров:
// process frames as they arrive
class FrameListener: public cCameraListener
{
public:
Camera *myCamera;
FrameListener(Camera *cameraPtr)
{
myCamera = cameraPtr;
};
void FrameAvailable()
{
Frame *thisFrame = myCamera->GetFrame();
// do something with the frame here
thisFrame->Release();
};
};
int _tmain(int argc, _TCHAR* argv[])
{
// startup camera
CameraManager::X().WaitForInitialization();
Camera *camera = CameraManager::X().GetCamera();
if(camera==0)
{
// print an error
return 1;
}
// set camera properties
camera->SendEmptyFrames(false);
camera->SendInvalidFrames(false);
camera->SetVideoType(SegmentMode);
// setup frame listener
FrameListener *myListener = new FrameListener(camera);
camera->AttachListener(myListener);
// start the camera
camera->Start();
// while loop holding thread
// clean up
camera->Release();
CameraManager::X().Shutdown();
return 0;
}
Вот некоторые из существующих кодов оболочки C ++ / CLI:
Ссылка: https://code.google.com/p/npcamerasdkdotnet/
public ref class MCamera{
public:
MCamera(Camera * camera){
this->camera = camera;
}
~MCamera(){
delete this->camera;
}
void Start(){camera->Start();}
void SetExposure(int Value){camera->SetExposure(Value);}
void SetThreshold(int Value){camera->SetThreshold(Value);}
void SetIntensity(int Value){camera->SetIntensity(Value);}
// TODO - WRAP THESE METHODS
//void AttachListener(cCameraListener * Listener);
//void RemoveListener(cCameraListener * Listener);
// other wrapped methods here...
private:
Camera * camera;
};
Обратите внимание, что в классе-оболочке MCamera необходимо реализовать метод AttachListener, для которого требуется указатель на класс cCameraListener, о котором говорилось выше.
Любые предложения будут оценены! Спасибо!