如何将 void 指针 (C++) 复制到 byte[] (C#) (CLI)
How to copy void pointer (C++) to byte[] (C#) (CLI)
我的 C# 代码中有一个 byte[]
,我需要将它传递给 C++ 端并用来自 void*
的数据填充它
我是这样做的
C# 端
byte[] copy;
m_Logic.CopyToArray(out copy);
//There is filled `copy` that I can use
C++ (CLI) 端
void Agent_CLI::CopyToArray([Out] array<unsigned char> ^% input)
{
std::vector<int> data = { 1, 2, 3, 4 };
void * data_to_copy = data.data(); //TEST : my data to copy
int data_size = (int)data.size();
input = gcnew array<unsigned char>(data_size);
memcpy(&input[0], data_to_copy, data_size * sizeof(unsigned char));
}
但我收到错误
error C2664: 'void *memcpy(void *,const void *,::size_t)': cannot convert argument 1 from 'cli::interior_ptr' to 'void *'
我做错了什么?
读取 articles about pin_ptr 似乎 &input[0]
会产生一个 interior_ptr
,即指向托管对象数据的指针。您收到的错误消息支持这一点。
这似乎可以转换为固定对象的 pin_ptr
,防止它被垃圾收集器移动,这也可以转换为指针。文章建议这应该是可能的:
pin_ptr<Byte> p = &input[0]; // entire array is now pinned
unsigned char * cp = p;
我的 C# 代码中有一个 byte[]
,我需要将它传递给 C++ 端并用来自 void*
我是这样做的
C# 端
byte[] copy;
m_Logic.CopyToArray(out copy);
//There is filled `copy` that I can use
C++ (CLI) 端
void Agent_CLI::CopyToArray([Out] array<unsigned char> ^% input)
{
std::vector<int> data = { 1, 2, 3, 4 };
void * data_to_copy = data.data(); //TEST : my data to copy
int data_size = (int)data.size();
input = gcnew array<unsigned char>(data_size);
memcpy(&input[0], data_to_copy, data_size * sizeof(unsigned char));
}
但我收到错误
error C2664: 'void *memcpy(void *,const void *,::size_t)': cannot convert argument 1 from 'cli::interior_ptr' to 'void *'
我做错了什么?
读取 articles about pin_ptr 似乎 &input[0]
会产生一个 interior_ptr
,即指向托管对象数据的指针。您收到的错误消息支持这一点。
这似乎可以转换为固定对象的 pin_ptr
,防止它被垃圾收集器移动,这也可以转换为指针。文章建议这应该是可能的:
pin_ptr<Byte> p = &input[0]; // entire array is now pinned
unsigned char * cp = p;