3

我的 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 的方法中更新它的正确方法是什么?

4

2 回答 2

4

您不能通过引用传递结构。winrt 中的所有值类型(包括结构)都是按值传递的。Winrt 结构体预计相对较小——它们旨在用于保存 Point 和 Rect 之类的东西。

在您的情况下,您已经指出该结构是一个“out”参数 - “out”参数是只写的,它的内容在输入时被忽略并在返回时被复制出来。如果您希望结构进出,请将其拆分为两个参数 - 一个“in”参数和另一个“out”参数(WinRT 中不允许使用 in/out 参数,因为它们不会以您期望的方式投射到 JS他们进行项目)。

于 2012-05-15T02:48:32.993 回答
1

我的同事帮我解决了这个问题。在 WinRT 组件中,似乎最好的方法是定义一个 ref 结构而不是一个值结构:

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。

于 2012-05-15T13:36:05.493 回答