【问题标题】:COM vs non-COM DLLCOM 与非 COM DLL
【发布时间】:2012-09-22 18:10:11
【问题描述】:

我的大部分经验是使用 Java 和 VB.NET 等高级语言。我确实有一些 C++ 经验(在大学)。

我了解 COM DLL 和 .NET 编译器生成的 DLL 之间的区别。我不完全理解 C 和 C++ 编译器生成的 COM DLL 和 Windows DLL 之间的区别。

我想在 .NET 程序中使用 C++ DLL。我设法让这个工作。我的问题是:C++ 生成的 DLL 和 VB6(基于 COM)生成的 DLL 有什么区别。

我花了一个小时在谷歌上搜索并查看 MSDN。我虽然不用问问题就能找到答案,但我没有。

【问题讨论】:

    标签: vb.net dll com


    【解决方案1】:

    Com 是一种二进制标准,它允许应用程序使用可互换的二进制模块,只要符合 com 标准,任何语言都可以生成 com 投诉库。因此,差异取决于某些 com 库将是本机机器代码,有些可能会通过解释器进行管理和运行。 com 真正要做的是弥合 c++ 在源代码级别的 oop 风格与预构建的二进制世界之间的可用性差距。

    【讨论】:

    • 感谢您解释 COM DLL(这是我所知道的)。你能解释一下 C++ DLL 吗?
    【解决方案2】:

    两者之间有一个巨大的差异。该列表太长,无法在 SO 帖子中准确复制,我将尝试突出显示:

    • C++ DLL 必须导出它想让客户端代码可用的每个函数或类。一个 COM DLL 仅导出 4 个具有众所周知的名称和行为的函数
    • 使用 C++ DLL 的应用程序必须在链接时描述该 DLL 的接口,COM 服务器在运行时绑定
    • 使用 C++ DLL 的应用程序必须允许 Windows 在启动时找到 DLL,通常通过将 DLL 放在与 EXE 相同的目录或路径上。在没有客户端应用程序指定其位置的情况下找到 COM DLL。注册表在运行时用于定位 DLL
    • COM 服务器不必是 DLL。它可以是任何东西,包括同一台机器上的单独进程或位于世界另一台机器上的可执行文件。客户端代码不知道它所在的位置

    特定于 COM 的自动化子集:

    • 任何支持 COM 的语言都可以使用 COM 服务器。在 Windows 中,这几乎是其中的任何一个。

    最后一个要点可能会让您误以为您了解 COM dll 和 .NET dll 之间的区别。它们没有任何共同点,但 .NET 非常好,并且可以与 COM 服务器互操作。 Tlbimp.exe 实用程序非常擅长掩盖差异。

    【讨论】:

    • 感谢您的解释 (+1)。您是否能够提供指向 MSDN 页面/教程的链接来解释这一点。我对 C++ DLL 特别感兴趣。
    • 您不能直接使用在 .NET 程序中导出类的 C++ DLL。需要使用 C++/CLI 语言编写的包装器。不完全是你会从教程中学到的东西,有很多关于这种语言的书。
    • 澄清一下:实际上,您可以通过 pinvoke 在 .NET 中直接使用 C++ DLL。 msdn.microsoft.com/en-us/library/aa288468(v=vs.71).aspx
    • 嗯,不,值得注意的是,链接的文章从未在任何地方谈论 C++。 Pinvoke 仅支持 C 风格的接口,它不支持类或标准 C++ 库中的任何内容。当程序员指出这一点时,他们倾向于谈论一种名为 C/C++ 的虚构语言。没关系,C++ 编译器是一个更好的 C 编译器。您只需要处理应用于导出函数的名称修改。
    猜你喜欢
    • 2015-02-22
    • 2017-02-15
    • 1970-01-01
    • 2012-02-29
    • 2013-10-08
    • 2018-09-13
    • 2011-10-12
    • 2010-10-08
    • 2016-12-19
    相关资源
    最近更新 更多