【发布时间】: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