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

如何从C++ DLL向C# DLL传递数组?(VS2015 CLI环境)

解决C++/CLI与C# DLL间的数组传递问题

核心问题是C++标准库std::array和.NET原生array<T>^类型不兼容,必须手动做类型转换。以下是针对你的场景的具体实现步骤:

1. 处理double数组(支持双向传递)

从外部C++ API接收的double*指针,需要先转为C#能识别的array<double>^,调用C#函数后再把修改后的数组拷贝回原C++内存:

#include <array>
#include <msclr/marshal.h>
using namespace System;
using namespace msclr::interop;

// 假设DEFAULT_SETSIGNAL_SIZE是已定义的常量,比如100
const size_t DEFAULT_SETSIGNAL_SIZE = 100;

// 从double*创建.NET array<double>^
array<double>^ ConvertDoublePtrToNetArray(double* src, size_t length)
{
    array<double>^ netArray = gcnew array<double>(length);
    for (size_t i = 0; i < length; ++i)
    {
        netArray[i] = src[i];
    }
    return netArray;
}

// 将修改后的.NET array<double>^拷贝回double*
void CopyNetArrayToDoublePtr(array<double>^ netArray, double* dest, size_t length)
{
    if (netArray->Length < length)
    {
        throw gcnew ArgumentException("Array length mismatch");
    }
    for (size_t i = 0; i < length; ++i)
    {
        dest[i] = netArray[i];
    }
}

2. 转换字符串数组(std::array<String^, N>转array<String>)

把全局的std::array<String^, DEFAULT_SETSIGNAL_SIZE>转为C#需要的array<String^>^:

array<String^>^ ConvertStdStringArrayToNetArray(const std::array<String^, DEFAULT_SETSIGNAL_SIZE>& src)
{
    array<String^>^ netArray = gcnew array<String^>(DEFAULT_SETSIGNAL_SIZE);
    for (size_t i = 0; i < DEFAULT_SETSIGNAL_SIZE; ++i)
    {
        netArray[i] = src[i];
    }
    return netArray;
}

3. 完整调用流程

把转换逻辑整合到调用C#函数的代码中:

// 处理外部API传入的double数组指针
void ProcessExternalDoubleArray(double* externalDoublePtr)
{
    // 1. 转换double数组到.NET类型
    array<double>^ netValues = ConvertDoublePtrToNetArray(externalDoublePtr, DEFAULT_SETSIGNAL_SIZE);
    
    // 2. 转换字符串数组到.NET类型
    array<String^>^ netSignals = ConvertStdStringArrayToNetArray(setSignals_path);
    
    // 3. 调用C#静态函数
    Error result = YourCSharpClass::SetMultipleSignals(netSignals, netValues);
    
    // 4. 将C#修改后的数组拷贝回原C++指针
    if (result == Error::Success) // 根据你的Error枚举判断执行结果
    {
        CopyNetArrayToDoublePtr(netValues, externalDoublePtr, DEFAULT_SETSIGNAL_SIZE);
    }
}

注意事项

  • 确保数组长度一致:C#函数和C++端的DEFAULT_SETSIGNAL_SIZE必须匹配,避免内存越界
  • 异常处理:可以根据实际需求添加空指针检查、长度校验等容错逻辑
  • 内存管理:gcnew创建的.NET数组会由CLR自动回收,无需手动释放

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 07:15:40