【问题标题】:What is the Difference between .NET components and COM Components.NET 组件和 COM 组件有什么区别
【发布时间】:2010-10-15 20:45:33
【问题描述】:

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

【问题讨论】:

    标签: .net com


    【解决方案1】:

    .NET 组件是托管代码(内存处理已为您完成)

    COM 是软件组件的接口标准。 COM 组件是非托管代码(使用引用计数执行内存处理)。

    来自here

    COM 和 .NET 有什么关系?

    COM 和 .NET 是互补的发展 技术。 .NET 通用语言 运行时提供双向、 与 COM 的透明集成。这 意味着 COM 和 .NET 应用程序 和组件可以使用功能 从每个系统。这可以保护您的 对 COM 的现有投资 应用程序,同时允许您 在受控的情况下利用 .NET 步伐。 COM 和 .NET 可以实现类似的 结果。 .NET 框架提供 拥有大量开发人员 的好处,包括更强大, 基于证据的安全模型, 自动内存管理和原生 网络服务支持。对于新 开发,微软推荐.NET 作为首选技术,因为 其强大的托管运行时 环境和服务。

    【讨论】:

    • 托管与非托管并没有真正的区别。您也可以使用 .NET 语言创建 COM 组件。这样的问题并不完全正确,因为 .NET 组件和 COM 组件不是互补的。
    • 您可以使用 regasm 来使用来自 COM 的任何 .NET 组件;虽然它仍然是一个 .NET 组件...
    • @Mitch:我认为你应该更正你的答案。仍然有许多 COM 组件是用 VB6 编写的,它使用引用计数来自动处理内存处理。这就是为什么您的观点 COM==unmanaged vs. .NET==managed 是不正确的。
    • @Mitch:引用计数如何暗示没有内存泄漏?即使在 .NET 中,您也无法避免泄漏。
    • 顺便说一句,COM 组件不一定使用非托管代码实现。正如你所说,COM 是一个接口标准(好吧,这只是吹毛求疵 ;-)
    【解决方案2】:

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

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

    Don Box

    【讨论】:

    • CLR真的是用COM写的吗?我知道很多框架库都是现有 COM 库的包装器,但实际运行时本身是否使用 COM 库?
    • @sipwiz 我没有查看整个CoreCLR repo,但我还没有找到任何COM。
    • @jrh,我已删除该声明。那是基于 Don Box 的关于 CLR 内部的书,我在 2005 年读过这本书,现在已经没有副本了。它是针对非常早期的 .NET 版本(long 早于“.NET Core”)编写的,我怀疑其中一些在本书付印之前就已经过时了。可以说 .NET 不再基于 COM(如果曾经是的话)。
    【解决方案3】:

    COM 组件是非托管 C++ 代码组件,旨在使软件在二进制级别可重用。 NET 组件虽然相似 1) 它们可以在 CLR 语言上创建,而 COM 组件只能用 C++ 构建 2) 它们旨在在托管运行时下运行。我认为这些是基本的区别。

    编辑:

    C++ 是 COM 中最“自然”的语言,但 COM 组件可以用多种语言创建。感谢 cmets 人。

    【讨论】:

    • 这并不完全正确。 COM 组件可以用许多不同的语言创建,其中包括 C++、VB 和 .NET 语言,例如 C# 或 VB.Net
    • VB?我从 5.0 天起就不再使用它了,但这可能是真的。 VB 如何处理某些 COM 函数的指针对指针参数?
    • 实际上,VB 6 是 COM 语言(从某种意义上说,VB 完全围绕 COM 构建,显然它不如 C++ 强大,但它提供了最简单的方法使用 COM 对象)
    【解决方案4】:
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-09
    • 2013-02-04
    • 2017-03-18
    • 1970-01-01
    相关资源
    最近更新 更多