xsd.exe, похоже, не работает для C++ с более новыми версиями Visual Studio.

Я пытаюсь использовать инструмент xsd.exe для создания классов С++ из файлов схемы XML. В соответствии с этот пост я должен просто иметь возможность использовать инструмент из командная строка разработчика Visual Studio, но, похоже, она не работает для C++ в более новых версиях Visual Studio (2017 или 2019)

Когда я пытаюсь выполнить команду, я получаю сообщение об ошибке:

Ошибка: тип поставщика CodeDom Microsoft.VisualC.CppCodeProvider, CppCodeProvider, версия = 10.0.0.0, культура = нейтральная, PublicKeyToken = b03f5f7f11d50a3a не удалось найти.

Кажется, в документации нет никакой информации об этом, и поиск в Google не помог... Кто-нибудь знает, как это решить?


person tjwrona1992    schedule 10.01.2021    source источник
comment
Это происходит только для xsd /?? Если нет, отправьте командную строку и входные файлы.   -  person dxiv    schedule 11.01.2021
comment
Я предлагаю вам отправить этот вопрос в сообществу разработчиков Microsoft. Кроме того, я предлагаю вам использовать xsd2cc, который может преобразовать файл .xsd в классы C++.   -  person Barrnet Chou    schedule 11.01.2021
comment
@dxiv, нет, это работает только для показа справки, а также для создания классов C #. Это просто терпит неудачу, когда я указываю /language:CPP   -  person tjwrona1992    schedule 11.01.2021
comment
@BarrnetChou спасибо, я проверю xsd2cc! С первого взгляда неясно, будет ли он работать в Windows (я разрабатываю в среде Windows). Я также отправлю запрос непосредственно в Microsoft, так как xsd.exe определенно не работает.   -  person tjwrona1992    schedule 11.01.2021
comment
@ tjwrona1992 У меня работает простой тест экспорта/импорта с VS 2019 16.7.5. Возможно, это связано с тем, что у меня также установлен VS 2015, см. разрешение Microsoft на CppCodeProvider неправильно установлен с VS2017: поддержка проекта для xsd.exe устарела. Вы по-прежнему можете использовать API-интерфейсы Microsoft.VisualC.CppCodeProvider, вручную добавив CppCodeProvider.dll в GAC.   -  person dxiv    schedule 11.01.2021
comment
Спасибо @dxiv, я не знал, что это устарело! Если он устарел, я постараюсь не использовать его и искать альтернативу.   -  person tjwrona1992    schedule 11.01.2021
comment
@ tjwrona1992 Не уверен, что буквально означает устарело. В другом комментарии, также от MS, говорится, что в VS 2017 CppCodeProvider.dll поставляется с «Разработкой рабочего стола на C++». У меня есть CppCodeProvider.dll в Common7\IDE\PublicAssemblies под каждым из VS 2015, 2017 и 2019 на моей машине.   -  person dxiv    schedule 11.01.2021
comment
@dxiv, да, у меня тоже есть dll, но даже если я скопирую его и перетащу в тот же каталог, из которого запускаю xsd, похоже, он его не найдет.   -  person tjwrona1992    schedule 11.01.2021
comment
@ tjwrona1992 Говорят, вам нужно добавить его в GAC. Во всяком случае, нашел официальное заявление здесь: Начиная с Visual Studio 2017 поддержка проекта C++ для xsd.exe устарела. Вы по-прежнему можете использовать API-интерфейсы Microsoft.VisualC.CppCodeProvider, вручную добавив CppCodeProvider.dll в GAC..   -  person dxiv    schedule 11.01.2021
comment
@dxiv, извините за невежество, но я никогда раньше не слышал о GAC. Что такое GAC и как добавить к нему DLL? На связанной странице только говорится, что вам нужно добавить ее в GAC, но не указано, как это сделать.   -  person tjwrona1992    schedule 11.01.2021
comment
@tjwrona1992 См. Как установить сборку в глобальный кэш сборок, в частности gacutil.   -  person dxiv    schedule 11.01.2021
comment
@dxiv Похоже, это то, что мне нужно. Спасибо! Не стесняйтесь опубликовать это как ответ, и я приму его   -  person tjwrona1992    schedule 11.01.2021


Ответы (1)


xsd.exe устарел в VS 2017 с примечанием в разделе Задача XSD чтение:

Начиная с Visual Studio 2017 поддержка проекта C++ для xsd.exe устарела. Вы по-прежнему можете использовать API-интерфейсы Microsoft.VisualC.CppCodeProvider, вручную добавив CppCodeProvider.dll в GAC.

Это было подтверждено в санкционированных Microsoft комментариях под соответствующей заявкой CppCodeProvider неправильно установлен с VS2017, который был закрыт как преднамеренно.

Однако сборка CppCodeProvider.dll продолжала выпускаться с рабочей нагрузкой Разработка для настольных ПК с помощью C++, и ее по-прежнему можно найти в каталоге Common7\IDE\PublicAssemblies в VS 2017 и 2019. Сборку можно добавить в GAC с помощью средство глобального кэширования сборок gacutil в командной строке разработчика VS.

person dxiv    schedule 11.01.2021
comment
@tjwrona1992 Не знаю об этом. Просто запустил быстрый тест и сгенерировал схему с xsd sample.dll, а затем создал заголовок с xsd /c /l:cpp schema0.xsd. Это работало без каких-либо сообщений об ошибках и фактически создало файл C++ .h, хотя в сборке отсутствует большинство общедоступных типов. Не уверен, что / как это вообще должно работать полезным образом. - person dxiv; 11.01.2021
comment
Похоже, он генерирует код C++/CLI, который в основном является расширением Microsoft языка C++, которое работает только с Windows. - person tjwrona1992; 11.01.2021
comment
@ tjwrona1992 Верно, это точно C++/CLI. Но в лучшем случае это выглядит как частичное преобразование. Сборка, которую я использовал для быстрого теста, тоже была написана на C++/CLI, но у нее было несколько вложенных классов и API, которые не попали в сгенерированную схему и, очевидно, не попали в преобразованный заголовок. - person dxiv; 11.01.2021
comment
Похоже, мне придется найти другой инструмент... Либо так, либо попытаться собрать его самостоятельно (возможно, с помощью Perl), но это потребует значительных усилий. Думаю, сначала я проверю xsd2cc, как упоминалось в предыдущих комментариях. - person tjwrona1992; 11.01.2021