通过反射搜索 COM 对象成员
Search for COM object members via Reflection
我正在使用 COM 对象,我需要能够在运行时通过反射搜索属性和方法,并根据与 COM 对象结构大致匹配的输入字符串调用它们。
我目前正在使用递归算法在运行时使用 obj.GetType().InvokeMember()
遍历 COM 对象的属性,但这只有在我提供 exact 属性 和方法名称,但情况并非总是如此。示例:
"ALPha.BETa.GAMma?" -> var gamma = comObj.ALPha.BETa.GAMma;
"ALP.BET.GAM?" -> var gamma = comObj.ALPha.BETa.GAMma;
"ALP.BET.GAM 200" -> comObj.ALPha.BETa.GAMma = 200;
"ALPha.DELta" -> comObj.ALPha.DELta();
(如果有人熟悉 SCPI,这就是我实际使用的内容——尝试在运行时将 SCPI 字符串动态转换为对 COM 对象 API 的调用)
杂散观察:
typeof(IComObject).GetProperties()
只有 returns 之前在运行时评估过的属性,这对我来说没用。
- Intellisense 完全适用于 COM 对象的所有属性和方法。
- 调试器在运行时将
comObj
的类型显示为 System.__ComObject
。
- 我已经在 COM 类型库 exe 上尝试 运行 Tlbimp.exe 来生成互操作程序集,但是在使用
GetProperties()
.[=41= 时我看到了与以前相同的结果]
- COM 对象上至少有 200 个属性和方法,因此我无法手动建立映射。
为了扩展@HansPassant 的评论,COM 只是不进行反射。后期绑定 COM(通过 IDispatch)是通过精确的字符串匹配完成的。最好的办法可能是自己解码类型库(我会从 this tool 开始)并构建从字符串到方法和属性的手动映射。 (是的,您正在手动重新实现反射。)
我正在使用 COM 对象,我需要能够在运行时通过反射搜索属性和方法,并根据与 COM 对象结构大致匹配的输入字符串调用它们。
我目前正在使用递归算法在运行时使用 obj.GetType().InvokeMember()
遍历 COM 对象的属性,但这只有在我提供 exact 属性 和方法名称,但情况并非总是如此。示例:
"ALPha.BETa.GAMma?" -> var gamma = comObj.ALPha.BETa.GAMma;
"ALP.BET.GAM?" -> var gamma = comObj.ALPha.BETa.GAMma;
"ALP.BET.GAM 200" -> comObj.ALPha.BETa.GAMma = 200;
"ALPha.DELta" -> comObj.ALPha.DELta();
(如果有人熟悉 SCPI,这就是我实际使用的内容——尝试在运行时将 SCPI 字符串动态转换为对 COM 对象 API 的调用)
杂散观察:
typeof(IComObject).GetProperties()
只有 returns 之前在运行时评估过的属性,这对我来说没用。- Intellisense 完全适用于 COM 对象的所有属性和方法。
- 调试器在运行时将
comObj
的类型显示为System.__ComObject
。 - 我已经在 COM 类型库 exe 上尝试 运行 Tlbimp.exe 来生成互操作程序集,但是在使用
GetProperties()
.[=41= 时我看到了与以前相同的结果] - COM 对象上至少有 200 个属性和方法,因此我无法手动建立映射。
为了扩展@HansPassant 的评论,COM 只是不进行反射。后期绑定 COM(通过 IDispatch)是通过精确的字符串匹配完成的。最好的办法可能是自己解码类型库(我会从 this tool 开始)并构建从字符串到方法和属性的手动映射。 (是的,您正在手动重新实现反射。)