我的WinRT组件中有以下内容:
public value struct WinRTStruct
{
int x;
int y;
};
public ref class WinRTComponent sealed
{
public:
WinRTComponent();
int TestPointerParam(WinRTStruct * wintRTStruct);
};
int WinRTComponent::TestPointerParam(WinRTStruct * wintRTStruct)
{
wintRTStruct->y = wintRTStruct->y + 100;
return wintRTStruct->x;
}
但是,当从C#调用时,似乎winRTStruct-> y和x的值在方法内始终为0:
WinRTComponent comp = new WinRTComponent();
WinRTStruct winRTStruct;
winRTStruct.x = 100;
winRTStruct.y = 200;
comp.TestPointerParam(out winRTStruct);
textBlock8.Text = winRTStruct.y.ToString();
通过引用传递结构的正确方法是什么,以便在用C ++ / CX编写的WinRTComponent的方法中更新?
答案 0 :(得分:3)
您不能通过引用传递结构。 winrt中的所有值类型(包括结构)都按值传递。 Winrt结构预计相对较小 - 它们用于保存Point和Rect之类的东西。
在您的情况下,您已指出结构是“out”参数 - “out”参数是只写的,其内容在输入时被忽略并在返回时被复制出来。如果你想要一个结构进出,将它分成两个参数 - 一个“in”参数和另一个“out”参数(WinRT中不允许输入/输出参数,因为它们没有按照你期望的方式投射到JS他们投射)。
答案 1 :(得分:1)
我的同事帮我解决了这个问题。 在WinRT组件中,似乎最好的方法是定义一个ref结构而不是一个值struct:
public ref struct WinRTStruct2 sealed
{
private: int _x;
public:
property int X
{
int get(){ return _x; }
void set(int value){ _x = value; }
}
private: int _y;
public:
property int Y
{
int get(){ return _y; }
void set(int value){ _y = value; }
}
};
但这会产生其他问题。现在,当我尝试向返回结构实例的ref结构添加方法时,VS11编译器提供了INTERNAL COMPILER ERROR。