Visual Studio 类型库导入器追逐类型库依赖关系的原因是收集类型信息以映射到 .NET。
类型库没有直接的依赖信息。所以这是一个非常好的问题:如何跟踪类型库依赖关系?
检测类型库依赖关系的唯一可行方法是引用声明声明类型库的类型。
例如,如果您的类型库在方法的签名中引用IXMLDOMDocument,它将被记录在类型信息记录中。
您可以爬取类型库,方法是加载一个类型库,从中获取 ITypeLib 并递归枚举 ITypeInfos。
您最终会看到这条记录。然后,您可以通过ITypeInfo::GetContainingTypeLib 获取该类型的包含类型库ID。如果它引用了另一个类型库,那么你找到了一个依赖项。
爬虫可能会一直跟踪依赖关系,直到没有更多类型库要加载。
您不必爬取每个类型库的每个类型来找到严格必要的类型集,但是类型库导入器的工作是将类型库信息镜像到 .NET 类型信息和元数据程序集,因此它完全导入类型库。它更易于实现、解释/理解它在做什么,并且输出可在根类型库的上下文之外重用。
如果您不使用早期绑定,您的类型库将改为提及IDispatch、IUnknown 和/或VARIANT,这将导致无法检测到任何依赖关系。
您可以在孤立的应用程序中使用免注册 COM 来整理依赖关系,但它仍然不必是正确的依赖关系树,例如您可以在一个清单中声明所有依赖项。
记住那个类型库!= DLL。类型库可以作为资源嵌入到 DLL 或它自己的 TLB 文件中。
所以,整个讨论都是关于 type 依赖项,而不是 class/component 或其他运行时依赖项。