0

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

那么,问题是,哪些 Microsoft 的 .NET 程序集定义了这些 COM 接口?

4

2 回答 2

3

但是在.NET中定义了相同的接口

没有在 .NET 中定义。您可以通过添加对 shdocvw.dll 的引用来获得它。Visual Studio 读取嵌入在该 DLL 中的类型库并从中生成互操作库。与 Tlbimp.exe 所做的相同。这就是 COM 互操作在基本级别上的工作方式。

.NET 框架程序集中已经声明了一些COM接口类型,其中大部分在 System.Runtime.InteropServices.ComTypes 命名空间中。.NET 本身完成工作所需的非常基本的那些。它们记录在 MSDN 中,因此只需快速 MSDN 搜索即可找到它们。还有一堆是internal的,只是为了让 .NET 包装类工作,你只能通过 Reference Source 或反编译器找到它们。除了复制/粘贴之外没有其他用处。

自己声明 COM 接口类型是一种危险的冒险,应始终避免。小错误会导致非常严重且难以诊断的运行时错误。或者没有错误,最糟糕的一种。当你有一个类型库时,总是倾向于导入一个类型库,就像你对 shdocvw.dll 所做的那样。类型库旨在避免错误。如果您没有类型库,那么谷歌搜索代码是下一个最佳选择。当然是在 SO 上询问它。

于 2013-03-12T18:35:03.380 回答
0

COM 接口的大多数消费者,包括在 Microsoft 代码中,都为这些接口定义了自己的私有定义。由于它们是私有的,因此即使您愿意也无法使用它们。只要您不自己实现接口,就不可能导致任何冲突或问题。如果您自己实现了一个 COM 接口,并且您希望从 .NET 代码中调用您,那么并且只有这样您才需要使用调用者正在使用的接口的相同定义。

于 2013-03-12T18:17:17.493 回答