【发布时间】:2018-03-30 16:50:14
【问题描述】:
据我了解,COM 接口是 C++ 中的抽象类,但由于某种原因转换为 C# 接口。为什么必须在 C# 中声明接口的所有方法,即使不打算使用它的任何成员?以IFileOperation 为例,我尝试删除我验证过的函数声明,这些声明从未在我的代码中调用,但它会导致 System.AccessViolationException 被抛出。
【问题讨论】:
-
当您是调用者时(如使用 IFileOperation),您必须指定相同数量/布局的方法,但如果您不使用它,则不必定义所有方法的详细信息.另外,如果您使用的唯一方法是第 3 种方法,那么您可以定义没有 args 的 method1()、method2()(作为占位符),然后使用完全相同的签名定义真正的 method3。但是当有人打电话给你时(比如当你实现 IFileOperationProgressSink 时),那么你必须定义所有具有所有签名的方法。接口只是二进制合约。
-
第三个按什么顺序,按字母顺序排列?
-
不,名称只适用于人类。最后,接口只是一个指向方法的指针表。请记住:它都是二进制的,不像 .NET 带有命名空间或类名等。
-
我可以在 MSDN 上找到这些表吗,还是我必须深入挖掘?
-
它们在 Windows SDK 的 .idl 和/或 .h 中定义。例如:IFileOperation 在我的 PC 上的 C:\Program Files (x86)\Windows Kits\10\Include\10.0.15063.0\um\ShObjIdl_core.h 中。该表是方法列表(以及基本接口方法,包括 IUnknown 方法)。不要相信 MSDN,方法的顺序没有意义,它只是用于文档。
标签: c# c++ interface com com-interop