You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,建议在函数参数中额外传递数组长度,避免硬编码带来的维护问题:

  1. 修改函数声明:
bool setValuesFcn(double* values, uint32_t length);
  1. 主脚本调用时传入长度:
setValuesFcn(values, 3);
  1. 函数内动态创建数组:
array<double>^ setValues = gcnew array<double>(length);

内容的提问来源于stack exchange,提问作者Londo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 12:20:54