COM接口问题 - .NET

时间:2009-04-19 17:33:02

标签: .net com interop tlbimp tlbexp

最近我正在阅读有关互操作编组的内容,但我仍然不明白一件事。要使.NET程序集对COM可见,我需要使用tlbexp工具和/或regasm工具。为了让COM可见,我必须使用tlbimp工具 - 这一切对我来说都很清楚。

  1. 除此之外,我在互联网上看到很多处理带有guid属性的COM接口的代码,IUnknown和IDispach。

  2. 我的问题是所有这些与COM有什么关系 - 我需要使用它吗?我正在准备认证,但他们没有说关于接口,guids,IUnknown等......

    我真的不想在我身后留下不清楚的事情,所以如果有人可以向我解释,我会非常感激。

    1. 我还有一个关于从COM导入的类型库的问题(tlbimp工具)。从COM导入的类型库是否仍需要在系统中注册COM对象?
    2. 亲切的问候 PK

1 个答案:

答案 0 :(得分:3)

我不知道为什么会有人对这个问题进行投票。这对我来说似乎是一个完全有效的问题;也许他们今天早上还没喝咖啡。

你似乎在问什么GUID,IUnknown和IDispatch与COM有什么关系。我会尝试做一个简短的调查。

每个COM组件都公开一个公共接口IUnknown。 IUnknown有方法AddRef(),Release()和QueryInterface()。 AddRef()和Release()用于支持引用计数,因此当对象的每个引用都被释放时,对象将被销毁。 QueryInterface()有点像COM的版本的dynamic_cast<> C ++中的运算符。客户端代码使用它来查看它们实际上是否指向其他类型的对象的IUnknow指针,如IDog,ICat或其他类型。

因此每个COM组件都必须实现IUnknown,但是大多数COM库会自动为您实现这一点,因此在编写COM代码时,通常不需要编写任何代码来获取IUnknown;你可以免费获得它。

GUID有点像指纹。就像在现实生活中两个人可以拥有完全相同的名称,在COM中两个COM组件也可以具有相同的名称。例如,您可以拥有2个实现IDog接口的库,但它们可能完全不同。您应该仍然可以在您的计算机上安装这两个库,并区分这两个库是用于GUID的。 GUID是一个全球唯一的标识符,这意味着当你生成一个标识符时,理论上在任何其他时间点地球上任何其他人都无法创建相同的GUID。所以除了名称之外,每个COM对象(以及coclass和库等)都有一个GUID。

IDispatch是另一个基本接口,与IUnknown非常相似,但与每个COM对象所需的IUnknown不同,IDispatch是可选的,并提供许多但不是所有COM对象都支持的特殊功能。诸如支持certian语言功能以及使客户更容易使用对象之类的事情。大多数(可能)COM对象公开此接口。

关于COM库;是的,它们必须在Windows中注册。