通过反射搜索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个属性和方法,所以我无法手动建立映射。

通过反射搜索COM对象成员

详细说明@HansPassant注释,COM只是不做反射。后期绑定COM(通过IDispatch)是通过精确的字符串匹配完成的。最好的办法可能是自己解码类型库(我将从这个工具开始),然后手工构建从字符串到方法和属性的映射。(是的,您正在手动重新实现反射。)

相关文章: