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
相关产品推荐
相关产品推荐

