在 IVector<T>^ 和 winrt 组件中的 C 样式字节数组之间转换

Converting between IVector<T>^ and C-style array of bytes in a winrt component

我的 windows 8.1 和 windows phone 8.1 (C#) 的通用商店项目使用 windows 运行时组件 (C++),它包含一个 C 库和一个 C++/CX 包装器 class,它提供对 winrt 环境的 C 代码的访问。

我将字节数组从 C# 代码传递到组件,然后使用 IVector<unsigned char>^ 接口取回字节数组。所以,我需要在 IVectorunsigned char.

的 C 风格数组之间来回转换

我现在就是这样做的:

unsigned char *Component::CopyToArray(IVector<unsigned char>^ source)
{
    unsigned char *target = new unsigned char[source->Size];
    for (unsigned int i = 0; i < source->Size; i++) {
        target[i] = source->GetAt(i);
    }
    return target;
}

Vector<unsigned char>^ Component::CopyToVector(unsigned char *source, unsigned int length)
{
    Vector<unsigned char>^ target = ref new Vector<unsigned char>();
    for (unsigned int i = 0; i < length; i++) {
        target->Append(source[i]);
    }
    return target;
}

有没有办法避免分配内存和复制数据?

更新:我意识到CopyToVector已经过时了,因为有一个构造函数接受一个指针。

ref new Vector<unsigned char>(pointer, size) 

更新和解决方案

我将代码更改为使用 const Platform::Array<unsigned char>^ 作为参数类型,使用 Platform::Array<unsigned char>^ 作为 return 类型的 public api 的 C++ 包装器 class . C# 将这些类型视为 byte[],因此无需显式转换。在 C++ 中,unsigned char * 指针的访问方式与 argOfArrayType->Data 一样简单。对于从 C++ 到 C# 的 return 数据,我使用 ref new Array<unsigned char>(pointer, size).

我使用 C++/CX 的经验仅限于几个应用程序,但为什么不使用 Platform::WriteOnlyArray 而不是 vector?使用数组,您可以直接通过 Data 属性 访问数据。所以 C# -> C++/CX 方向可以这样优化。它还有一个 Array(T* data, unsigned int size) 构造函数,应该有助于 C++/CX -> C# 方向。但是,如果数组包装或复制数据,我不确定这种情况下的内存管理。如果它确实包装了它,它怎么知道如何释放它?