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

Posted

技术标签:

【中文标题】将字节数组从 c++ 传递到 c#(单声道)【英文标题】:Passing byte array from c++ to c# (mono) 【发布时间】:2018-03-09 18:25:40 【问题描述】:

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

解决方案是使用 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

【讨论】:

以上是关于将字节数组从 c++ 传递到 c#(单声道)的主要内容,如果未能解决你的问题,请参考以下文章

将字节数组从 c++ 传递到 c# 程序集都有哪些不同的方法?

将字节数组从 C# 传递到 C++ DLL 作为 char*

将字节数组从 Unity C# 传递到 C++ 库方法

使用 Dllimport 将一个非常大的字符串作为字节数组从 C++ 传递到 C#

嵌入式单声道:将数组从 C# DLL 返回/复制到 C++

将 C# 3D 数组作为 1D 字节数组传递给 C++ 库