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. 2019CSP-J游记

    2019-10-19:开一个坑,今天初赛,我是我们考场唯一几个坚持到16:45收卷的人,我们是机试,竟然可以用编译器. 这次初赛总体感觉打得不错,卷面满分200,最后实际分数,就是卷面分除以二. 初赛 ...

  2. JavaScript学习笔记 - 入门篇(2)- 常用互动方法

    输出内容(document.write) document.write() 可用于直接向 HTML 输出流写内容.简单的说就是直接在网页中输出内容. 第一种:输出内容用""括起,直 ...

  3. tensorflow用法记录

    使用 embedding 变量 import tensorflow as tf import numpy as np sess = tf.InteractiveSession() M = list(' ...

  4. jQuery方法及使用

    jQuery内容: 选择器 筛选器 样式操作 文本操作 属性操作 文档处理 事件 动画效果 插件 each.data.Ajax 剩余未写的有: 1.表单筛选器: :text :password :fi ...

  5. uboot 编译

    . 解包u-boot源码包(u-boot-2016.07) . 配置交叉编译器 根据内核编译里的步骤配置 . 编译uboot yum install ncurses* // ncurses是个终端的图 ...

  6. 远程关机 (Windows shutdown Windows)

    在某些场景,可使用远程关机控制整个局域网中的所有电脑进行一键关机或重启,便于管理,以提高工作效率. 从远程系统强制关机,首先需要进行一些必要的设置. 1.使用 win + R 打开运行,输入gpedi ...

  7. C# 接口练习

    #define debug using System; using System.Collections; namespace ConsoleApp1 { interface IAnimal { in ...

  8. B - Sequence II (HDU 5147)

    Long long ago, there is a sequence A with length n. All numbers in this sequence is no smaller than ...

  9. 概率DP——BZOJ4008 [HNOI2015]亚瑟王

    [HNOI2015]亚瑟王 Description 小 K 不慎被 LL 邪教洗脑了,洗脑程度深到他甚至想要从亚瑟王邪教中脱坑.他决定,在脱坑之前,最后再来打一盘亚瑟王.既然是最后一战,就一定要打得漂 ...

  10. cesium初探之加载三维模型

    项目需要用到二三维地图切换,本来准备研究ArcGIS js for Web 3d,但考虑到版权的问题,决定试着用cesium来做,于是花了2天时间抱着试试看的心态把cesium从环境配置到加载三维模型 ...