Я пытаюсь понять, как работают Visual Studio EnvDTE Interop Сборки и почему они были разработаны таким образом.Новые сборки содержат обновленные / новые интерфейсы, и Microsoft рекомендует использовать самый последний интерфейс в VS2017.Это выглядит так:
EnvDTE.DTE dte = (EnvDTE.DTE)((IServiceProvider)Host).GetCOMService(typeof(DTE));
EnvDTE80.DTE2 dte2 = (EnvDTE80)dte;
EnvDTE.Solution solution = dte2.Solution; // Returns a Solution type, not Solution2
EnvDTE80.Solution2 solution2 = (EnvDTE80.Solution2)dte2.Solution;
В этом фрагменте свойство DTE2.Solution возвращает тип Solution , а не Solution2 , как я ожидал ...Вы должны явно привести к доступу к новым интерфейсам, что кажется странным.
Я искал в реестре каждый GUID сборок EnvDTExxx, но единственными найденными мной CLSID со ссылками на любую из них были Объект Microsoft Visual Studio DTE и Microsoft VisualStudio Solution Object .Оба ссылаются на EnvDTE в качестве библиотеки типов ... И я не могу найти COM-объект, который использует более новые версии EnvDTExxx.Еще я вижу новейший интерфейс в OleView !!!:
![DTE2 is Available](https://i.stack.imgur.com/lbqWt.png)
Означает ли это, что более новые сборки EvDTExxx полагаются на оригинальный EnvDTE для доступа к фактическому компоненту COM?Я полагаю, что интерфейсы в OleView представляют фактические интерфейсы на компоненте COM ... но тогда почему библиотека типов EnvDTE не использует обновленный интерфейс DTE2?
Чтобы добавить в замешательство, я обнаружил, что только EnvDTE и EnvDTE80 украшены PrimaryInteropAssemblyAttribute ... в то время как EnvDTE90-100 нет!Я предполагаю, потому что более новые сборки взаимодействия представляют только типы EnvDTE (PIA), не будет конфликтов типов?Но это не объясняет, почему EnvDTE80 также помечен как PIA ... Я думал, что может быть только одна PIA!
Пожалуйста, спасите меня от моего COMfusion!