1

そのため、API を設計する際に、Javascript やオーバーロードなど、楽しいことすべてに問題があることがわかりました。私が役立つと思うことの1つは、OverloadAttribute. ただし、この質問の理由は、これが何をするかに関するドキュメントが見つからないことです。MSDNは非常に役立つ情報を提供します

オーバーロードをサポートする言語でメソッドをオーバーロードとして識別します。

明らかに、それよりももう少し情報が必要です。では、これは一体何に使われているのでしょうか。string methodコンストラクターのパラメーターは何に使用されますか?

4

1 に答える 1

0

ドキュメントが示すように、OverloadAttributeはオーバーロードをサポートしない言語で使用するためのものです。たとえば、IDL と C++ (C++/CX ではない) を使用して、ABI レイヤーで Windows ランタイム コードを記述することを検討してください。IDL では、インターフェイス関数をオーバーロードすることはできません。インターフェイスの各関数には異なる名前を付ける必要があります。

例を見てみましょう。Windows 8 SDK にある Windows.Foundation.idl ファイルからの の定義を次に示しIUriRuntimeClassFactoryます。

interface IUriRuntimeClassFactory : IInspectable
{
    [overload("CreateUri")] HRESULT CreateUri([in] HSTRING uri, [out] [retval] Windows.Foundation.Uri** instance);
    [overload("CreateUri")] HRESULT CreateWithRelativeUri([in] HSTRING baseUri, [in] HSTRING relativeUri, [out] [retval] Windows.Foundation.Uri** instance);
}

2 つのインターフェイス関数は、IDL では異なる名前で宣言されています。どちらの関数にも IDLoverload属性の注釈が付けられています。この属性は、IDL コンパイラに、これらのメンバー関数の両方が の論理的なオーバーロードであることを伝えますCreateUri

midlrt IDL コンパイラは、この IDL から WinMD ファイルを生成するときに、オーバーロード名とインターフェイス関数名を入れ替えて、メタデータでこれらのインターフェイス関数の両方に名前が付けられCreateUri、両方の関数に がOverloadAttribute適用されるようにします。元の名前 (最初CreateUriの名前とCreateWithRelativeUri2 番目の名前)。これは、ildasm を使用して参照 Windows.winmd のメタデータを調べることで確認できます。

WinMD から IDL を生成すると、逆の変換が行われます。 で注釈が付けられたインターフェイス関数はOverloadAttribute、その属性によって提供される名前を使用して名前が付けられます。これにより、IDL と WinMD 間のロスレス ラウンドトリップが可能になります。

于 2013-01-24T16:56:28.787 に答える