指出com对象到C#'动态'变量

问题描述 投票:0回答:0
this this Works:

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;

关键字现在可以按预期工作。调试com对象时动态视图也是如此。

c# dynamic com
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.