我一直在尝试为我创建的C ++类创建ac#包装器。我环顾了如何执行此操作,但是这些示例似乎都没有使用类和对象。我在c ++中有以下代码:
#ifndef PORTAUDIOMANAGER_H
#define PORTAUDIOMANAGER_H
#include "portaudio.h"
#include "pa_asio.h"
class PortAudioManager
{
public:
PortAudioManager();
virtual ~PortAudioManager();
static PortAudioManager* createObject();
void openStream();
void dispose(PortAudioManager* obj);
void stopStream();
typedef struct
{
float left_phase;
float right_phase;
}
paTestData;
private:
void* stream;
paTestData data;
static PortAudioManager* audioManager;
};
#endif
该createObject
方法创建PortAudioManager的新对象,并将其注册到audioManager指针。该dispose
方法充当析构函数(因为我认为您不能在C#中使用构造函数和析构函数)。
因此,应该如何使用它就像这样:
PortAudioManager manager = PortAudioManager.createObject();
manager.openStream();
我将如何创建一个可以在C#中使用的系统?如果您需要更多信息,请告诉我。
创建一个新的类库项目,并使用/ clr标志进行编译。给定上面显示的本机C ++类,添加以下C ++ / CLI类以包装本机类:
public ref class PortAudioManagerManaged
{
private:
PortAudioManagerManaged(PortAudioManager* native)
: m_native(native) { }
public:
PortAudioManagerManaged()
: m_native(new PortAudioManager) { }
// = IDisposable.Dispose
virtual ~PortAudioManagerManaged() {
this->!PortAudioManagerManaged();
}
// = Object.Finalize
!PortAudioManagerManaged() {
delete m_native;
m_native = nullptr;
}
static PortAudioManagerManaged^ CreateObject()
{
return gcnew PortAudioManagerManaged(PortAudioManager::createObject());
}
void OpenStream()
{
if (!m_native)
throw gcnew System::ObjectDisposedException(GetType()->FullName);
m_native->openStream();
}
void StopStream()
{
if (!m_native)
throw gcnew System::ObjectDisposedException(GetType()->FullName);
m_native->stopStream();
}
private:
PortAudioManager* m_native;
};
在您的C#项目中,添加对C ++ / CLI类库的引用。
using (PortAudioManagerManaged manager = PortAudioManagerManaged.CreateObject())
{
manager.OpenStream();
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句