【问题标题】:Why aren't all EnvDTE assemblies Primary Interop...I'm COMfused?为什么不是所有的 EnvDTE 程序集都是主互操作...我很复杂?
【发布时间】:2019-04-19 05:11:07
【问题描述】:

我正在尝试了解 Visual Studio EnvDTE 互操作程序集的工作原理,以及它们为何以这种方式设计。新程序集包含更新/新接口,微软建议使用 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; 

在那个 sn-p 中,DTE2.Solution 属性返回类型 Solution 而不是 Solution2,正如我所料...您必须显式转换才能访问较新的接口,这似乎很奇怪。

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

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

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

请把我从 COMfusion 中解救出来!

【问题讨论】:

  • 尽管年代久远,但仍然可以阅读:stackoverflow.com/questions/27448122/…
  • 谢谢,但我知道如何获取更新的界面。我只是不明白为什么他们是这样设计的......似乎他们正在为同一个 COM 对象发布 2 个 PIA,然后发布引用 PIA 的非主互操作程序集? COM 对象的 OleView 似乎显示了最新 PIA 公开的类型,但旧 PIA 被列为 COM 对象的类型库

标签: c# com com-interop t4 envdte


【解决方案1】:

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

在接口中,您不能在不破坏二进制兼容性的情况下更改派生方法中已定义方法的返回类型。

所以因为接口本质上是

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

public EnvDTE80 : EnvDTE
{
    //more other stuff
}

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

【讨论】:

  • 谢谢!对不起,我不认为我的问题是公正的。我的困惑是为什么首先要添加额外的互操作程序集(其中一个作为 PIA,其余的没有),以及为什么它们没有返回最新的类型。我明白你在说什么,但他们不能只包含具有正确返回类型的新方法吗?
  • 他们不能返回最新的类型。您正在使用接口,并且接口合同声明它返回原始的旧类型。至于为什么他们没有标记 PIA 我不知道。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-31
  • 2011-09-24
相关资源
最近更新 更多