3

WinRT の場合、IDL は次のような構造をサポートするようになりました。

[marshaling_behavior(agile)]
[threading(both)]
[activatable(0x06020000)]
[version(0x06020000)]
[static(Windows.Networking.Sockets.IDatagramSocketStatics, 0x06020000)]
runtimeclass DatagramSocket
{
    [default] interface Windows.Networking.Sockets.IDatagramSocket;
    interface Windows.Foundation.IClosable;
}

気になるstatic属性。どういう意味ですか?の本体内にリストされているインターフェイスとどのように関連していますruntimeclassか?

4

2 に答える 2

8

winrtインターフェイスの静的メソッドは、そのクラスのクラスファクトリから離れたインターフェイスとして実装されます。

この場合、次のように呼び出す必要があります(多くのwinrtオーバーヘッドが省略されています)。

ComPtr<IDatagramSocketStatics> factory;
HRESULT hr = RoGetActivationFactory(<HSTRING for Windows.Networking.Sockets.DatagramSocket>, __iidof(IDatagramSocketStatics), &factory.GetAddressOf());
hr = factory->DatagramFactoryMethod(<Parameters>);

前述したように、これは擬似コードですが、静的メソッドを呼び出す方法を確認するだけで十分です。

于 2012-10-16T00:20:08.953 に答える
5

COM はクラスの静的メソッドの概念をサポートしていません。インターフェイス メソッドは抽象的であるため、すべてのメソッドはインスタンス メソッドでなければなりません。この属性により、言語プロジェクションはメソッドの静的動作をエミュレートできます。具体的には、DatagramSocket.GetEndpointPairsAsync() オーバーロードです。

また、COM も属性で解決されるオーバーロードをサポートしていないことも注目に値します。IDatagramSockeStatics のメソッドには [overload] 属性があり、2 番目のオーバーロードの実際の名前は GetEndpointPairsWithSortOptionsAsync() です。

于 2012-10-15T18:44:45.623 に答える