如何将 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;