【问题标题】:How does COM complement the .NET Framework when building DLLs?COM 在构建 DLL 时如何补充 .NET Framework?
【发布时间】:2019-04-21 21:24:47
【问题描述】:

在过去的几周里,我一直致力于为 Excel 构建一个自定义 DLL 扩展,我用 C# 编写并构建为一个 COM 对象,并通过 Visual Studio 启用了 COM 互操作。 DLL 本身运行良好,但我想了解它背后的技术。

在阅读了几篇文章和帖子后,我感到有些困惑,似乎无法找到确切解释 COM 和 .NET Framework 如何协同工作以允许我们构建这些 DLL 以及为什么我们需要两者的信息他们。

我目前的理解:

COM - 一种创建独立于语言且可在不同环境中使用的二进制对象的方法。 (例如,您编写一个 C# 对象,将其构建为 COM 对象,然后您可以在 Excel 中的 VB 脚本中使用它)

.NET Framework - 为所有支持的语言提供通用运行时环境并允许它们之间的语言互操作性的框架。 (换句话说,由于 CLR,VB 脚本可以使用 C# 对象)

混乱:

在其中一篇文章中,COM 被介绍为 .NET 框架的前身,它需要开发人员提供大量额外的逻辑来管理他们的代码(COM => 非托管代码)。 .NET Framework 现在负责处理这些问题,并且有一种方法可以处理非托管代码,就好像它是 .NET Framework 下的托管代码一样。

如果 COM 和 .NET Framework 对象在技术上是跨语言兼容的,为什么我们不能简单地使用 Visual Studio 构建一个 C# DLL,构建它并在 Excel 中作为加载项引用它?如果 .NET 框架应该已经提供这种语言互操作性和所有代码管理功能,为什么我们需要将程序集注册为 COM 对象并启用它以进行 COM 互操作?

如果您能真正解释这两种技术之间的关系,以及 Visual Studio 中的“使程序集 COM 可见”和“注册 COM 互操作”设置如何与它们联系在一起,那将是最好的。

谢谢, 迪米塔

编辑:

2019 年 4 月 22 日更新:

阅读下面的反馈后,我得到以下信息:

  1. COM 允许 DLL 通过实现一些特定的接口/方法来公开其组件

  2. Excel 仅支持 COM,因此仅适用于 COM 对象,尽管它是一个 .NET 应用程序。

  3. .NET 为无法直接使用 .NET 组件的应用程序(例如 Excel)提供 COM 互操作

  4. COM 可见设置告诉 COM 您希望对象的哪些部分可供 COM 使用。 COM 互操作使用必要的接口/方法装饰 C# 对象,以使其可供 COM 使用。

我仍然需要澄清的事情:

1.如果未启用 COM,我在 Visual Studio 中的 C# 对象是否被视为 .NET 组件?我认为是的。

2.COM 互操作是把 Excel 变成 .NET 应用程序的主要因素吗?

  1. .COM 互操作是否还允许不依赖 COM 的 .NET 应用程序(与 Excel 不同)也使用 COM 对象?

  2. 语言中和究竟是什么? COM 还是 .NET?怎么样?

【问题讨论】:

  • 对您的一个问题的简单回答:没有人向 C# 添加代码来加载 .NET 程序集。这就是为什么我们不能直接在 Excel 中加载 C# dll(程序集),而必须先将其注册为 COM。
  • 其次,我不太明白你说的这句话是什么意思:“.NET 框架现在处理了这个问题,并且有办法处理非托管代码,就好像它是.NET 框架。”。这与您的问题相反。当然,.NET 有办法从托管 (.NET) 代码调用非托管代码,但您问的是反过来,Excel(非托管)如何调用 .NET dll(托管)。
  • 第三,我真的不知道这个问题的状态,因为在确保 .NET 框架和运行时能够共存方面已经做了很多工作。但是,以前(如果重要的话,你必须用谷歌搜索我的意思是这个时间有多长),单个进程无法加载 2 个不同的 .NET 运行时版本。换句话说,如果 Excel 加载 .NET 3.0 是因为它试图以某种方式访问​​使用该运行时构建的扩展,如果另一个扩展是使用 4.0 构建的,这可能会导致问题。因此,COM 插件必须设置为进程外。
  • 我的意思是“.NET 框架现在处理了这个问题,并且有一种方法可以处理非托管代码,就好像它是 .NET 框架下的托管代码一样。”。是 .NET 框架负责 COM 开发人员过去必须自己实现的所有代码管理工作。如今,.NET Framework 及其 COM 互操作功能在某种程度上是自动的。

标签: c# .net


【解决方案1】:

COM 是一种较旧的技术,早在.NET 之前就已经存在,组件对象模型由 MS 创建,用于允许 DLL 公开其组件和调用者以简单地查询加载的组件是否会实现调用者的特定接口正在寻找。

每个COM 库或对象都至少实现了一个名为IUnknowk 的接口,并且可以使用一个名为QueryInterface 的方法来检查该对象是否实现了特定接口。

当 MS 在 2001 年引入 .NET Framework 时,它决定从设计之初就支持一种称为 COM / .NET 互操作性的范例,这意味着您可以从 .NET 使用 COM 库,也可以通过选择项目属性中的 COM 互操作标志,您将获得 .NET 编译器,以使用 COM 所需的此类额外部件来装饰您的程序集;比如 IUnknown 和 QueryInterface 属性。

Excel 和任何其他 COM 使用者然后可以使用该方法在启用 COM 的 .NET 程序集中查找对象和方法。

由于 Excel COM 加载程序(或 VBA 或 VB 脚本语言)比 .NET 更老,这些工具无法在本地找到 .NET 对象,因为这些工具被设计为仅使用 COM,因此寻找 iUnknown 接口等。

希望对您有所帮助,网上有很多关于这个问题的文档,例如这里

https://docs.microsoft.com/en-us/dotnet/visual-basic/programming-guide/com-interop/index

但更多取决于您对我特别感兴趣的方面

【讨论】:

  • 感谢@Davide Piras。因此,根据您的回答,我们需要构建一个 COM,因为 Excel 只知道使用 COM 对象。您提到了接口和方法,但这是 COM 实现其语言中和的方式还是在我的场景中由 .NET 完成的?因为从我阅读的内容来看,这两种技术都包含这种技术。那么 Excel(被认为是 .NET 应用程序)是否利用 .NET/COM 互操作来允许它在 .NET 下使用 COM 对象?在这种思路中,是 .NET/COM 互操作在技术上将 Excel 置于 .NET 保护伞之下,还是还有更多?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-24
  • 2018-09-13
  • 1970-01-01
  • 1970-01-01
  • 2011-12-29
相关资源
最近更新 更多