dynamic obj = Marshal.GetActiveObject("Excel.Application");
obj.Workbooks.Add();
object obj1 = Marshal.GetActiveObject("FancySoft.Application");
object obj2 = obj1.GetType().InvokeMember("FancyProperty", BindingFlags.GetProperty, null, obj1, null);
this this this the the:
:System.Runtime.InteropServices.COMException: 'Error HRESULT E_FAIL has been returned from a call to a COM component.'
最终,如果我在我的项目中添加了FancySoft的COM引用,则可以按预期进行工作:
dynamic obj1 = Marshal.GetActiveObject("FancySoft.Application");
object obj2 = obj1.FancyProperty;
我找到了一个有趣的讨论线程,该线程表明供应商可以故意限制客户端应用程序中dynamic
关键字的使用。 在我的情况下,供应商甚至没有正式支持基于.NET的自动化方案(尽管这是我们行业中的常见场景),所以我不能要求他们提供这种信息。您在其他地方看到了这种行为吗? 我想念什么吗? 有什么办法可以在不询问供应商的情况下确认这种行为是故意的? (通过查看.tlb文件,使用一些反射技巧等等。
供应商在最近的版本中(至少部分)固定其COM实现:
var obj1 = (Application) Marshal.GetActiveObject("FancySoft.Application");
var obj2 = obj1.FancyProperty;