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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:33:55