C++指针传递double数组转array<double>^调用C#函数报错解决
问题分析与解决
错误原因
你遇到的System.NullReferenceException完全是因为托管数组引用未实例化:
你只声明了array<double>^ setValues;,这只是一个指向托管数组的空引用,并没有实际创建长度为3的托管数组对象。直接通过setValues[index]赋值时,自然会触发空引用错误。而原生指针values能正常读取,是因为它指向的是你在主脚本中已经分配好内存的栈数组。
解决方案
在使用托管数组前,必须用gcnew创建对应长度的数组实例,然后再将原生数组的值逐个复制进去。修改后的函数实现如下:
bool setValuesFcn(double *values) { // 先创建长度为3的托管数组实例 array<double>^ setValues = gcnew array<double>(3); std::cout << "[DLL] Entering into setMultipleSignals()... " << std::endl; for (uint32_t index = 0 ; index < 3; index++) { setValues[index] = values[index]; // 现在可以正常赋值 std::cout << "[DLL] Value[" << index << "]: " << setValues[index] << std::endl; } // 注意:此处返回逻辑与原代码一致,若需调整请根据业务需求修改 if (!veristand_wrapper_cs::VeriStand_dll::SetMultipleSignals(setValues)) return true; else return false; }
额外优化建议
如果后续数组长度不是固定的3,建议在函数参数中额外传递数组长度,避免硬编码带来的维护问题:
- 修改函数声明:
bool setValuesFcn(double* values, uint32_t length);
- 主脚本调用时传入长度:
setValuesFcn(values, 3);
- 函数内动态创建数组:
array<double>^ setValues = gcnew array<double>(length);
内容的提问来源于stack exchange,提问作者Londo
相关产品推荐
相关产品推荐

