【问题标题】:Passing an array from unmanaged C++ to C#将数组从非托管 C++ 传递到 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;,您将有机会使其工作。

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


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2011-09-15
    • 2013-02-09
    • 1970-01-01
    • 2013-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-14
    相关资源
    最近更新 更多