You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET中如何将COM DISPID转换为MemberID?

问题描述

我持有来自mscoree.dll的System.Collections.ArrayList(CLSID为{6896b49d-7afb-34dc-934e-5add38eeee39})及其TypeLib。该TypeLib中co-class IList的Add方法的MEMBERID为0x60020002。

通过GetIDsOfNames验证发现,同一Add方法的DISPID(0x60020020)与MEMBERID不同(最后两位有差异)。

当前需求是仅通过DISPID和调度接口获取成员名称:调用GetNames传入DISPID无结果,但传入MEMBERID可得到预期的"Add";同时无法通过解析TypeLib获取成员名,因为二者不相等。

请问如何将DISPID转换为MEMBERID?或者是否可直接通过DISPID获取成员名称?

2022-08-16 更新

补充示例说明:

  • 持有IDispatch接口,调用GetIDsOfNames传入"Add",结果为0x60020020。
  • 调用以下流程获取类信息:
    IDispatch -> QueryInterface(IID_IProvideClassInfo) -> GetClassInfo(...) -> GetTypeAttr(...) -> guid
    得到的GUID为:CLSID_System.Collections.ArrayList {6896B49D-7AFB-34DC-934E-5ADD38EEEE39}
  • 打开OLE/COM对象查看器,发现ArrayList是包含6个接口的coclass,其中仅IList接口的Add方法Id为0x60020002(最后两位与上述结果不同)。

我预期此处的Id应与GetIDsOfNames的结果0x60020020一致,但实际不符。此外,查询Contains和Clear方法的Id时,得到的是0x60020021和0x60020022,而非TypeLib中的0x60020003和0x60020004。

请问我哪里出错了?

附:我检查了mscorlib.tlb和mscoree.tlb,二者中Add方法的Id均为0x60020002。


内容的提问来源于stack exchange,提问作者Krio

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 15:03:52