Почему не все сборки EnvDTE Primary Interop ... Я в замешательстве? - PullRequest
0 голосов
/ 16 ноября 2018

Я пытаюсь понять, как работают 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

Означает ли это, что более новые сборки EvDTExxx полагаются на оригинальный EnvDTE для доступа к фактическому компоненту COM?Я полагаю, что интерфейсы в OleView представляют фактические интерфейсы на компоненте COM ... но тогда почему библиотека типов EnvDTE не использует обновленный интерфейс DTE2?

Чтобы добавить в замешательство, я обнаружил, что только EnvDTE и EnvDTE80 украшены PrimaryInteropAssemblyAttribute ... в то время как EnvDTE90-100 нет!Я предполагаю, потому что более новые сборки взаимодействия представляют только типы EnvDTE (PIA), не будет конфликтов типов?Но это не объясняет, почему EnvDTE80 также помечен как PIA ... Я думал, что может быть только одна PIA!

Пожалуйста, спасите меня от моего COMfusion!

1 Ответ

0 голосов
/ 16 ноября 2018

Типы Com на самом деле являются просто интерфейсами, и он следует тем же правилам, что и интерфейсы .NET.

В интерфейсе нельзя изменить тип возврата определенного метода в производном методе, не нарушая двоичную совместимость..

Таким образом, поскольку интерфейсы по существу

public interface EnvDTE 
{
    Solution Solution {get;}
    //other stuff
}

public EnvDTE80 : EnvDTE
{
    //more other stuff
}

, возвращаемое значение должно быть одинаковым для сохранения двоичной совместимости.

...