Type.InvokeMember调用失败报DISP_E_MEMBERNOTFOUND错误求助
解决Scripting.Dictionary晚期绑定调用DISP_E_MEMBERNOTFOUND的问题
我太懂这种踩坑的感觉了——这种错误在COM晚期绑定里简直是高频问题,核心原因几乎都是绑定标志(BindingFlags)设置不对,或者把COM属性和方法的调用方式搞混了。
问题根源拆解
Scripting.Dictionary是标准的COM对象,.NET通过晚期绑定调用它时,必须严格区分「调用方法」和「获取/设置属性」,并搭配对应的BindingFlags。比如你想获取Count属性,却误用了InvokeMethod的标志,.NET就会认为你在找一个叫Count的方法,自然会抛出「找不到成员」的错误。
修正后的可运行示例
我给你补全并修正了你的最小复现代码,包含添加键值对和获取Count属性的正确调用逻辑:
using System; using System.Reflection; class Program { static void Main(string[] args) { // 获取Scripting.Dictionary的COM类型 Type dictType = Type.GetTypeFromProgID("Scripting.Dictionary"); // 创建COM对象实例 object dictObj = Activator.CreateInstance(dictType); // 1. 调用Add方法添加键值对 // 必须指定InvokeMethod绑定标志,同时包含公共实例成员的范围 dictType.InvokeMember( "Add", BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.Instance, null, dictObj, new object[] { "demoKey", "demoValue" } // Add方法需要键、值两个参数 ); // 2. 获取Count属性的值 // 这里要用GetProperty标志,而非InvokeMethod int itemCount = (int)dictType.InvokeMember( "Count", BindingFlags.GetProperty | BindingFlags.Public | BindingFlags.Instance, null, dictObj, null // 属性获取不需要传入参数 ); Console.WriteLine($"Dictionary中的项数:{itemCount}"); } }
关键注意事项
- 绑定标志必须匹配操作类型:
- 调用方法:用
BindingFlags.InvokeMethod - 获取属性:用
BindingFlags.GetProperty - 设置属性:用
BindingFlags.SetProperty - 所有操作都要加上
BindingFlags.Public | BindingFlags.Instance,明确访问的是COM对象的公共实例成员
- 调用方法:用
- 参数要严格匹配:比如
Add方法必须传入两个参数(键和值),少传、多传或类型不匹配,COM也会把这类错误归类为「找不到成员」 - 虽然COM本身不区分大小写,但.NET的
InvokeMember会严格匹配成员名称的大小写,尽量和官方文档里的名称保持一致(比如用Count而非count)
内容的提问来源于stack exchange,提问作者S Meaden
相关产品推荐
相关产品推荐

