Переход на MIDL 3.0 с классического MIDLRT

MIDLRT также известен как MIDL 2,0. См. раздел MIDL 1,0, 2,0 и 3,0.

MIDL 3,0 может сосуществовать в одном исходном файле с классической MIDLRT; Преобразование IDL-файла выполняется не обязательно. Для выражения, в котором используется MIDL 3,0, новые параметры компилятора не требуются. Существующий /winrt параметр включает как классические MIDLRT, так и MIDL 3,0.

Вы можете добавить в существующий тип MIDLRT содержимое MIDL 3,0. В частности, можно использовать 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 или вышеописанным методом, который добавляет новый интерфейс и добавляет его в класс.