获取CLR对象属性引发无法转换类型为'System .__ ComObject'的COM对象

问题描述 投票:0回答:1

我试图通过反射获取属性的值,但最终得到以下异常:

System.Reflection.TargetInvocationException:'调用目标已抛出异常。'

内部异常:InvalidCastException:无法将类型为“System .__ ComObject”的COM对象强制转换为接口类型“Microsoft.Kinect.Interop.INuiColorCameraSettings”。此操作失败,因为对IID为“{00A4B392-E315-470C-90B7-F7B4C3CE00C4}”的接口的COM组件的QueryInterface调用由于以下错误而失败:不支持此类接口(HRESULT异常:0x80004002(E_NOINTERFACE)) 。

我的代码如下所示,其中qazxsw poi是qazxsw poi和qazxsw poi的一个实例:

src

我也尝试了所谓的更友好的方法,但有同样的问题:

Microsoft.Kinect.ColorCameraSettings

最有趣的是,没有任何迹象表明propName = "Brightness"是一个COM对象:var prop = src.GetType().GetProperty(propName); if (prop != null) { return prop.GetValue(src, null); } 返回return src.GetType().InvokeMember(propName, System.Reflection.BindingFlags.GetProperty, null, src, null);

但是从内部异常堆栈跟踪看来,src对象在内部与COM对象进行交互。

src

如何在运行时通过反射获取此属性的值?

编辑:以下是抛出异常时线程窗口的样子src.GetType().IsCOMObject


编辑:意思是更新这个。这里的解决方案是在正确的线程上运行代码,在这种情况下,线程是来自线程池的工作者。简单地用false包裹这个电话效果很好。例外(至少对我来说)不明确的根本原因。

c# com kinect
1个回答
0
投票

有意更新此内容。这里的解决方案是在正确的线程上运行代码,在这种情况下,线程是来自线程池的工作者。使用Task.Run()简单地包装调用效果很好。例外(至少对我来说)不明确的根本原因。

© www.soinside.com 2019 - 2024. All rights reserved.