2013-03-12 48 views
0

例如,IWebBrowser2基本上是最初为IE设计的COM接口。但是在Microsoft.ShDocVw.dll的.NET中定义了相同的接口,可以直接在.NET程序中使用它。对于类型如IUnknown,IInternetSecurityManager,IObjectSafety,IObjectWithSite等,是否有一个汇编程序可以导出.NET接口。我不想重新定义程序中的现有接口。如果我这样做,他们将来可能会引发冲突。如何确定是否存在由Microsoft定义的用于现有Microsoft COM接口的.NET接口

所以,问题是,微软的.NET程序集定义了这些COM接口?

+1

我很确定任何已正确注册的COM对象都可以在.NET下使用...... – Goz 2013-03-12 18:14:06

+0

MSDN .NET函数引用似乎没有.NET版本的IUnknown。 – dattebayo 2013-03-12 18:21:46

+0

实际上无法在.NET中定义IUnknown。根据您使用[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)],[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]还是[InterfaceType(ComInterfaceType.InterfaceIsDual)],您在.NET中定义的每个接口都根据IUnknown或IDispatch派生。 关于你的其他查询 - 我没有一个MSDN参考,因为我多年前了解这个东西,这不是你真的需要引用回。我可能会发现一些信息并将其发回。 – 2013-03-12 18:52:42

回答

0

COM接口的大多数消费者,包括Microsoft代码在内,都定义了他们自己对这些接口的私有定义。既然他们是私人的,即使你想要,你也不能使用他们。只要你自己没有实现接口,那么就永远不会造成任何冲突或问题。如果你自己实现了一个COM接口,并且你期望你将从.NET代码中被调用,那么你只需要使用与调用者使用的接口相同的定义。

+0

有没有一个MSDN博客谈这个? – dattebayo 2013-03-12 18:23:40

+0

http://msdn.microsoft.com/en-us/library/aa645712(v=vs.71).aspx可能是一个很好的开始 – Joel 2013-03-12 19:02:45

+0

另请参见:http://www.devx.com/dotnet/文章/ 42590如果您使用VS2010或2012 – Joel 2013-03-12 19:04:40

3

但是同样的接口在.NET

定义它是在.NET不定义。你通过添加对shdocvw.dll的引用来获得它。 Visual Studio读取嵌入在该DLL中的类型库并从中生成interop库。 Tlbimp.exe的作用与此相同。这是COM互操作如何在基本级别上工作。

一些 COM接口类型已在.NET框架程序集中声明,其中大多数在System.Runtime.InteropServices.ComTypes命名空间中。 .NET本身需要完成的东西非常基本。它们记录在MSDN中,因此它不需要但是快速的MSDN搜索来找回它们。还有一些是内部,只是在那里使.NET包装类工作,你只能用Reference Source或反编译器找回它们。除了复制/粘贴之外,其他用处不大

自己声明COM接口类型是一个危险的冒险,应该始终避免。小错误会导致运行时错误非常难以诊断并且很难诊断。或者没有错误,最糟糕的一种。当你有一个类型库时,总是喜欢导入一个类型库,就像你使用shdocvw.dll一样。类型库旨在避免错误。如果您没有类型库,那么Google搜索代码是下一个最佳选择。然后当然在问这个问题。

+0

我可以在仅显示.NET IL的ILDasm.exe中打开SHDocVW.dll。这是否意味着,ILDasm正在从SHDocVW.dll读取类型库导出并生成一个IL代码? – dattebayo 2013-03-12 19:03:23

+1

这是不可能的,c:\ windows \ system32 \ shdocvw.dll是一个纯粹的非托管DLL。 Ildasm.exe会抱怨它没有有效的CLR标头。你interop.shdocvw.dll打开,互操作的图书馆,这是自动生成的从类型库。没有代码,只有声明。与类型库中的声明完全相同,但转换为.NET元数据格式。 – 2013-03-12 19:06:00

+0

所以,这本机库定义的IUnknown接口? – dattebayo 2013-03-12 19:31:57

相关问题