这里我有一个带有C ++ WinRT组件的C#metro app。 我需要在WinRT中做一些事情,比如分配照片的名称/路径,并检索照片的缩略图。
首先,我在WinRT C ++中编写一个值struct并检索struct array函数,如下所示。
public value struct Item
{
String^ strName;
String^ strPath;
};
public ref class CTestWinRT sealed
{
public:
CTestWinRT();
void TestOutStructArray(Platform::WriteOnlyArray<Item>^ intOutArray)
{
intOutArray->Data[0].strName = ref new String(L"test1.jpg");
intOutArray->Data[0].strPath = ref new String(L"c:\\temp");
intOutArray->Data[1].strName = ref new String(L"test2.jpg");
intOutArray->Data[1].strPath = ref new String(L"c:\\temp");
}
};
然后我在C#按钮中使用TestOutStructArray函数点击如下。
CTestWinRT myNative = new CTestWinRT();
private void btnTestClick(object sender, RoutedEventArgs e)
{
Item[] items = new Item[2];
myNative.TestOutStructArray(items);
}
该函数正常工作,items数组可以通过调试窗口查看值是否正确。
现在,我想在value struct中添加一个字节数组,如下所示。
public value struct Item
{
String^ strName;
String^ strPath;
uint8 byteThumbnail[8096];
};
这将导致下面的编译器错误:
错误C3987:'byteThumbnail':公共成员的签名包含 本机类型'unsigned char [8096]'
错误C3992:'byteThumbnail':公共成员的签名包含 无效的类型'unsigned char [8096]'
我查看了关于value struct的MSDN,它说value struct不能将ref类或struct作为成员,所以我想我不能像上面那样编写代码。
http://msdn.microsoft.com/en-us/library/windows/apps/hh699861.aspx
有谁知道如何使用其他方式来替换值struct?我需要数组里面有“字节数组”。
答案 0 :(得分:5)
以下array types可以通过ABI传递:
value struct或值类只能包含基本数字类型,枚举类或Platform :: String ^作为字段。
因此,您不能将值结构与数组一起使用。而且你不能使用uint8 []类型的数组。
您应该单独传递数组和结构,或者使用ref类。