.net - CLR 如何实现 COM 实现的二进制级别的互操作性?或者不?

标签 .net windows com clr

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

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

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

使用 COM,您不依赖于虚拟机。使用 CLR,您是否依赖于虚拟机?

最佳答案

有天壤之别。 COM 通过简单 实现了互操作性。规则非常少,只有标准化的调用约定 (stdcall)、三种方法(AddRef、Release、QueryInterface)和跳转表(又名 v-table)的概念。其他一切都建立在该基础之上,在语言运行时实现 COM 支持非常简单且广泛可用。

非常优雅,但这确实是有代价的。 COM 中的错误处理特别薄弱,不支持异常。建库麻烦,不支持实现继承。 COM 编程被广泛认为是痛苦的,人们付出了很多努力来尽可能地隐藏它。最明显的例子是 WinRT,它是商店和 Windows Phone 应用程序的 API,由 COM 在后台提供支持,但几乎完全不可见。

托管代码互操作性是通过 IL 实现的,IL 是所有托管编译器生成的中间语言,与源语言无关。以定义明确 (Ecma 335) 且功能非常丰富的虚拟机规范为目标。

关于.net - CLR 如何实现 COM 实现的二进制级别的互操作性?或者不?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26552516/

相关文章:

c# - 如何使用 exe 文件附加资源(例如图像)?

c# - 何时使用 int 以外的数据类型?

java - "The filename or extension is too long error"使用渐变

c++ - 我应该如何编写正确的 COM 代码?

c# - 从 exe 中检索 COM ProgID 而无需注册

c# - 在 LINQ 中使用 “OfType”

c# - 使用 Process、RegistryKey 将 .NET Framework 代码移植到 .NET Standard

asp.net-mvc - Windows 身份验证-MVC 2 ASP.Net

ruby - 如何使用 Ruby fiddle 加载 Windows DLL 文件?

c# - 如何为 C# 项目生成 .tlh 文件