従来の MIDLRT から MIDL 3.0 への移行
MIDLRT は MIDL 2.0 とも呼ばれます。 「 MIDL 1.0、2.0、および 3.0」を参照してください。
MIDL 3.0 は、クラシック MIDLRT と同じソースファイルに共存できます。IDL ファイルをすべて一度に変換する必要はありません。 MIDL 3.0 を使用していることを表現するために、新しいコンパイラオプションは必要ありません。 既存 /winrt
のオプションでは、クラシック MIDLRT と MIDL 3.0 の両方が有効になります。
MIDL 3.0 のコンテンツは、既存の MIDLRT 型に追加できます。 具体的には、MIDL 3.0 を使用して、MIDLRT で作成されたランタイムクラス定義に追加されるインターフェイスを定義できます。 これにより、新しい手法を使用できますが、型またはファイルの完全な変換は必要ありません。 次に例を示します。
// Existing RTIDL interface definition.
[contract(FooContract, 1), exclusiveto(SampleClass), uuid(...)]
interface ISampleClass : IInspectable
{
HRESULT Method1([in] boolean something, [in] HSTRING other);
}
// New MIDL 3.0 interface added; needs exclusiveto(), but not uuid().
[contract(FooContract, 2), exclusiveto(SampleClass)]
interface ISampleClass2
{
Windows.Foundation.IAsyncOperation<String> TransformAsync(UInt32 count);
String NameProperty { get; };
}
[contract(FooContract, 1)]
runtimeclass SampleClass
{
[default] interface ISampleClass;
// Reference to MIDL 3.0-defined interface.
[contract(FooContract, 2)] interface ISampleClass2;
}
MIDL 3.0 コンストラクトを既存の MIDLRT runtimeclass 定義に追加すると、次のようなエラーが発生します。
1>midl : error MIDL9008 : internal compiler problem - See documentation for suggestions on how to find a workaround.
errors in directory t:\compdev1\src\mincore\coreui\published\idl
t:\compdev1\src\midl : error MIDL9008 : internal compiler problem - See documentation for suggestions on how to find a workaround.
1>midl: Assertion failed: pN->NodeKind() == NODE_INTERFACE_GROUP_MEMBER, file com\rpc\midl\midlrt\front\nodeskl.cxx, line 1403
1>NMAKE : fatal error U1077: 't:\compdev1\src\tools\x86\midl.EXE' : return code '0x2330'
この問題を解決するには、完全なクラスを MIDL 3.0 に変換するか、上の手法によって新しいインターフェイスを追加し、それをクラスに追加します。