【发布时间】: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