zoukankan      html  css  js  c++  java
  • C#利用反射调用PB编译的COM组件

    C#利用反射调用(后期绑定)PB编译的COM组件

    C#调用COM组件可以在VS工程中直接添加引用,这种方式写起来很方便,但是当COM组件经常更新,这样处理起来倒不如后期绑定适用了。

    1.根据COM组件的ProgID,得到COM组件公开的类型

    Type comType = Type.GetTypeFromProgID(jmjkk.n_sys_sbjc);
    

    2.创建COM组件提供的类型的对象

    object comObj = System.Activator.CreateInstance(comType);
    

    3.调用执行方法

    类型和对象都用了,利用反射调用方法很简单,比如调用test方法,参数inParams:

    object[] args = new object[1];
    args[0] = 大专栏  C#利用反射调用PB编译的COM组件="n">inParams;
    Method method = comType.GetMethod(test);
    if (method != null){
        method.invoke(comObj, args);
    }
    
    

    然而,并没有这么顺利,method一直为null。 查找文档,发现.Net COM组件和非.Net COM组件得到的comType是不一样的,如果COM组件为.Net COM组件,上述反射调用方法没问题;如果COM组件是其它语言编写的,运行时得不到该COM类型的元数据,得到的comType将是所有未知类型COM组件的统一分装类型System.__ComObject,System.__ComObject类并不包含你想调用的组件的方法,所以comType.GetMethod(“method_name”)拿不到要给定名称的成员方法。

    正确姿势

    非.Net COM组件得到comType和comObj后,使用comType.InvokeMember方法。comType.InvokeMember方法详细可参考 MSDN中Type.InvokeMember 方法

    object[] args = new object[1];
    args[0] = inParams;
    object returnObj = comType.InvokeMember(test
    , BindingFlags.InvokeMethod
    , null
    , comObj
    , args);
    
    
  • 相关阅读:
    使用基本的socket函数
    ODBC、ADO
    MFC开发ActiveX控件的简介
    MFC线程
    系统API函数实现多线程及线程同步
    IP地址控件
    加速键
    属性页对话框
    Tab控件
    树控件
  • 原文地址:https://www.cnblogs.com/lijianming180/p/12302754.html
Copyright © 2011-2022 走看看