【问题标题】:Search for COM object members via Reflection通过反射搜索 COM 对象成员
【发布时间】:2016-07-05 22:11:04
【问题描述】:

我正在使用 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() 只返回之前在运行时评估过的属性,这对我来说没用。
  • Intellisense 完全可用于 COM 对象上的所有属性和方法。
  • 调试器在运行时将comObj 的类型显示为System.__ComObject
  • 我尝试在 COM 类型库 exe 上运行 Tlbimp.exe 以生成互操作程序集,但在使用 GetProperties() 时看到的结果与以前相同。
  • COM 对象上至少有 200 个属性和方法,因此我无法手动构建映射。

【问题讨论】:

  • 反射是 .NET 的一个特性,而不是 COM。这就是它结束的地方。该产品具有严重无法使用的命名约定,POWer.LEVel.IMMediate.AMPLitude 实在是太奇怪了。但这种疯狂可能有一些押韵,大写字母一个接一个,直到它停止抱怨。
  • Visual Studio 如何在编译时知道 COM 对象的成员以填充 Intellisense?难道我不应该有某种方法来复制这种行为,以便在运行时使用反射枚举和搜索成员吗?
  • 请详细说明语句 “我尝试在 COM 类型库 exe 上运行 Tlbimp.exe 以生成互操作程序集,但在使用 GetProperties() 时我看到的结果与以前相同” ,你在哪里调用 tlbimp.exe 生成的程序集?
  • COM 类型库作为 exe 的一部分分发。我在该 exe 上使用了 Tlbimp.exe 来创建互操作程序集。在 Visual Studio 中,我添加了对这个新的互操作程序集的引用,而不是使用常规的 COM 类型库引用。据我了解,VS 会自动从 COM 类型库创建一个程序集并将其输出到 /obj/Debug 文件夹中,这样就可以解释为什么我认为两者没有区别,因为它们是相同的?

标签: c# .net reflection com


【解决方案1】:

为了扩展@HansPassant 评论,COM 只是不进行反射。后期绑定 COM(通过 IDispatch)是通过精确的字符串匹配完成的。可能你最好的选择是自己解码类型库(我会从this tool 开始)并构建从字符串到方法和属性的手动映射。 (是的,您正在手动重新实现反射。)

【讨论】:

  • 不是我希望的答案,因为它为我增加了很多额外的工作,但感谢您提供的信息。
猜你喜欢
  • 1970-01-01
  • 2012-05-23
  • 2023-04-05
  • 2013-11-09
  • 2016-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-18
相关资源
最近更新 更多