我正在考虑学习 COM。但我听说 Microsoft 推出了 .NET 作为 COM 的替代品。那么COM值得学习吗?实际上我开始学习 UMDF 设备驱动程序的 COM。除了 COM 之外,还有其他处理 UMDF 的方法吗?
4 回答
COM 陈旧、乏味且令人沮丧。我认为没有人喜欢与 COM 一起工作。所以一般来说,除非你有一个非常令人信服的理由,否则我建议不要学习它。如果您需要使用一个 COM 库,我将学习如何通过 COM 互操作来使用它,这使您能够从 .NET 使用 COM。
需要明确的是,.NET 的目的是替代 COM。而且效果很好,非常成功。但是 COM 在 Windows 中无处不在,你不能在一个典型的程序上摇一摇,也不能在某个地方遇到 COM。这从任何 .NET GUI 程序 [STAThread] 中的第一段代码开始。
Windows 中有很多东西还没有得到友好的 .NET 包装器。这并不总是需要,CLR 对 COM 互操作具有出色的支持。从“添加引用”对话框中非常明显,COM 选项卡充满了好东西。但是您在该列表中看到的是经过专门设计的组件,可以在任何运行时环境中轻松使用。他们实现了一个名为“OLE 自动化”的 COM 子集。
自动化是一个非常受限制的子集,它运行得很好,因为你实际能做的事情是有限的。但是,有些代码不适合该子集。找不到类型库的那种。如果没有类型库,您将被 .NET 搞砸。与该问题最明显的组件是外壳。Windows资源管理器。在托管代码中编写 shell 扩展很困难。
问题是 COM 接口声明最初设计为在实现多重继承的编译器上运行良好。特别是 C++。如果 COM 接口派生自另一个 COM 接口,则 .NET 接口声明不能很好地映射到该 COM 接口。CLR 生成错误的 v 表。这篇MSDN 杂志文章中提到了这一点,尽管作者的结论是完全错误的。
您可以用 .NET 语言编写 COM 接口声明并实现它们。只是你从 SDK 中得不到任何帮助。并且您需要非常了解 COM 才能正确使用它们。
UMDF 也适合这个模型,它的接口是从 IUnknown 派生的。没有类型库。没有我知道的托管包装器。您可以用 C# 编写代码,但您必须自己编写所有接口声明。实际上,这里只有 C++ 适用。
是的,您需要学习 COM。
UMDF 是一个开发用户模式设备驱动程序的框架。我认为设备驱动程序的一个关键要求是:快速加载。我不想仅仅因为我有一个必须加载和 JIT .NET 框架的时髦设备驱动程序而延迟我的启动时间(尽管如此)。
当然,您也可以开发臃肿的 com 库,但只要有能力,您就可以避免它。您无法避免 .NET 运行时。
因此,即使 UMDF 允许进行 .NET 开发,我此时也不希望使用 .NET 编写设备驱动程序。
不要误会我的意思。我喜欢.NET。即使我们谈论的是用户模式驱动程序,我只是不认为它与设备驱动程序混合得很好。
在查看 COM 时,我认为它有助于理解为什么开发它:提供在不同环境中开发的组件之间的互操作性。这是上世纪 80 年代的事了。多年来,人们一直在抱怨 COM,但实际上它在这方面非常成功。COM 的部署模型(即注册表依赖项)和其他有趣的设计选择存在一些错误,让开发人员摸不着头脑。但是,COM 的核心(即 IUnknown)仍然是健全的 IMO。
COM 很有用,因为它允许您构建可以从多种语言中使用的独立于语言的 API。现在.net 用于大致的目的,尽管它不太容易访问。如果您对 .net 进行编程,许多 COM API 的“正常工作”,尽管对 COM 的工作原理有一些基本的了解是很好的(例如,COM 使用引用计数进行内存管理,而 .net 使用垃圾收集)。