gpt4 book ai didi

c# - 在 C# 中使用非托管 dll

转载 作者:行者123 更新时间:2023-11-30 03:48:22 26 4
gpt4 key购买 nike

我一直在尝试为我创建的 c++ 类创建一个 c# 包装器。我四处查看如何执行此操作,但似乎没有一个示例使用类和对象。我在 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 标志进行编译。给定上面显示的 native C++ 类,添加以下 C++/CLI 类来包装您的 native 类:

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();
}

关于c# - 在 C# 中使用非托管 dll,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33260723/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com