为什么不是所有EnvDTE程序集都不是Interop ...我很困惑?

时间:2018-11-16 02:35:39

标签: c# com com-interop t4 envdte

我试图了解Visual Studio EnvDTE互操作程序集的工作方式,以及为什么采用这种方式设计它们。新程序集包含已更新/新的接口,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类型。您必须显式进行强制转换以访问较新的接口,这似乎很奇怪。

我在注册表中搜索了EnvDTExxx程序集的每个GUID,但是我发现唯一引用它们的CLSID是 Microsoft Visual Studio DTE对象 Microsoft Visual Studio解决方案对象。两者都链接到EnvDTE作为它们的类型库...而且我找不到使用较新EnvDTExxx版本的COM对象。但是我看到了OleView中最新的界面!!! :

DTE2 is Available

这是否意味着更新的EvDTExxx程序集依赖原始的EnvDTE来访问实际的COM组件?我相信OleView中的接口代表COM组件上的实际接口...但是,为什么EnvDTE类型库不使用更新的DTE2接口?

让我感到困惑的是,我发现只有EnvDTE和EnvDTE80装饰着PrimaryInteropAssemblyAttribute ...,而EnvDTE90-100没有装饰!我以为是因为较新的互操作程序集仅公开EnvDTE(PIA)的类型,所以不会发生类型冲突吗?但这并不能解释为什么EnvDTE80也被标记为PIA ...我以为只能有一个PIA!

请从我的混乱中解救我!

1 个答案:

答案 0 :(得分:2)

Com类型实际上只是接口,它遵循与.NET接口相同的规则。

在接口中,如果不破坏二进制兼容性,就无法在派生方法中更改已定义方法的返回类型。

所以,因为接口本质上是

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

public EnvDTE80 : EnvDTE
{
    //more other stuff
}

返回值必须相同,以保持二进制兼容性。