从C++传递字节数组到C#(Mono)

3
我想把一个字节数组/向量/缓冲区从C++传递到C#。
在C++的一侧,我将有一些数据存在一个向量中:
std::vector<unsigned char> pixels_cpp;

在C#端,我想以字节数组的形式访问这些数据,例如:
byte[] pixels_cs
// or as a MemoryStream object, accompanied with size information.

我目前正在使用这个概念将字符串从C++传递到C#:
void MyWrapper::setSomeString(const std::string& someString)
{
    mono_thread_attach (mono_get_root_domain ());
    MonoMethod* mmSetSomeString = searchMethod("SetSomeString", monoClass);
    void *args [1];
    args [0] = mono_string_new (domain, someString.c_str());
    MonoObject *result = mono_runtime_invoke (mmSetSomeString, CsClassInstance, args, NULL);
    // check result
}

而被调用的C#签名是:
public bool SetSomeString(string someString)

如果我想传递一个字节向量,它会是什么样子?
  • 我该如何分配内存并使用来自pixels_cpp的数据填充它?
  • 如何使用mono_runtime_invoke(或等效方法)调用呢?
  • c#方法签名应该是什么样子的?
1个回答

1
解决方案是使用 mono_array_new。 示例:
void MyWrapper::setVector(std::vector<uint8_t>& data)
{
    mono_thread_attach (mono_get_root_domain ());
    MonoMethod* mmSetVector = searchMethod("SetVector", monoClass);

    void *args [1];
    MonoArray *data  = mono_array_new(domain, mono_get_byte_class(), data.size());

    for (auto i=0; i<data.size(); i++) {
        mono_array_set (data, uint8_t, i, data[i]);
    }

    args [0] = data;

    MonoObject *result = mono_runtime_invoke (mmSetVector, CsClassInstance, args, NULL);
    // check result
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接