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