在 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>^
接口取回字节数组。所以,我需要在 IVector
和 unsigned 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# 方向。但是,如果数组包装或复制数据,我不确定这种情况下的内存管理。如果它确实包装了它,它怎么知道如何释放它?
我的 windows 8.1 和 windows phone 8.1 (C#) 的通用商店项目使用 windows 运行时组件 (C++),它包含一个 C 库和一个 C++/CX 包装器 class,它提供对 winrt 环境的 C 代码的访问。
我将字节数组从 C# 代码传递到组件,然后使用 IVector<unsigned char>^
接口取回字节数组。所以,我需要在 IVector
和 unsigned char
.
我现在就是这样做的:
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# 方向。但是,如果数组包装或复制数据,我不确定这种情况下的内存管理。如果它确实包装了它,它怎么知道如何释放它?