将字节数组从c ++传递到c#(单声道)

时间:2017-09-28 05:52:58

标签: c# c++ arrays mono buffer

我想将一个字节数组/向量/缓冲区从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)

如果我想传递一个字节向量,这看起来怎么样?

  • 如何分配内存并用pixel_cpp?
  • 中的数据填充内存
  • 如何使用mono_runtime_invoke(或等效的)调用调用?
  • c#方法签名应该如何?

1 个答案:

答案 0 :(得分: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
}