通过反射搜索COM对象成员
本文关键字:对象 成员 COM 搜索 反射 | 更新日期: 2023-09-27 17:55:00
我正在使用COM对象,我需要能够在运行时通过反射搜索属性和方法,并根据大致匹配COM对象结构的输入字符串调用它们。
我目前正在使用递归算法在运行时使用obj.GetType().InvokeMember()
来行走COM对象的属性,但这只有在我提供确切的属性和方法名称时才有效,情况并非总是如此。例子:
" ALPha.BETa.GAMma ?"-> var gamma = comObj.ALPha.BETa.GAMma;
"ALP.BET.GAM ?"-> var gamma = comObj.ALPha.BETa.GAMma;
"ALP.BET。gam200 " -> comObj.ALPha.BETa.GAMma = 200;
"α。" -> comObj.ALPha.DELta();
(如果有人熟悉SCPI,这就是我实际使用的——试图动态地将SCPI字符串转换为在运行时对COM对象API的调用)
杂散观察:
-
typeof(IComObject).GetProperties()
只返回先前在运行时评估的属性,这对我来说是无用的。 - 智能感知完全适用于COM对象的所有属性和方法。
- 调试器在运行时显示
comObj
的类型为System.__ComObject
。 - 我已经尝试在COM类型库exe上运行Tlbimp.exe以产生互操作程序集,但我看到与使用
GetProperties()
时相同的结果。 COM对象上至少有200个属性和方法,所以我无法手动建立映射。
详细说明@HansPassant注释,COM只是不做反射。后期绑定COM(通过IDispatch)是通过精确的字符串匹配完成的。最好的办法可能是自己解码类型库(我将从这个工具开始),然后手工构建从字符串到方法和属性的映射。(是的,您正在手动重新实现反射。)