将数组从非托管 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<double>
,您将有机会使其工作。
【参考方案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 的安全性