CLR如何实现COM实现的二进制互操作级别? 还是不?

COM是如何在二进制级别内存中表示对象的标准。 考虑到这一点,使用任何语言的COM对象都很容易。 您只需要以COM需要的方式解释内存,并且您将拥有控制中的COM对象。

我认为CLR是由相同的互操作性概念创build的,但有一层抽象,比如一种自己的语言(而不是二进制)。 考虑到这一点,CLR如何实现像COM这样的二进制级别的互操作性? 还是没有达到?

COM和CLR是互补的东西? 或者是相互替代的东西,因为MS似乎在做什么。

使用COM您不依赖于虚拟机。 CLR你依赖于一个虚拟机?

有一个世界的差异。 COM 简单地实现了互操作性。 有很少的规则,只是一个标准化的调用约定(stdcall),三个方法(AddRef,Release,QueryInterface)和跳转表(aka v-table)的概念。 其他一切都建立在该基础之上,在语言运行时实现COM支持非常简单且广泛可用。

天真高雅,但这确实带来了一个价格。 特别是错误处理在COM中很弱,不支持异常。 建库很麻烦,不支持实现继承。 COM编程被广泛认为是痛苦的,并且尽可能地隐藏了很多努力。 WinRT最显而易见的是Store和Windows Phone应用程序的API,由COM引擎提供支持,但几乎完全不可见。

托管代码互操作性是通过IL(所有托管编译器生成的中介语言)来实现的,无论源语言如何。 针对定义明确的虚拟机规格(Ecma 335),功能非常丰富。

15年前,在微软生态系统中工作的开发人员在使用COM时基本上有三个主要的选择:

  • 使用C ++
  • 使用C ++一些帮助(桌面MFC或ATL最初为服务器)
  • 使用另一种语言。 用纯粹的Microsoft术语来表示VB(VB4,5和6)。 其他供应商在场(Borland等)。

在使用C ++时,开发人员面临着很多困难:

  • 一流的工厂
  • AddRef / Release参考计数危险和泄漏(周期等)
  • 线程(COM在这里带来了单一的,两者都是免费的概念)
  • 封送处理
  • 进程外/进程内支持
  • 聚合
  • 注册
  • 不存在的错误处理(超越HRESULT)
  • 安全
  • 等等

请注意,VB在某些领域做了很好的工作,并且在很大程度上被采纳,但是很多人对VB不满意,因为我不会在这里提到。 实际上,它也增加了C ++程序员的难度,因为自动化界面在VB(以及其他自动化客户端,如VBScript或JScript)中很容易使用,但在C ++(VARIANT,BSTR,SAFEARRAY等)中很难使用。

所以微软决定创建一个“COM +运行时”的东西(它是一个更大的“COM +”图片的一部分):

  • 为了更容易构建COM组件
  • 解决开发和部署基于COM的应用程序的关键问题

这在1998年的旧文章中提到: 面向对象的软件开发使用COM +运行时服务变得简单

最终,这个“COM +运行时”变成了“.NET Framework”(中间名是NGWS:下一代Windows服务,对于像2001年那样参加PDC的人来说)。 您可以在.NET本机托管接口的名称中看到这种情况的痕迹,例如IC代表的是“COm运行时”的ICorRuntimeHost接口 。

所以.NET就是COM的一个演化。 它是基于它的。 它是互补的。 请注意,WinRT也是一个COM的演变,但是完全不同。

他们都是COM的后代。 一种观察的方式是考虑.NET框架是微软开发者部门(Visual Studio和工具)的孩子,WinRT是微软Windows部门的孩子(他们从来不喜欢第一个孩子,主要是因为他的“内存问题“ – GC)。