gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:31:56 24 4
gpt4 key购买 nike

我想在托管 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/

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