【发布时间】:2014-01-24 13:11:08
【问题描述】:
为什么 dynamic 对象不能在 NameTranslate COM 对象上调用这些方法,而反射可以?
使用动态的失败示例:
Type ntt = Type.GetTypeFromProgID("NameTranslate");
dynamic nto = Activator.CreateInstance(ntt);
nto.Init(3,null)
第三行失败,出现 NotImplementedException 和消息方法或操作未实现。
使用不同 COM 对象(WScript.Shell 和 SendKeys)的类似尝试:
Type shellType = Type.GetTypeFromProgID("WScript.Shell");
dynamic shell = Activator.CreateInstance(shellType);
shell.SendKeys("abc");
回到第一个示例。如果我使用反射并使用InvokeMethod 方法调用方法,则一切正常。
使用反射的工作示例:
Type ntt = Type.GetTypeFromProgID("NameTranslate");
object nto = Activator.CreateInstance(ntt);
object[] initParams = new object[]{3,null};
ntt.InvokeMember("Init", BindingFlags.InvokeMethod, null, nto, initParams);
我相信这一定与 COM 对象的创建或标记方式有关 - 但在我的一生中,我在文档、对象浏览器或注册表中看不到任何指示这些 COM 对象及其子对象的内容/函数被标记为私有或其他通常会抛出 dynamic 关键字的东西。
MSDN 上的NameTranslate 文档:http://msdn.microsoft.com/en-us/library/windows/desktop/aa706046.aspx
【问题讨论】:
-
尝试两种技术,只有第二个参数不是
null-nto.Init(3,<somethig>) -
第二个参数是什么似乎并不重要——NotImplementedException 是一样的。根据文档,当第一个参数
lnInitType为 3 (ADS_NAME_INITTYPE_GC) 时,无论如何都会忽略该参数。 -
有趣的是,
NameTranslate方法都不能通过dynamic调用。 -
我想,发生的情况是,当输入某些参数时,
NameTranslate某处的某个私有方法甚至case被调用,但未实现并引发异常。
标签: c# dynamic reflection com