c# - 在 C# 中使用 native C++ 代码 - std::vector 的问题

标签 c# c++

我想在托管 C# 代码中使用来自 dll 的 native C++ 函数。 但是我的函数接受像 std::vector& 这样的参数——一个 vector 引用…… 我如何在 dllimport 语句中实现这个参数?例如,我知道有 IntPtr 等等,但是 std::vector<> 是什么?

最佳答案

我将导出包装所需功能的“C”函数,并从 C# 中 P/调用它们。这样的“C”函数可能会公开 std::vector<>数据作为指针和数据缓冲区的大小。

例如,假设您有一个 std::vector<byte_t>在类里面Buffer :

class Buffer
{
public:
    const std::vector<byte_t>& GetData() const { return data_; }

private:
    std::vector<byte_t> data_;
};

然后您可以导出一个“C”函数来正确地确定 Buffer 的范围你想使用:

Buffer* CreateBuffer();

你可能想在 native 端做一些填充 std::vector<byte_t> 的事情有数据:

void DoSomethingThatProduceData(Buffer* buffer);

然后您可以读取该数据:

void GetBufferData(const Buffer* buffer, const byte_t** data, int* size);

最后,清理:

void DestroyBuffer(Buffer* buffer);

将那些“C”声明翻译成 C# 端的 P/Invoke 声明:

[DllImport("YourBufferLib.dll")]
static extern IntPtr CreateBuffer();

[DllImport("YourBufferLib.dll")]
static extern void DoSomethingThatProduceData(IntPtr buffer);

[DllImport("YourBufferLib.dll")]
static extern void GetBufferData(IntPtr buffer, out IntPtr data, out Int32 size);

[DllImport("YourBufferLib.dll")]
static extern void DestroyBuffer(IntPtr buffer);

最好将托管端的这些调用包装在 IDisposable 类中,以确保正确清理 native 资源。

[“C”函数的一些微不足道的实现细节显然留给读者作为练习。]

关于c# - 在 C# 中使用 native C++ 代码 - std::vector 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4919414/

相关文章:

C# 在另一个函数中打破其他函数循环

c# - 多表连接优化性能

c++ - 可以创建 N 个方法的类接口(interface)

java - 无法使用 dll 注入(inject)和 JNI 通过 oracle 表单 GUI 对象附加

c++ - OPENGL 两个 LoadIdentity

c++ - C 和 C++ 中的堆数组对齐以简化编译器 (GCC) 向量化

c++ - boost::pool 中不需要模板参数

c# - ProtoInclude 在抽象类中 - dll 不能相互了解

c# - 如何将函数 <in T1, in T2, and T3, out TResult> 传递给构造函数?

c# - 使用 roslyn 将鼠标悬停在源树符号的数据上