将数组从非托管 C++ 传递到 C#

Posted

技术标签:

【中文标题】将数组从非托管 C++ 传递到 C#【英文标题】:Passing an array from unmanaged C++ to C# 【发布时间】:2020-03-26 09:54:21 【问题描述】:

我是 C++/CLI 包装器到 C# 的新手,我在将数组传递给 C# 时遇到了一些问题。

原生 c++

const double *NDimInversion::GetOutputAverage() const

    if ( mOutputOk )
        return mAvgY.data().begin();
    else
        throw runtime_error("Error in NDimInversion::GetOutputAverage(): output not available.");

本机标头

const double *GetOutputAverage() const;

包装头

public ref class NDimInversion
public: 
  array<double>^ GetOutputAverage();

包装器 c++

array<double>^ NDimInversion::GetOutputAverage() 

    array<double> tempArr = nDimInversion->GetOutputAverage(); // ???? 

    const int SIZE = tempArr.size();
    array<double>^ tempReturn = gcnew array<double>(SIZE);
    for (int i = 0; i < SIZE; i++)
    
        tempReturn[i] = tempArr[i];
    

    return tempReturn
;

我打算将本机返回转换为 CLI 数组,但我无法传递该数组。 你能指出我错过了什么吗? 我还需要在 CLI 中携带“const”关键字吗?

【问题讨论】:

原生函数不会告诉你数组有多大。该信息应该来自哪里并不明显,当然不是来自 size()。重写本机函数以返回 std::vector&lt;double&gt;,您将有机会使其工作。 【参考方案1】:

这描述了如何copy between managed and unmanaged arrays。 示例From this question:

System::Runtime::InteropServices::Marshal::Copy( IntPtr( ( void * ) sourcePointer), targetManagedArray, 0, dataSize ); 

如 cmets 中所述,您绝对需要知道源数组中的项目数。

【讨论】:

以上是关于将数组从非托管 C++ 传递到 C#的主要内容,如果未能解决你的问题,请参考以下文章

将 HBITMAP 句柄从非托管代码传递到托管代码以创建 System.Drawing.Bitmap 的安全性

从非托管 C++ mfc active x dll 启动 C# 对话框

从非托管 c++ 调用托管 c# 函数

从非托管 c++ 调用托管 c# 函数

从非托管 c++ 调用 C# 函数(通过托管包装器)

在托管代码和非托管代码之间传递非托管结构的安全数组