Übergang zu MIDL 3.0 aus klassischem MIDLRT

MIDLRT wird auch als MIDL 2.0 bezeichnet. Siehe MIDL 1.0, 2.0 und 3.0.

MIDL 3.0 kann in derselben Quelldatei mit klassischem MIDLRT vorhanden sein. Sie müssen die IDL-Datei nicht alle gleichzeitig konvertieren. Es sind keine neuen Compileroptionen erforderlich, um auszudrücken, dass Sie MIDL 3.0 verwenden. Die vorhandene /winrt Option aktiviert sowohl klassisches MIDLRT als auch MIDL 3.0.

Sie können MIDL 3.0-Inhalt einem vorhandenen MIDLRT-Typ hinzufügen. Insbesondere können Sie MIDL 3.0 verwenden, um Schnittstellen zu definieren, die laufzeitklassendefinitionen hinzugefügt werden, die in MIDLRT erstellt wurden. Dies ermöglicht die Verwendung neuer Techniken, erfordert jedoch keine vollständige Konvertierung eines Typs oder einer Datei. Hier sehen Sie ein Beispiel.

// 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;
}

Das Hinzufügen von MIDL 3.0-Konstrukten zu vorhandenen MIDLRT-Laufzeitklassendefinitionen führt zu einem Fehler wie diesem.

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'

Beheben Sie dies, indem Sie entweder die vollständige Klasse in MIDL 3.0 konvertieren, oder durch die obige Technik, die eine neue Schnittstelle hinzufügt und der Klasse hinzufügt.