繁体   English   中英

构建DLL时,COM如何补充.NET Framework?

[英]How does COM complement the .NET Framework when building DLLs?

在过去的几周中,我一直在为Excel创建自定义DLL扩展,该扩展是用C#编写的,并通过Visual Studio启用了COM互操作,从而构建为COM对象。 DLL本身工作正常,但我想了解其背后的技术。

在阅读了几篇文章和帖子后,我感到相当困惑,并且似乎找不到确切说明COM和.NET Framework如何一起工作以允许我们构建这些DLL的信息,以及为什么同时需要它们。

我目前的理解:

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

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

混乱:

在一篇文章中,COM是.NET Framework的前身,它要求开发人员提供很多额外的逻辑来管理其代码(COM =>非托管代码)。 .NET Framework现在已经解决了这一问题,并且具有一种处理非托管代码的方式,就好像它是.NET Framework下的托管代码一样。

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

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

谢谢,迪米塔尔

编辑:

更新04/22/19:

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

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

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

  3. .NET为无法直接与.NET组件一起使用的Excel等应用程序提供COM互操作

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

我仍然需要澄清的事情:

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

2.COM interop是将Excel变成.NET应用程序的主要功能吗?

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

  2. 语言中和到底是什么? COM或.NET? 怎么样?

COM是一种较老的技术,在.NET之前存在很久,它是由MS创建的,用于允许DLL公开其组件,而调用者则可以简单地查询加载的组件是否实现了调用者正在寻找的特定接口。

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

当MS在2001年推出.NET Framework时,它决定从设计开始就支持从第一天开始,并且原生支持称为COM / .NET互操作性的范例,这意味着从.NET您可以使用COM库,也可以通过选择COM来支持项目属性中的Interop标志使您可以使用.NET编译器用COM所需的额外零件来装饰程序集; 例如IUnknown和QueryInterface属性。

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

由于Excel COM加载程序(或VBA或VB脚本语言)早于.NET,因此这些工具无法原生找到.NET对象,因为这些对象仅设计为使用COM,因此需要查找iUnknown接口等。

希望对您有帮助,在线有很多有关此问题的文档,例如此处

https://docs.microsoft.com/zh-cn/dotnet/visual-basic/programming-guide/com-interop/index

而且还取决于我对您感兴趣的方面

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM