Как использовать midlrt.exe для компиляции .idl в .winmd? - PullRequest
0 голосов
/ 30 июня 2019

Справочная информация: Мне нужно собрать компонент среды выполнения Windows как часть системы, настроенной на использование CMake для создания системы сборки.В качестве подготовительного шага я пытаюсь построить его в командной строке.


Начиная с простого файла .idl (MyType.idl)

namespace NS
{
    [default_interface]
    runtimeclass MyType
    {
    }
}

Я пытаюсь создать соответствующий файл .winmd с помощью инструмента midlrt.exe .Следующая командная строка (разделенная на несколько строк для удобства чтения)

midlrt
    /metadata_dir "%WindowsSdkDir%References\%WindowsSDKVersion%Windows.Foundation.FoundationContract\3.0.0.0"
    /reference "%WindowsSdkDir%References\%WindowsSDKVersion%Windows.Foundation.FoundationContract\3.0.0.0\Windows.Foundation.FoundationContract.winmd"
    /winmd MyType.winmd
    /notlb
    /winrt
    /nomidl
    /nologo
    /enum_class
    /ns_prefix
    /client none
    /server none
    MyType.idl

генерирует файл MyType.winmd просто отлично, но я не знаю почему.Меня особенно смущают опции /metadata_dir и /reference.Запуск midlrt /help предлагает следующее:

/metadata_dir      Specify one or more directories containing platform metadata files
/reference         Specify one or more WinMD files to import

Официальная документация по / metadata_dir мало что добавляет к этому (кроме странного замечания: "Используйте этот переключательуказать расположение основного файла метаданных для Windows с именем windows.winmd. ").Нет документации по /reference.

Вот что мне нужно, чтобы помочь:

  • Что мне нужно действительно передать для опции /metadata_dir?Как используется в командной строке выше, это выглядит как избыточная репликация части опции /reference.Однако, если его оставить, ошибки компилятора.
  • Как определить список требуемых /reference с их конкретными версиями?

1 Ответ

1 голос
/ 01 июля 2019

/ metadata_dir требуется, чтобы сообщить MIDLRT, где он может найти определения основных типов, которые MIDLRT требует по историческим причинам.Практически, это должно указывать на каталог, содержащий winmd, который определяет типы из пространства имен Windows.Foundation в Windows SDK, но вы можете использовать C: \ Windows \ System32 \ WinMetadata, если вы в затруднении (так как первый сложныйотслеживать).Очевидно, что вы захотите сделать это только для тестирования / эксперимента, поскольку вы будете в восторге от любой сборки ОС, на которой вы работаете.Правильная форма выглядит примерно так:

midlrt sample.idl /metadata_dir "C:\Program Files (x86)\Windows Kits\10\References\10.0.18362.0\Windows.Foundation.FoundationContract\3.0.0.0"

Найти этот путь довольно сложно.Начните с поиска пути установки SDK в реестре.Затем выберите версию SDK, на которую вы хотите настроить таргетинг.Тогда найдите последнюю версию учредительного договора.Вы можете посмотреть, как C ++ / WinRT делает это здесь:

https://github.com/microsoft/xlang/blob/master/src/library/impl/cmd_reader_windows.h

/ reference - более новая функция, в которой вы можете использовать ее для импорта определений из winmd вместо необходимости импортировать/ включить определения с использованием IDL.Это в основном оптимизация, так как это происходит намного быстрее, чем включение соответствующих определений IDL.

Вам все равно нужно использовать / metadata_dir независимо от того, используете ли вы / reference, поскольку они используются для разных целей.Это отличается от cppwinrt.exe, где он имеет только один флаг гармонизированной ссылки.

...