我想在托管的c#代码中使用来自dll的本机c ++函数.但我的函数接受像std :: vector& - 参数引用这样的参数......我如何在dllimport语句中实现这个参数?我知道例如有IntPtr等等但是对于std :: vector <>会是什么?
我将导出包含所需功能的"C"函数,并从C#调用它们.这种"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_;
};
Run Code Online (Sandbox Code Playgroud)
然后,您可以导出"C"函数以正确范围Buffer您要使用的范围:
Buffer* CreateBuffer();
Run Code Online (Sandbox Code Playgroud)
你可能想在填充std::vector<byte_t>数据的本机方面做一些事情:
void DoSomethingThatProduceData(Buffer* buffer);
Run Code Online (Sandbox Code Playgroud)
然后你可以读取这些数据:
void GetBufferData(const Buffer* buffer, const byte_t** data, int* size);
Run Code Online (Sandbox Code Playgroud)
最后,清理:
void DestroyBuffer(Buffer* buffer);
Run Code Online (Sandbox Code Playgroud)
将那些"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);
Run Code Online (Sandbox Code Playgroud)
在IDisposable类中将这些调用包装在托管端并确保正确清理本机资源将是一件好事.
[这个有点微不足道的"C"功能的实现细节显然是留给读者的练习.]