Правильно ли проверять экземпляр класса COM / Interop в отладчике VS.Net? - PullRequest
3 голосов
/ 20 августа 2009

Кто-нибудь знает, возможно ли и как правильно видеть объекты COM / Interop (в их правильном типе) в отладчике VisualStudio? Все, что я получаю, это значение ' evil ' System .__ ComObject (даже если оно правильно определяет тип)?

например:.

Screenshot

Ответы [ 3 ]

2 голосов
/ 27 августа 2009

С .NET и COM: полное руководство по взаимодействию :

Когда вам возвращается экземпляр COM-объекта через тип возвращаемого значения метода или параметр ссылки, и CLR не может определить тип, вы получите универсальный тип System .__ ComObject, поскольку COM-объекты всегда передаются / возвращаются как указатели интерфейса.

Вы можете попробовать изменить тип возвращаемого значения, используя Marshal.CreateWrapperOfType, как в примере ниже:

MyType newObject = (MyType)Marshal.CreateWrapperOfType(oldObject, typeof(MyType))

Затем вы можете посмотреть на newObject в окне просмотра, и он должен иметь ожидаемые свойства.

Если вызов не удался, он выдаст исключение InvalidCastException.

1 голос
/ 25 августа 2009

Итак, это не ответ, но посмотрите на эти два снимка экрана. Это из одного и того же приложения, просто в двух разных точках разрыва. В обоих случаях объекты COM находятся в одной библиотеке COM / AX. Понятия не имею, почему в одном случае я вижу «System .__ ComObject», а в другом - правильный тип. Однако в обоих случаях я вижу соответствующие свойства объекта / интерфейсов. Что дает? Почему разница?

Первый здесь показывает, что показывает «System .__ ComObject», однако он также показывает мне все свойства объекта. Нажмите для просмотра полноразмерного изображения.

alt text

Второй полностью скрывает «System .__ ComObject». Нажмите для просмотра полноразмерного изображения.

alt text

1 голос
/ 21 августа 2009

Я использовал непосредственное окно для ручного запроса свойств COM-объекта. Недостатком является то, что я не думаю, что вы получаете intellisense, поэтому вы должны точно знать, что вы хотите проверить.

...