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

UWP中C++/CLI委托参数出现byte而非byte*的问题求助

解决C++/CLI委托中byte*被识别为out byte的问题

我帮你分析下这个问题哈——你遇到的是C++/CLI和.NET(UWP属于.NET生态)互操作时的类型自动转换问题。原生C里的unsigned char*如果没有明确标记用途,C/CLI的互操作层会默认把它解析成单个输出的byte参数,而不是你预期的字节数组指针,这就导致UWP那边看到的是out byte而不是数组指针。

下面给你几个具体的解决方案,你可以根据实际需求选择:

方案1:改用.NET数组类型(推荐)

直接把委托里的unsigned char*换成C++/CLI的array<Byte>^,这样UWP那边就能直接识别成字节数组,不用额外转换:

// 修改后的委托定义
public delegate bool ReceiveRawDelegate(unsigned int nIndex, unsigned int nSender, unsigned int nSize, array<Byte>^ pBinaryData);

然后在包装类调用原生DLL函数的时候,需要把.NET数组固定住(避免GC移动),转换成原生指针:

// 包装类里调用原生函数的示例
bool WrapperClass::CallRawFunction(unsigned int nIndex, unsigned int nSender, unsigned int nSize, array<Byte>^ pBinaryData)
{
    pin_ptr<Byte> pinnedData = &pBinaryData[0]; // 固定数组,获取原生指针
    unsigned char* rawData = reinterpret_cast<unsigned char*>(pinnedData);
    // 调用原生DLL的函数
    return NativeDLL::ReceiveRaw(nIndex, nSender, nSize, rawData);
}

方案2:用IntPtr包装原生指针

如果必须保留原生指针的传递,可以用System::IntPtr来包装,这样UWP那边拿到的是一个指针地址,需要自己转换为字节数组:

// 委托定义改成IntPtr
public delegate bool ReceiveRawDelegate(unsigned int nIndex, unsigned int nSender, unsigned int nSize, IntPtr pBinaryData);

在包装类里直接传递原生指针:

bool WrapperClass::CallRawFunction(unsigned int nIndex, unsigned int nSender, unsigned int nSize, unsigned char* pBinaryData)
{
    IntPtr ptr(pBinaryData);
    // 触发委托
    _receiveDelegate(nIndex, nSender, nSize, ptr);
}

然后在UWP那边,把IntPtr转换成字节数组:

// UWP里处理委托的示例
bool OnReceiveRaw(uint nIndex, uint nSender, uint nSize, IntPtr pBinaryData)
{
    byte[] data = new byte[nSize];
    System.Runtime.InteropServices.Marshal.Copy(pBinaryData, data, 0, (int)nSize);
    // 处理data数组
    return true;
}

方案3:用Interop属性明确标记

如果坚持用unsigned char*,可以给参数加上[In]或[Out]属性,告诉编译器这是数组而不是单个变量:

// 引用System::Runtime::InteropServices命名空间
using namespace System::Runtime::InteropServices;

// 标记参数为输入数组
public delegate bool ReceiveRawDelegate(unsigned int nIndex, unsigned int nSender, unsigned int nSize, [In] unsigned char* pBinaryData);
// 如果是输出数组就用[Out],双向用[In, Out]

不过这种方式需要注意内存管理,UWP那边还是需要手动处理指针转数组,不如方案1直观。

总结一下,最省心的是方案1,直接用.NET数组类型,互操作层会自动处理类型转换,减少手动管理内存的风险。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:10:16