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

时间:2019-03-15 22:22:16

标签: c# com kinect

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

  

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

     

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

我的代码如下所示,其中srcMicrosoft.Kinect.ColorCameraSettings,而propName = "Brightness"的等价物:

var prop = src.GetType().GetProperty(propName);
if (prop != null)
{
    return prop.GetValue(src, null);
}

我还尝试了所谓的更友好的COM方法,但存在相同的问题:

return src.GetType().InvokeMember(propName, System.Reflection.BindingFlags.GetProperty, null, src, null);

最有趣的是,没有任何迹象表明src是COM对象: src.GetType().IsCOMObject返回false

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

   at System.StubHelpers.StubHelpers.GetCOMIPFromRCW(Object objSrc, IntPtr pCPCMD, IntPtr& ppTarget, Boolean& pfNeedsRelease)
   at Microsoft.Kinect.Interop.INuiColorCameraSettings.GetBrightness(Double& pBrightness)
   at Microsoft.Kinect.NuiColorCameraSettings.GetBrightness()
   at Microsoft.Kinect.ColorCameraSettings.get_Brightness()

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

编辑:这是引发异常时“线程”窗口的外观 enter image description here


EDIT:被用来更新它。解决方案是在正确的线程上运行代码,在这种情况下,该线程是线程池中的工作程序。只需用Task.Run()包装呼叫就可以了。这个异常(至少对我而言)不是很清楚根本原因。

2 个答案:

答案 0 :(得分:0)

过去曾表示要对此进行更新。解决方案是在正确的线程上运行代码,在这种情况下,该线程是线程池中的工作程序。只需使用Task.Run()包装调用即可很好地工作。至少对于我而言,例外是不清楚的。

答案 1 :(得分:0)

我也在努力获取System .__ ComObject的属性值。 最初,ComObject是具有一些属性的Java对象。 GetType()解决方案不适用于我,因此我进行了更多搜索,发现TypeDescriptor非常有用且舒适。

根据您的设置,我认为应该是:

autodata

希望它能对某人有所帮助。