.NET组件和COM组件有什么区别?

22

.NET 组件和 COM 组件有什么区别?我们有时会在项目中使用 .NET 组件,有时又会包含 COM 引用。这背后的原理是什么?

4个回答

15

.NET 组件是托管代码(内存回收由系统自动完成)

COM 是软件组件的接口标准。COM 组件是非托管代码(内存处理通过引用计数实现)。

这里得知:

COM 和 .NET 有什么关系?

COM 和 .NET 是互补的开发技术。.NET 公共语言运行时提供与 COM 的双向透明集成。这意味着 COM 和 .NET 应用程序和组件可以使用彼此的功能。这保护了您在 COM 应用程序中的现有投资,同时使您能够以受控的速度利用 .NET。COM 和 .NET 可以实现类似的结果。.NET 框架为开发人员提供了许多好处,包括更强大、基于证据的安全模型、自动内存管理和本地 Web 服务支持。对于新开发,Microsoft 建议使用 .NET 作为首选技术,因为它具有强大的托管运行时环境和服务。


3
托管和非托管并不是真正的区别。您也可以使用.NET语言创建COM组件。因此,这个问题并不完全正确,因为.NET组件和COM组件并不是相互补充的。 - Dirk Vollmar
2
你可以使用regasm从COM中调用任何.NET组件;但它仍然是一个.NET组件... - Mitch Wheat
2
@Mitch:我认为你应该更正你的答案。仍然有许多使用VB6编写的COM组件,它使用引用计数来自动处理内存释放。这就是为什么你所说的COM==非托管 vs. .NET==托管的观点是不正确的。 - Dirk Vollmar
@divo: 我已经更新了。在.NET CLR的意义上,COM=非托管。你的回答有点暗示VB6编写的COM组件不能泄漏内存,这是不正确的。 - Mitch Wheat
1
@Mitch:如何解释引用计数意味着没有内存泄漏?即使在.NET中,也不能保证没有内存泄漏。 - Dirk Vollmar
1
顺便说一下,COM组件不一定使用非托管代码实现。正如你所说,COM是一个接口标准(好吧,这只是挑剔而已;-) - Dirk Vollmar

7
COM组件是未经管控的C++代码组件,旨在使软件在二进制级别上可重用。.NET组件类似,但有两个主要区别:1)它们可以使用CLR语言创建,而COM组件只能使用C++构建;2)它们旨在在托管运行时下运行。我认为这些是重要的区别。
编辑:
C++是COM中最“自然”的语言,但可以使用许多语言创建COM组件。感谢大家的评论。

4
这并不完全正确。COM组件可以用许多不同的语言创建,其中包括C ++,VB以及.NET语言,例如C#或VB.Net。 - Dirk Vollmar
VB?自从5.0版本以来我就不再使用它了,但这可能是真的。VB如何处理某些COM函数的指针参数呢? - Hernán
实际上,VB 6是COM语言(在某种意义上,VB完全围绕COM构建,显然它不像C++那样强大,但它提供了与COM对象一起工作的最简单方法) - Dirk Vollmar

5

.NET组件运行在CLR中,而COM组件本质上是本地的Windows DLL。

.NET组件还公开了比COM组件更多的元数据。这种重新设计部分是为了使组件更具互操作性。特别是,.NET组件不会对数据布局和调用约定进行平台特定的假设。

请参见Don Box


2
CLR真的是用COM编写的吗?我知道很多框架库都是现有COM库的包装器,但实际的运行时本身是否使用COM库? - sipsorcery
@sipwiz 我还没有完全查看 CoreCLR 仓库,但我还没有找到任何 COM。 - jrh
1
@jrh,我已经删除了这个语句。这是基于我在2005年阅读的Don Box关于CLR内部的书籍,现在我已经没有这本书的副本了。它是针对非常早期版本的.NET(远远在“.NET Core”之前)编写的,我怀疑其中一些内容甚至在书印刷之前就已经过时了。可以说,.NET不再基于COM(如果曾经)。 - harpo


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接