ドキュメントが示すように、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
の名前とCreateWithRelativeUri
2 番目の名前)。これは、ildasm を使用して参照 Windows.winmd のメタデータを調べることで確認できます。
WinMD から IDL を生成すると、逆の変換が行われます。 で注釈が付けられたインターフェイス関数はOverloadAttribute
、その属性によって提供される名前を使用して名前が付けられます。これにより、IDL と WinMD 間のロスレス ラウンドトリップが可能になります。