【发布时间】: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 日更新:
阅读下面的反馈后,我得到以下信息:
COM 允许 DLL 通过实现一些特定的接口/方法来公开其组件
Excel 仅支持 COM,因此仅适用于 COM 对象,尽管它是一个 .NET 应用程序。
.NET 为无法直接使用 .NET 组件的应用程序(例如 Excel)提供 COM 互操作
COM 可见设置告诉 COM 您希望对象的哪些部分可供 COM 使用。 COM 互操作使用必要的接口/方法装饰 C# 对象,以使其可供 COM 使用。
我仍然需要澄清的事情:
1.如果未启用 COM,我在 Visual Studio 中的 C# 对象是否被视为 .NET 组件?我认为是的。
2.COM 互操作是把 Excel 变成 .NET 应用程序的主要因素吗?
.COM 互操作是否还允许不依赖 COM 的 .NET 应用程序(与 Excel 不同)也使用 COM 对象?
语言中和究竟是什么? 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 互操作功能在某种程度上是自动的。