不同解决方案界面之间的区别
Difference between the different Solution interfaces
在编写 VSIX 并且想要访问有关给定解决方案的信息时,您可以简单地执行 DTE2.Solution
,这将 return Solution
,到目前为止一切顺利。在查看 MSDN 时,我可以看到存在多个解决方案接口:Solution
, Solution2
, Solution3
and Solution4
。
我注意到 VSIX SDK 出于某种原因经常这样做,以便提供不同的功能。在这种情况下,我真的看不出有什么大的不同,我也不确定什么时候应该使用哪个。你应该总是选择 Solution4
因为它实现了所有的前辈吗?
... for whatever reason, in order to offer different functionality
这些是 COM 接口,因此它们受 COM 规则的约束。接口一旦发布,它就是不可变的,因此添加功能是通过定义一个继承旧接口的新接口来完成的。
数字后缀是 Microsoft 用于控制 COM 接口版本的约定。 .NET 接口指南建议不要这样做,但为了保持一致性,该模式在 Visual Studio.
中继续
查询COM接口涉及引用计数。这意味着调用 QueryInterface
以获得指向所需接口的指针,最终调用 Release
告诉对象您不再需要该引用。对象本身负责其生命周期。构造函数(由对象的 class 工厂调用)从 1 开始其引用计数,当引用计数达到 0 时 Release
释放内存(delete
s 本身)。
请注意,此上下文中的 "reference" 与 .NET 引用不同。它是指向对象接口之一的指针的计数副本。
在早期,需要做一些工作才能确保正确处理引用。如果您可以查询具有组合功能的较新接口,那么这比分别查询两个接口并确保两个接口都已正确发布要省事。继承接口通过减少引用管理使事情变得更容易。
现在,我们有智能指针,例如 CComPtr
/_com_ptr_t
,可以为您处理这些细节。在托管世界中,Runtime-Callable Wrappers (RCW) 将其视为他们的职责。
在 .NET 中,创建新界面与继承现有界面一样容易,并且在任何一种情况下都易于使用界面。这只是引用转换的问题,有时会隐式发生。
C# 8 添加了默认实现,但这是特定于 .NET 的功能。请记住,Visual Studio 的核心仍在使用 COM 接口。默认实现违反了 COM 规则。
Should you always go for Solution4
since it implements all the predecessors?
这取决于您的目标。作为一般规则,使用具有所需成员的最小接口版本。如果您需要来自 Solution
和 Solution3
的成员,请使用 Solution3
,而不是 Solution4
。
另一方面,如果您知道您的目标是至少一个实现了Solution4
的Visual Studio版本,那么您没有理由无法使用Solution4
。一旦您确定您没有意外地阻止您的扩展程序在您想要定位的 Visual Studio 版本中使用 运行,它就会落入您的偏好。
在编写 VSIX 并且想要访问有关给定解决方案的信息时,您可以简单地执行 DTE2.Solution
,这将 return Solution
,到目前为止一切顺利。在查看 MSDN 时,我可以看到存在多个解决方案接口:Solution
, Solution2
, Solution3
and Solution4
。
我注意到 VSIX SDK 出于某种原因经常这样做,以便提供不同的功能。在这种情况下,我真的看不出有什么大的不同,我也不确定什么时候应该使用哪个。你应该总是选择 Solution4
因为它实现了所有的前辈吗?
... for whatever reason, in order to offer different functionality
这些是 COM 接口,因此它们受 COM 规则的约束。接口一旦发布,它就是不可变的,因此添加功能是通过定义一个继承旧接口的新接口来完成的。
数字后缀是 Microsoft 用于控制 COM 接口版本的约定。 .NET 接口指南建议不要这样做,但为了保持一致性,该模式在 Visual Studio.
中继续查询COM接口涉及引用计数。这意味着调用 QueryInterface
以获得指向所需接口的指针,最终调用 Release
告诉对象您不再需要该引用。对象本身负责其生命周期。构造函数(由对象的 class 工厂调用)从 1 开始其引用计数,当引用计数达到 0 时 Release
释放内存(delete
s 本身)。
请注意,此上下文中的 "reference" 与 .NET 引用不同。它是指向对象接口之一的指针的计数副本。
在早期,需要做一些工作才能确保正确处理引用。如果您可以查询具有组合功能的较新接口,那么这比分别查询两个接口并确保两个接口都已正确发布要省事。继承接口通过减少引用管理使事情变得更容易。
现在,我们有智能指针,例如 CComPtr
/_com_ptr_t
,可以为您处理这些细节。在托管世界中,Runtime-Callable Wrappers (RCW) 将其视为他们的职责。
在 .NET 中,创建新界面与继承现有界面一样容易,并且在任何一种情况下都易于使用界面。这只是引用转换的问题,有时会隐式发生。
C# 8 添加了默认实现,但这是特定于 .NET 的功能。请记住,Visual Studio 的核心仍在使用 COM 接口。默认实现违反了 COM 规则。
Should you always go for
Solution4
since it implements all the predecessors?
这取决于您的目标。作为一般规则,使用具有所需成员的最小接口版本。如果您需要来自 Solution
和 Solution3
的成员,请使用 Solution3
,而不是 Solution4
。
另一方面,如果您知道您的目标是至少一个实现了Solution4
的Visual Studio版本,那么您没有理由无法使用Solution4
。一旦您确定您没有意外地阻止您的扩展程序在您想要定位的 Visual Studio 版本中使用 运行,它就会落入您的偏好。