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);

C#利用反射调用PB编译的COM组件的更多相关文章

  1. 利用反射--调用一个按钮的Click事件

    最基本的调用方法 (1)button1.PerformClick();(2)button1_Click(null,null);(3)button_Click(null,new EventArgs()) ...

  2. 利用反射调用方法时,处理ref,out参数需要注意的问题(转)

    转自:http://www.68idc.cn/help/buildlang/ask/20150318283817.html 项目中如下的泛型方法,因为要在运行时,动态指定类型参数,所以要利用反射来实现 ...

  3. java利用反射调用类的某个方法

    java利用反射机制 可以动态调用某个类的某个方法,在 扩展系统功能或提供对外接口时经常用的到. 代码如下: 打印类Print.java package com.test.reflct; /** * ...

  4. Spring利用反射调用接口

    首先在项目中使用java反射调用 //根据实例及参数名获得方法A Method method = event.getObj().getClass() .getMethod(event.getMetho ...

  5. C# 利用反射调用类下的方法

    namespace TestReflection { public partial class Form1 : Form { public Form1() { InitializeComponent( ...

  6. C#调用PB写的com组件dll

    背景 小编为了使用C#去模仿PB代码的加密算法,结果发现PB算法中,的long类型只有21亿,实际上传入的数值达到了78亿,造成了数据溢出,精度丢失的情况. 然而PB的算法已经使用C#不可以还原(C# ...

  7. 利用反射调用注解,模仿Spring

    简介 在开发中,我们经常用的就是利用@RequestMapping来调用我们自己的逻辑,现在我们来创建属于自己的注解模仿一下它. 1.新建属于自己的注解@SeayaMapping @Target({E ...

  8. java 利用反射调用静态方法的示例

    内容简介 主要介绍使用反射的机制来调用执行类中的静态方法. 静态方法 public class GisUtil { private final static Logger logger = Logge ...

  9. java工具类-接受请求参数,并利用反射调用方法

    public String a(HttpServletRequest request,HttpServletResponse response) throws JSONException, IOExc ...

随机推荐

  1. 数据库my.ini配置

    数据库my.ini配置 通过配置文件统一配置的目的:统一管理 服务端(mysqld) .客户端(client) 配置了 mysqld(服务端) 的编码为utf8,那么再创建的数据库,默认编码都采用 1 ...

  2. Matlab高级教程_第一篇:Matlab基础知识提炼_04

    第八节:几大MATLAB的数据类型 8.1 数值型 8.2 字符和字符串 创建用' ' 8.3 函数句柄 8.4 结构体 创建用. 语法:struct('field', var1,'field2',' ...

  3. 吴裕雄--天生自然 PYTHON3开发学习:面向对象

    class MyClass: """一个简单的类实例""" i = 12345 def f(self): return 'hello wor ...

  4. mysql数据库5.6.45安装后的配置(离线安装包版)

    二.windows10下的配置 (1) 环境变量配置 打开控制面板=>系统和安全=>系统=>高级系统设置,选择环境变量,在系统变量中找到path,编辑该选项. 第一行是oracle数 ...

  5. C/C++ memcpy函数的用法

    功能 memcpy指的是c和c++使用的内存拷贝函数,memcpy函数的功能是从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中 头文件 所在头文件 <s ...

  6. 如何将本地未提交的更改合并到另一个Git分支?

    如何在Git中执行以下操作? 我当前的分支是branch1,我做了一些本地更改. 但是,我现在意识到我实际上是要将这些更改应用于branch2. 有没有办法应用/合并这些更改,以便它们成为branch ...

  7. Laravel 操作指令

    php artisan migrate —path=database/migrations/v1 更新表数据 php artisan make:migration create_channels_ta ...

  8. StartDT AI Lab | 视觉智能引擎之算法模型加速

    通过StartDT AI Lab专栏之前多篇文章叙述,相信大家已经对计算机视觉技术及人工智能算法在奇点云AIOT战略中的支撑作用有了很好的理解.同样,这种业务牵引,技术覆盖的模式也收获了市场的良好反响 ...

  9. LeetCode No.127,128,129

    No.127 LadderLength 单词接龙 题目 给定两个单词(beginWord 和 endWord)和一个字典,找到从 beginWord 到 endWord 的最短转换序列的长度.转换需遵 ...

  10. 直击LG曲面OLED首发现场,高端品质更出众

    简直是太棒了,我可以去看LG曲面OLED电视新品发布会了.这可是LG向中国首次推出的曲面OLED电视.在网上我就已经看到其实曲面OLED电视已经在韩国.美国还有欧洲都上市了,听说现在反响还挺不错.真没 ...