Отладка VS2017: невозможно получить доступ к членам COM-объекта - PullRequest
0 голосов
/ 12 июня 2018

Выпуск

Обычно в «Динамическом представлении» Visual Studio отображаются элементы объекта.Иногда объект требует запуска всех потоков, и вы должны вручную разрешить это, чтобы увидеть элементы.Тем не менее, с этим COM-объектом, я получаю сообщение об ошибке при попытке увидеть членов:

Невозможно оценить выражение.Операция не поддерживается.Неизвестная ошибка: 0x80070057.


Подробности

Вот скриншоты процесса:

  1. Просмотр COM-объекта:

    1

  2. Просмотр членов COM-объекта:

    2

  3. Открытие динамического просмотра приводит к:

    Для оценки функции требуются все потоки.

    3

  4. Когда я нажимаю значок обновления, ошибка изменяется:

    Невозможно оценить выражение.Операция не поддерживается.Неизвестная ошибка: 0x80070057.

    4


Что я пробовал

Кроме тогонеокончательное исследование этих двух сообщений об ошибках, единственное, что я попробовал, это удалить файл .suo и перезапустить Visual Studio.

Я знаю, какие данные возвращает вызов API, потому что я могу распечатать данные на консоли,Однако неспособность просмотреть эти данные из отладчика действительно замедляет меня.Любая помощь будет оценена.Спасибо!

Ответы [ 2 ]

0 голосов
/ 01 февраля 2019

В моем случае я смог увидеть типы объектов com в отладчике, включив опцию «Использовать режим управляемой совместимости»

В Visual Studio, если вы откроете инструменты >> Параметры, а затем отладку >> Общиеубедитесь, что опция «Использовать режим управляемой совместимости» включена.

Это должно показать com-объекты как их собственные типы в отладчике.

0 голосов
/ 13 июня 2018

Следующий комментарий в этот вопрос от Ханса Пассанта помог мне найти решение:

Обычно его можно привести к одному из типов интерфейса, поддерживаемых компонентом.Затем отладчик снова становится умным ... итерируйте его с помощью foreach.Фактическим базовым типом среды выполнения является прокси, который возникает, когда вы вызываете метод из рабочего потока или если это сервер вне процесса.

Решение состоит в том, чтобы сначала выполнить итерацию по объекту COM, прежде чемпытаясь использовать это.Итак, если COM-объект является коллекцией, выполните итерации по элементам, приведите их к типу интерфейса и сохраните результат в var или пользовательской модели.

Примерно так:

var myObject = com.GetStuff().OfType<InterfaceClass>().Select(s => new { Name = s.Name, Description = s.Description });
...