【问题标题】:How to copy void pointer (C++) to byte[] (C#) (CLI)如何将 void 指针 (C++) 复制到 byte[] (C#) (CLI)
【发布时间】:2021-08-14 18:35:04
【问题描述】:

我的 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));
    }

但我得到了错误

错误 C2664: 'void *memcpy(void *,const void *,::size_t)': 无法将参数 1 从 'cli::interior_ptr' 转换为 'void *'

我做错了什么?

【问题讨论】:

  • 输入缓冲区和输出缓冲区交换了吗?
  • @jdweng 我不确定我是否明白你的想法......我没有输出缓冲区,只需输入一个。无论如何,您为什么认为应该交换它们?
  • 你需要两个缓冲区。
  • 如果不固定数组对象就不能使用 memcpy(),请使用 pin_ptr&lt;&gt;。但是在这里更容易使用Marshal::Copy()

标签: c# c++ c++-cli


【解决方案1】:

读取articles about pin_ptr 似乎&amp;input[0] 将产生interior_ptr,即指向托管对象数据的指针。您收到的错误消息支持这一点。

这似乎可以转换为固定对象的pin_ptr,防止它被垃圾收集器移动,这也可以转换为指针。文章表明这​​应该是可能的:

pin_ptr<Byte> p = &input[0];   // entire array is now pinned
unsigned char * cp = p;

【讨论】:

    猜你喜欢
    • 2011-08-28
    • 1970-01-01
    • 2019-09-27
    • 2012-05-06
    • 2013-01-08
    • 2018-08-11
    • 2020-02-26
    • 2019-12-13
    • 2021-07-13
    相关资源
    最近更新 更多